From 3cbf64703e3732e6881f3ff3c29bf83e744c8a10 Mon Sep 17 00:00:00 2001 From: Dmitriy Uvarenkov Date: Thu, 3 Mar 2016 20:05:44 +0200 Subject: [PATCH] Handle network names in Manila resources Added network names resolving. Change-Id: I037deaf27caf2fbd2808b9e55fa91e83c4d17a83 --- .../openstack/manila/share_network.py | 34 ++++++++++++++ .../openstack/manila/test_share_network.py | 46 ++++++++++++++++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/heat/engine/resources/openstack/manila/share_network.py b/heat/engine/resources/openstack/manila/share_network.py index 3d0b2daa39..2b5d98b866 100644 --- a/heat/engine/resources/openstack/manila/share_network.py +++ b/heat/engine/resources/openstack/manila/share_network.py @@ -18,6 +18,7 @@ from heat.engine import constraints from heat.engine import properties from heat.engine import resource from heat.engine import support +from heat.engine import translation class ManilaShareNetwork(resource.Resource): @@ -127,6 +128,39 @@ class ManilaShareNetwork(resource.Resource): raise exception.ResourcePropertyConflict(self.NEUTRON_SUBNET, self.NOVA_NETWORK) + def translation_rules(self, props): + if self.is_using_neutron(): + translation_rules = [ + translation.TranslationRule( + props, + translation.TranslationRule.RESOLVE, + [self.NEUTRON_NETWORK], + client_plugin=self.client_plugin('neutron'), + finder='find_resourceid_by_name_or_id', + entity='network' + ), + translation.TranslationRule( + props, + translation.TranslationRule.RESOLVE, + [self.NEUTRON_SUBNET], + client_plugin=self.client_plugin('neutron'), + finder='find_resourceid_by_name_or_id', + entity='subnet' + ) + ] + else: + translation_rules = [ + translation.TranslationRule( + props, + translation.TranslationRule.RESOLVE, + [self.NOVA_NETWORK], + client_plugin=self.client_plugin('nova'), + finder='get_nova_network_id' + ) + ] + + return translation_rules + def handle_create(self): network = self.client().share_networks.create( name=self.properties[self.NAME], diff --git a/heat/tests/openstack/manila/test_share_network.py b/heat/tests/openstack/manila/test_share_network.py index 1e037642ab..bb0d4cb0e5 100644 --- a/heat/tests/openstack/manila/test_share_network.py +++ b/heat/tests/openstack/manila/test_share_network.py @@ -47,6 +47,11 @@ class DummyShareNetwork(object): self.network_type = '6' +class ShareNetworkWithNova(share_network.ManilaShareNetwork): + def is_using_neutron(self): + return False + + class ManilaShareNetworkTest(common.HeatTestCase): def setUp(self): @@ -63,14 +68,32 @@ class ManilaShareNetworkTest(common.HeatTestCase): self.patchobject(share_network.ManilaShareNetwork, 'client', return_value=self.client) self.client_plugin = mock.Mock() + + def resolve_neutron(resource_type, name): + return name + + def resolve_nova(name): + return name + + self.client_plugin.find_resourceid_by_name_or_id.side_effect = ( + resolve_neutron + ) + + self.client_plugin.get_nova_network_id.side_effect = ( + resolve_nova + ) + self.patchobject(share_network.ManilaShareNetwork, 'client_plugin', return_value=self.client_plugin) self.stub_NetworkConstraint_validate() self.stub_NovaNetworkConstraint() self.stub_SubnetConstraint_validate() - def _create_network(self, name, snippet, stack): - net = share_network.ManilaShareNetwork(name, snippet, stack) + def _create_network(self, name, snippet, stack, use_neutron=True): + if not use_neutron: + net = ShareNetworkWithNova(name, snippet, stack) + else: + net = share_network.ManilaShareNetwork(name, snippet, stack) self.client.share_networks.create.return_value = DummyShareNetwork() self.client.share_networks.get.return_value = DummyShareNetwork() @@ -99,6 +122,25 @@ class ManilaShareNetworkTest(common.HeatTestCase): calls, any_order=True) self.assertEqual('share_networks', net.entity) + def test_create_with_nova(self): + t = template_format.parse(stack_template) + t['resources']['share_network']['properties']['nova_network'] = 'n' + del t['resources']['share_network']['properties']['neutron_network'] + del t['resources']['share_network']['properties']['neutron_subnet'] + stack = utils.parse_stack(t) + rsrc_defn = stack.t.resource_definitions(stack)['share_network'] + net = self._create_network('share_network', rsrc_defn, stack, + use_neutron=False) + self.assertEqual((net.CREATE, net.COMPLETE), net.state) + self.assertEqual('42', net.resource_id) + net.client().share_networks.create.assert_called_with( + name='1', description='2', neutron_net_id=None, + neutron_subnet_id=None, nova_net_id='n') + calls = [mock.call('42', '6'), mock.call('42', '7')] + net.client().share_networks.add_security_service.assert_has_calls( + calls, any_order=True) + self.assertEqual('share_networks', net.entity) + def test_create_fail(self): self.client.share_networks.add_security_service.side_effect = ( Exception())