Merge "Make nova resources available based on os-api ext"

This commit is contained in:
Jenkins
2015-11-11 07:50:59 +00:00
committed by Gerrit Code Review
12 changed files with 37 additions and 26 deletions

View File

@@ -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):

View File

@@ -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 = (

View File

@@ -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 = (

View File

@@ -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,
) = ( ) = (

View File

@@ -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
) = ( ) = (

View File

@@ -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)

View File

@@ -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"))

View File

@@ -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(

View File

@@ -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()

View File

@@ -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()

View File

@@ -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))

View File

@@ -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"}]'}