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