From 44d566d6362384490ea4c09f6ada3a3336fa118f Mon Sep 17 00:00:00 2001 From: Adit Sarfaty Date: Mon, 19 Mar 2018 14:19:02 +0200 Subject: [PATCH] Policy: support multiple services in a communication map Change-Id: I982b04e428f86168838c114b233e646d332dde28 --- .../tests/unit/v3/test_policy_api.py | 4 ++-- .../tests/unit/v3/test_policy_resources.py | 21 +++++++++++-------- vmware_nsxlib/v3/policy_defs.py | 16 +++++++------- vmware_nsxlib/v3/policy_resources.py | 14 ++++++------- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/vmware_nsxlib/tests/unit/v3/test_policy_api.py b/vmware_nsxlib/tests/unit/v3/test_policy_api.py index 29f31a8d..562c5c96 100644 --- a/vmware_nsxlib/tests/unit/v3/test_policy_api.py +++ b/vmware_nsxlib/tests/unit/v3/test_policy_api.py @@ -205,7 +205,7 @@ class TestPolicyCommunicationMap(TestPolicyApi): source_groups=["group1", "group2"], dest_groups=["group1"], - service_id="service1") + service_ids=["service1"]) self.entry2 = policy.CommunicationMapEntryDef( 'd1', 'cm2', 'en2', @@ -213,7 +213,7 @@ class TestPolicyCommunicationMap(TestPolicyApi): source_groups=["group1", "group2"], dest_groups=["group3"], - service_id="service2") + service_ids=["service2"]) self.expected_data1 = {'id': 'en1', 'display_name': None, diff --git a/vmware_nsxlib/tests/unit/v3/test_policy_resources.py b/vmware_nsxlib/tests/unit/v3/test_policy_resources.py index 0530e798..ae510055 100644 --- a/vmware_nsxlib/tests/unit/v3/test_policy_resources.py +++ b/vmware_nsxlib/tests/unit/v3/test_policy_resources.py @@ -624,7 +624,7 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): map_id=map_id, description=description, sequence_number=seq_num, - service_id=service_id, + service_ids=[service_id], source_groups=[source_group], dest_groups=[dest_group], tenant=TEST_TENANT) @@ -645,7 +645,7 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): name=name, description=description, sequence_number=seq_num, - service_id=service_id, + service_ids=[service_id], source_groups=[source_group], dest_groups=[dest_group], tenant=TEST_TENANT) @@ -668,7 +668,7 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): self.resourceApi.create_or_overwrite(name, domain_id, map_id=map_id, description=description, - service_id=service_id, + service_ids=[service_id], source_groups=[source_group], dest_groups=[dest_group], category=category, @@ -691,7 +691,7 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): name=name, description=description, sequence_number=1, - service_id=service_id, + service_ids=[service_id], source_groups=[source_group], dest_groups=[dest_group], tenant=TEST_TENANT) @@ -703,12 +703,14 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): description = 'desc' source_group = 'g1' dest_group = 'g2' - service_id = 'c1' + service1_id = 'c1' + service2_id = 'c2' with mock.patch.object(self.policy_api, "create_with_parent") as api_call: self.resourceApi.create_or_overwrite(name, domain_id, description=description, - service_id=service_id, + service_ids=[service1_id, + service2_id], source_groups=[source_group], dest_groups=[dest_group], tenant=TEST_TENANT) @@ -729,7 +731,7 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): name=name, description=description, sequence_number=1, - service_id=service_id, + service_ids=[service1_id, service2_id], source_groups=[source_group], dest_groups=[dest_group], tenant=TEST_TENANT) @@ -790,7 +792,8 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): description = 'new desc' source_group = 'ng1' dest_group = 'ng2' - service_id = 'nc1' + service1_id = 'nc1' + service2_id = 'nc2' with mock.patch.object(self.policy_api, "get", return_value={}) as get_call,\ mock.patch.object(self.policy_api, @@ -798,7 +801,7 @@ class TestPolicyCommunicationMap(NsxPolicyLibTestCase): self.resourceApi.update(domain_id, map_id, name=name, description=description, - service_id=service_id, + service_ids=[service1_id, service2_id], source_groups=[source_group], dest_groups=[dest_group], tenant=TEST_TENANT) diff --git a/vmware_nsxlib/v3/policy_defs.py b/vmware_nsxlib/v3/policy_defs.py index 812746c8..ae67a178 100644 --- a/vmware_nsxlib/v3/policy_defs.py +++ b/vmware_nsxlib/v3/policy_defs.py @@ -372,7 +372,7 @@ class CommunicationMapEntryDef(ResourceDef): sequence_number=None, source_groups=None, dest_groups=None, - service_id=None, + service_ids=None, action=policy_constants.ACTION_ALLOW, scope="ANY", name=None, @@ -390,8 +390,8 @@ class CommunicationMapEntryDef(ResourceDef): self.scope = scope self.source_groups = self.get_groups_path(domain_id, source_groups) self.dest_groups = self.get_groups_path(domain_id, dest_groups) - self.service_path = self.get_service_path( - service_id) if service_id else None + self.service_paths = [self.get_service_path(service_id) for service_id + in service_ids] if service_ids else [] self.parent_ids = (tenant, domain_id, map_id) # convert groups and services to full path @@ -418,7 +418,7 @@ class CommunicationMapEntryDef(ResourceDef): body['source_groups'] = self.source_groups body['destination_groups'] = self.dest_groups body['sequence_number'] = self.sequence_number - body['services'] = [self.service_path] + body['services'] = self.service_paths body['scope'] = [self.scope] body['action'] = self.action return body @@ -428,10 +428,10 @@ class CommunicationMapEntryDef(ResourceDef): if 'body' in kwargs: del kwargs['body'] # Fix params that need special conversions - if kwargs.get('service_id') is not None: - service_path = self.get_service_path(kwargs['service_id']) - body['services'] = [service_path] - del kwargs['service_id'] + if kwargs.get('service_ids') is not None: + body['services'] = [self.get_service_path(service_id) for + service_id in kwargs['service_ids']] + del kwargs['service_ids'] if kwargs.get('dest_groups') is not None: groups = self.get_groups_path( diff --git a/vmware_nsxlib/v3/policy_resources.py b/vmware_nsxlib/v3/policy_resources.py index 4da88074..441efd3e 100644 --- a/vmware_nsxlib/v3/policy_resources.py +++ b/vmware_nsxlib/v3/policy_resources.py @@ -434,7 +434,7 @@ class NsxPolicyCommunicationMapApi(NsxPolicyResourceBase): def create_or_overwrite(self, name, domain_id, map_id=None, description=None, precedence=0, category=policy_constants.CATEGORY_DEFAULT, - sequence_number=None, service_id=None, + sequence_number=None, service_ids=None, action=policy_constants.ACTION_ALLOW, source_groups=None, dest_groups=None, tenant=policy_constants.POLICY_INFRA_TENANT): @@ -447,10 +447,10 @@ class NsxPolicyCommunicationMapApi(NsxPolicyResourceBase): end up with same sequence number. """ # Validate and convert inputs - if not service_id: - # service-id must be provided + if not service_ids: + # service-ids must be provided err_msg = (_("Cannot create a communication map %(name)s without " - "service id") % {'name': name}) + "services") % {'name': name}) raise exceptions.ManagerError(details=err_msg) if map_id: # get the next available sequence number @@ -477,7 +477,7 @@ class NsxPolicyCommunicationMapApi(NsxPolicyResourceBase): sequence_number=sequence_number, source_groups=source_groups, dest_groups=dest_groups, - service_id=service_id, + service_ids=service_ids, action=action, tenant=tenant) @@ -525,7 +525,7 @@ class NsxPolicyCommunicationMapApi(NsxPolicyResourceBase): return self.policy_api.list(map_def)['results'] def update(self, domain_id, map_id, name=None, description=None, - sequence_number=None, service_id=None, action=None, + sequence_number=None, service_ids=None, action=None, source_groups=None, dest_groups=None, precedence=None, category=None, tenant=policy_constants.POLICY_INFRA_TENANT): @@ -554,7 +554,7 @@ class NsxPolicyCommunicationMapApi(NsxPolicyResourceBase): entry_def.update_attributes_in_body( body=comm_entry, name=name, description=description, - service_id=service_id, + service_ids=service_ids, source_groups=source_groups, dest_groups=dest_groups, sequence_number=sequence_number,