Merge "Make nova resources available based on os-api ext"
This commit is contained in:
@@ -58,12 +58,6 @@ class NovaClientPlugin(client_plugin.ClientPlugin):
|
||||
|
||||
service_types = [COMPUTE] = ['compute']
|
||||
|
||||
EXTENSIONS = (
|
||||
OS_INTERFACE_EXTENSION
|
||||
) = (
|
||||
"OSInterface"
|
||||
)
|
||||
|
||||
def _create(self):
|
||||
endpoint_type = self._get_client_option('nova', 'endpoint_type')
|
||||
management_url = self.url_for(service_type=self.COMPUTE,
|
||||
@@ -662,10 +656,10 @@ echo -e '%s\tALL=(ALL)\tNOPASSWD: ALL' >> /etc/sudoers
|
||||
else:
|
||||
return False
|
||||
|
||||
def _has_extension(self, extension_name):
|
||||
def has_extension(self, alias):
|
||||
"""Check if extension is present."""
|
||||
extensions = self.client().list_extensions.show_all()
|
||||
return extension_name in [extension.name for extension in extensions]
|
||||
return alias in [extension.alias for extension in extensions]
|
||||
|
||||
|
||||
class ServerConstraint(constraints.BaseCustomConstraint):
|
||||
|
||||
@@ -49,6 +49,8 @@ class NovaFlavor(resource.Resource):
|
||||
|
||||
default_client_name = 'nova'
|
||||
|
||||
required_service_extension = 'os-flavor-manage'
|
||||
|
||||
entity = 'flavors'
|
||||
|
||||
PROPERTIES = (
|
||||
|
||||
@@ -29,6 +29,8 @@ LOG = logging.getLogger(__name__)
|
||||
class NovaFloatingIp(resource.Resource):
|
||||
support_status = support.SupportStatus(version='2014.1')
|
||||
|
||||
required_service_extension = 'os-floating-ips'
|
||||
|
||||
PROPERTIES = (POOL,) = ('pool',)
|
||||
|
||||
ATTRIBUTES = (
|
||||
|
||||
@@ -35,6 +35,8 @@ class KeyPair(resource.Resource):
|
||||
|
||||
support_status = support.SupportStatus(version='2014.1')
|
||||
|
||||
required_service_extension = 'os-keypairs'
|
||||
|
||||
PROPERTIES = (
|
||||
NAME, SAVE_PRIVATE_KEY, PUBLIC_KEY,
|
||||
) = (
|
||||
|
||||
@@ -26,6 +26,8 @@ class ServerGroup(resource.Resource):
|
||||
|
||||
entity = 'server_groups'
|
||||
|
||||
required_service_extension = 'os-server-groups'
|
||||
|
||||
PROPERTIES = (
|
||||
NAME, POLICIES
|
||||
) = (
|
||||
|
||||
@@ -182,11 +182,10 @@ class ServerNetworkMixin(object):
|
||||
if not self.is_using_neutron():
|
||||
return
|
||||
|
||||
# check if OSInterface extension is installed on this cloud. If it's
|
||||
# not, then novaclient's interface_list method cannot be used to get
|
||||
# the list of interfaces.
|
||||
if not self.client_plugin()._has_extension(
|
||||
self.client_plugin().OS_INTERFACE_EXTENSION):
|
||||
# check if os-attach-interfaces extension is available on this cloud.
|
||||
# If it's not, then novaclient's interface_list method cannot be used
|
||||
# to get the list of interfaces.
|
||||
if not self.client_plugin().has_extension('os-attach-interfaces'):
|
||||
return
|
||||
|
||||
server = self.client().servers.get(self.resource_id)
|
||||
|
||||
@@ -581,26 +581,25 @@ class ConsoleUrlsTest(common.HeatTestCase):
|
||||
class NovaClientPluginExtensionsTests(NovaClientPluginTestCase):
|
||||
"""Tests for extensions in novaclient."""
|
||||
|
||||
def test_defines_required_extension_names(self):
|
||||
self.assertEqual(self.nova_plugin.OS_INTERFACE_EXTENSION,
|
||||
"OSInterface")
|
||||
|
||||
def test_has_no_extensions(self):
|
||||
self.nova_client.list_extensions.show_all.return_value = []
|
||||
self.assertFalse(self.nova_plugin._has_extension("OSInterface"))
|
||||
self.assertFalse(self.nova_plugin.has_extension(
|
||||
"os-virtual-interfaces"))
|
||||
|
||||
def test_has_no_interface_extensions(self):
|
||||
mock_extension = mock.Mock()
|
||||
p = mock.PropertyMock(return_value='notOSInterface')
|
||||
type(mock_extension).name = p
|
||||
p = mock.PropertyMock(return_value='os-xxxx')
|
||||
type(mock_extension).alias = p
|
||||
self.nova_client.list_extensions.show_all.return_value = [
|
||||
mock_extension]
|
||||
self.assertFalse(self.nova_plugin._has_extension("OSInterface"))
|
||||
self.assertFalse(self.nova_plugin.has_extension(
|
||||
"os-virtual-interfaces"))
|
||||
|
||||
def test_has_os_interface_extension(self):
|
||||
mock_extension = mock.Mock()
|
||||
p = mock.PropertyMock(return_value='OSInterface')
|
||||
type(mock_extension).name = p
|
||||
p = mock.PropertyMock(return_value='os-virtual-interfaces')
|
||||
type(mock_extension).alias = p
|
||||
self.nova_client.list_extensions.show_all.return_value = [
|
||||
mock_extension]
|
||||
self.assertTrue(self.nova_plugin._has_extension("OSInterface"))
|
||||
self.assertTrue(self.nova_plugin.has_extension(
|
||||
"os-virtual-interfaces"))
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
import mock
|
||||
|
||||
from heat.engine.clients.os import nova as novac
|
||||
from heat.engine.resources.openstack.nova import nova_flavor
|
||||
from heat.engine import stack
|
||||
from heat.engine import template
|
||||
@@ -41,7 +42,8 @@ flavor_template = {
|
||||
class NovaFlavorTest(common.HeatTestCase):
|
||||
def setUp(self):
|
||||
super(NovaFlavorTest, self).setUp()
|
||||
|
||||
self.patchobject(novac.NovaClientPlugin, 'has_extension',
|
||||
return_value=True)
|
||||
self.ctx = utils.dummy_context()
|
||||
|
||||
self.stack = stack.Stack(
|
||||
|
||||
@@ -72,6 +72,8 @@ class NovaFloatingIPTest(common.HeatTestCase):
|
||||
self.m.StubOutWithMock(self.novaclient.servers, 'remove_floating_ip')
|
||||
self.patchobject(nova.NovaClientPlugin, 'get_server',
|
||||
return_value=mock.MagicMock())
|
||||
self.patchobject(nova.NovaClientPlugin, 'has_extension',
|
||||
return_value=True)
|
||||
|
||||
def _make_obj(self, **kwargs):
|
||||
mock = self.m.CreateMockAnything()
|
||||
|
||||
@@ -44,6 +44,8 @@ class NovaKeyPairTest(common.HeatTestCase):
|
||||
self.fake_nova = self.m.CreateMockAnything()
|
||||
self.fake_keypairs = self.m.CreateMockAnything()
|
||||
self.fake_nova.keypairs = self.fake_keypairs
|
||||
self.patchobject(nova.NovaClientPlugin, 'has_extension',
|
||||
return_value=True)
|
||||
|
||||
def _mock_key(self, name, pub=None, priv=None):
|
||||
mkey = self.m.CreateMockAnything()
|
||||
|
||||
@@ -16,6 +16,7 @@ import json
|
||||
import mock
|
||||
|
||||
from heat.common import template_format
|
||||
from heat.engine.clients.os import nova
|
||||
from heat.engine import scheduler
|
||||
from heat.tests import common
|
||||
from heat.tests import utils
|
||||
@@ -43,6 +44,8 @@ class FakeGroup(object):
|
||||
class NovaServerGroupTest(common.HeatTestCase):
|
||||
def setUp(self):
|
||||
super(NovaServerGroupTest, self).setUp()
|
||||
self.patchobject(nova.NovaClientPlugin, 'has_extension',
|
||||
return_value=True)
|
||||
|
||||
def _init_template(self, sg_template):
|
||||
template = template_format.parse(json.dumps(sg_template))
|
||||
|
||||
@@ -1224,6 +1224,8 @@ class ServersTest(common.HeatTestCase):
|
||||
}
|
||||
}
|
||||
'''
|
||||
self.patchobject(nova.NovaClientPlugin, 'has_extension',
|
||||
return_value=True)
|
||||
t = template_format.parse(nova_keypair_template)
|
||||
templ = template.Template(t)
|
||||
stack = parser.Stack(utils.dummy_context(), stack_name, templ,
|
||||
@@ -4376,7 +4378,7 @@ class ServerInternalPortTest(common.HeatTestCase):
|
||||
server.client = mock.Mock()
|
||||
server.client().servers.get.return_value = Fake()
|
||||
server.client_plugin = mock.Mock()
|
||||
server.client_plugin()._has_extension.return_value = False
|
||||
server.client_plugin().has_extension.return_value = False
|
||||
|
||||
server._data = {"internal_ports": '[{"id": "1122"}]',
|
||||
"external_ports": '[{"id": "3344"},{"id": "5566"}]'}
|
||||
|
||||
Reference in New Issue
Block a user