[aim-mapping] Preserve BD reference on PTG update

When updating the AIM EPG (on account of update to the corresponding PTG),
the attributes that are not being updated also need to be populated in the
AIM EPG resource before its passed to the AIM manager to perform the update
(since we perform update as a create operation with override option).

Change-Id: I9bbcfecea44a953204f8f4d2449fc7b96cd4d197
Closes-bug: 1631307
This commit is contained in:
Sumit Naiksatam 2016-10-07 02:30:07 -07:00
parent 0a9192f568
commit 77bc49a420
2 changed files with 42 additions and 10 deletions

View File

@ -261,7 +261,7 @@ class AIMMappingDriver(nrd.CommonNeutronBase, aim_rpc.AIMMappingRPCMixin):
@log.log_method_call
def update_policy_target_group_precommit(self, context):
session = context._plugin_context.session
provided_contracts, consumed_contracts = [], []
provided_contracts, consumed_contracts = None, None
if 'provided_policy_rule_sets' in context.current:
provided_contracts = self._get_aim_contract_names(
session, context.current['provided_policy_rule_sets'])
@ -269,8 +269,13 @@ class AIMMappingDriver(nrd.CommonNeutronBase, aim_rpc.AIMMappingRPCMixin):
consumed_contracts = self._get_aim_contract_names(
session, context.current['consumed_policy_rule_sets'])
if provided_contracts or consumed_contracts:
aim_epg = self._aim_endpoint_group(session, context.current)
aim_epg = self._get_aim_endpoint_group(session, context.current)
if aim_epg and ((provided_contracts is not None) or (
consumed_contracts is not None)):
if provided_contracts is not None:
aim_epg.provided_contract_names = provided_contracts
if consumed_contracts is not None:
aim_epg.consumed_contract_names = consumed_contracts
ptg_db = context._plugin._get_policy_target_group(
context._plugin_context, context.current['id'])
if ptg_db['l2_policy_id']:
@ -280,13 +285,6 @@ class AIMMappingDriver(nrd.CommonNeutronBase, aim_rpc.AIMMappingRPCMixin):
# infra svc contracts
self._add_implicit_svc_contracts_to_epg(context, l2p_db,
aim_epg)
provided_contracts += aim_epg.provided_contract_names
consumed_contracts += aim_epg.consumed_contract_names
aim_ctx = self._get_aim_context(context)
self.aim.update(aim_ctx, aim_epg,
**{'provided_contract_names': provided_contracts,
'consumed_contract_names': consumed_contracts})
@log.log_method_call
def delete_policy_target_group_precommit(self, context):

View File

@ -674,12 +674,20 @@ class TestPolicyTargetGroup(AIMBaseTestCase):
self._aim_context, aim_resource.ApplicationProfile,
tenant_name=aim_tenant_name, name=aim_app_profile_name)
self.assertEqual(1, len(aim_app_profiles))
req = self.new_show_request('networks', l2p['network_id'],
fmt=self.fmt)
net = self.deserialize(self.fmt,
req.get_response(self.api))['network']
bd = self.aim_mgr.get(
self._aim_context, aim_resource.BridgeDomain.from_dn(
net['apic:distinguished_names']['BridgeDomain']))
aim_epgs = self.aim_mgr.find(
self._aim_context, aim_resource.EndpointGroup, name=aim_epg_name)
self.assertEqual(1, len(aim_epgs))
self.assertEqual(aim_epg_name, aim_epgs[0].name)
self.assertEqual(aim_tenant_name, aim_epgs[0].tenant_name)
self.assertEqual(ptg['name'], aim_epgs[0].display_name)
self.assertEqual(bd.name, aim_epgs[0].bd_name)
self._validate_contracts(aim_epgs[0], prs_lists, l2p)
@ -705,6 +713,7 @@ class TestPolicyTargetGroup(AIMBaseTestCase):
self.assertEqual(1, len(aim_epgs))
self.assertEqual(aim_epg_name, aim_epgs[0].name)
self._validate_contracts(aim_epgs[0], new_prs_lists, l2p)
self.assertEqual(bd.name, aim_epgs[0].bd_name)
self.delete_policy_target_group(ptg_id, expected_res_status=204)
self.show_policy_target_group(ptg_id, expected_res_status=404)
@ -748,11 +757,19 @@ class TestPolicyTargetGroup(AIMBaseTestCase):
self._aim_context, aim_resource.ApplicationProfile,
tenant_name=aim_tenant_name, name=aim_app_profile_name)
self.assertEqual(1, len(aim_app_profiles))
req = self.new_show_request('networks', l2p['network_id'],
fmt=self.fmt)
net = self.deserialize(self.fmt,
req.get_response(self.api))['network']
bd = self.aim_mgr.get(
self._aim_context, aim_resource.BridgeDomain.from_dn(
net['apic:distinguished_names']['BridgeDomain']))
aim_epgs = self.aim_mgr.find(
self._aim_context, aim_resource.EndpointGroup, name=aim_epg_name)
self.assertEqual(1, len(aim_epgs))
self.assertEqual(aim_epg_name, aim_epgs[0].name)
self.assertEqual(aim_tenant_name, aim_epgs[0].tenant_name)
self.assertEqual(bd.name, aim_epgs[0].bd_name)
self.assertEqual(aim_epgs[0].dn,
ptg['apic:distinguished_names']['EndpointGroup'])
@ -760,6 +777,23 @@ class TestPolicyTargetGroup(AIMBaseTestCase):
self.assertEqual(aim_epgs[0].dn,
ptg_show['apic:distinguished_names']['EndpointGroup'])
new_name = 'new name'
new_prs_lists = self._get_provided_consumed_prs_lists()
self.update_policy_target_group(
ptg_id, expected_res_status=200, name=new_name,
provided_policy_rule_sets={new_prs_lists['provided']['id']:
'scope'},
consumed_policy_rule_sets={new_prs_lists['consumed']['id']:
'scope'})['policy_target_group']
aim_epg_name = str(self.name_mapper.policy_target_group(
self._neutron_context.session, ptg_id, new_name))
aim_epgs = self.aim_mgr.find(
self._aim_context, aim_resource.EndpointGroup, name=aim_epg_name)
self.assertEqual(1, len(aim_epgs))
self.assertEqual(aim_epg_name, aim_epgs[0].name)
self._validate_contracts(aim_epgs[0], new_prs_lists, l2p)
self.assertEqual(bd.name, aim_epgs[0].bd_name)
self.delete_policy_target_group(ptg_id, expected_res_status=204)
self.show_policy_target_group(ptg_id, expected_res_status=404)
# Implicitly created subnet should be deleted