diff --git a/gbpautomation/heat/engine/resources/grouppolicy.py b/gbpautomation/heat/engine/resources/grouppolicy.py index 9db4582..d5f6112 100644 --- a/gbpautomation/heat/engine/resources/grouppolicy.py +++ b/gbpautomation/heat/engine/resources/grouppolicy.py @@ -368,8 +368,8 @@ class L3Policy(gbpresource.GBPResource): update_allowed=True ), EXTERNAL_SEGMENTS: properties.Schema( - properties.Schema.MAP, - _('External segments of L3 policy.'), + properties.Schema.LIST, + _('External segments for L3 policy.'), update_allowed=True ), SHARED: properties.Schema( @@ -392,6 +392,21 @@ class L3Policy(gbpresource.GBPResource): if self.properties.get(key) is not None: props[key] = self.properties.get(key) + external_segments_dict = {} + props_external_segments = props.get( + 'external_segments', []) + + for prop_external_segment in props_external_segments: + external_segment_id = ( + prop_external_segment['external_segment_id']) + allocated_address = ( + prop_external_segment['allocated_address']) + external_segments_dict.update({external_segment_id: + allocated_address}) + + if external_segments_dict: + props['external_segments'] = external_segments_dict + l3_policy = client.create_l3_policy( {'l3_policy': props})['l3_policy'] @@ -411,6 +426,20 @@ class L3Policy(gbpresource.GBPResource): def handle_update(self, json_snippet, tmpl_diff, prop_diff): if prop_diff: + external_segments_dict = {} + props_external_segments = prop_diff.get( + 'external_segments', []) + + for prop_external_segment in props_external_segments: + external_segment_id = ( + prop_external_segment['external_segment_id']) + allocated_address = ( + prop_external_segment['allocated_address']) + external_segments_dict.update({external_segment_id: + allocated_address}) + + if external_segments_dict: + prop_diff['external_segments'] = external_segments_dict self.grouppolicy().update_l3_policy( self.resource_id, {'l3_policy': prop_diff}) diff --git a/gbpautomation/heat/tests/test_grouppolicy.py b/gbpautomation/heat/tests/test_grouppolicy.py index a99e672..c192d80 100644 --- a/gbpautomation/heat/tests/test_grouppolicy.py +++ b/gbpautomation/heat/tests/test_grouppolicy.py @@ -104,6 +104,10 @@ l3_policy_template = ''' "description": "test L3 policy resource", "ip_version": "4", "ip_pool": "10.20.20.0", + "external_segments": [ + {"external_segment_id": "es1", + "allocated_address": "1.1.1.1"}, + ], "subnet_prefix_length": 24, "shared": True } @@ -720,6 +724,7 @@ class L3PolicyTest(HeatTestCase): "ip_version": "4", "ip_pool": "10.20.20.0", "subnet_prefix_length": 24, + "external_segments": {"es1": "1.1.1.1"}, "shared": True } }).AndReturn({'l3_policy': {'id': '5678'}}) @@ -745,6 +750,7 @@ class L3PolicyTest(HeatTestCase): "ip_version": "4", "ip_pool": "10.20.20.0", "subnet_prefix_length": 24, + "external_segments": {"es1": "1.1.1.1"}, "shared": True } }).AndRaise(grouppolicy.NeutronClientException()) @@ -807,12 +813,17 @@ class L3PolicyTest(HeatTestCase): def test_update(self): rsrc = self.create_l3_policy() gbpclient.Client.update_l3_policy( - '5678', {'l3_policy': {'subnet_prefix_length': 28}}) + '5678', {'l3_policy': {'subnet_prefix_length': 28, + 'external_segments': + {'es2': '2.1.1.1'}}}) self.m.ReplayAll() scheduler.TaskRunner(rsrc.create)() update_template = copy.deepcopy(rsrc.t) update_template['Properties']['subnet_prefix_length'] = 28 + update_template['Properties']['external_segments'] = [ + {'external_segment_id': 'es2', + 'allocated_address': '2.1.1.1'}] scheduler.TaskRunner(rsrc.update, update_template)() self.m.VerifyAll()