From 6c71cfb14546e475ce6d5fa38e8a66a69cbf92f7 Mon Sep 17 00:00:00 2001 From: asarfaty Date: Wed, 11 Mar 2020 11:15:34 +0200 Subject: [PATCH] Use PUT instead of PATCH for segment port detach Change-Id: Ib411f1898778362030c91ddc707bdd8dc1e07760 --- .../tests/unit/v3/policy/test_resources.py | 19 +++++++--------- vmware_nsxlib/v3/policy/core_resources.py | 22 +++++++++++++------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/vmware_nsxlib/tests/unit/v3/policy/test_resources.py b/vmware_nsxlib/tests/unit/v3/policy/test_resources.py index 48fb849c..f413eed6 100644 --- a/vmware_nsxlib/tests/unit/v3/policy/test_resources.py +++ b/vmware_nsxlib/tests/unit/v3/policy/test_resources.py @@ -4567,21 +4567,18 @@ class TestPolicySegmentPort(NsxPolicyLibTestCase): segment_id = "segment" port_id = "port" tags = [{'scope': 'a', 'tag': 'b'}] - with mock.patch.object(self.policy_api, - "create_or_update") as api_call: + with mock.patch.object(self.policy_api.client, + "get", return_value={}) as api_get,\ + mock.patch.object(self.policy_api.client, + "update") as api_put: self.resourceApi.detach( segment_id, port_id, tags=tags, tenant=TEST_TENANT) - expected_def = core_defs.SegmentPortDef( - segment_id=segment_id, - port_id=port_id, - attachment_type=None, - vif_id=None, - tags=tags, - tenant=TEST_TENANT) - - self.assert_called_with_def(api_call, expected_def) + api_get.assert_called_once() + api_put.assert_called_once_with( + "%s/segments/%s/ports/%s" % (TEST_TENANT, segment_id, port_id), + {'attachment': None}) class TestPolicySegmentProfileBase(NsxPolicyLibTestCase): diff --git a/vmware_nsxlib/v3/policy/core_resources.py b/vmware_nsxlib/v3/policy/core_resources.py index 8b64d54b..ae3ac901 100644 --- a/vmware_nsxlib/v3/policy/core_resources.py +++ b/vmware_nsxlib/v3/policy/core_resources.py @@ -2183,14 +2183,22 @@ class NsxPolicySegmentPortApi(NsxPolicyResourceBase): def detach(self, segment_id, port_id, tags=IGNORE, tenant=constants.POLICY_INFRA_TENANT): + # Due to platform limitation, PUT should be used here and not PATCH + port_def = self.entry_def( + segment_id=segment_id, + port_id=port_id, + tenant=tenant) + path = port_def.get_resource_path() - port_def = self.entry_def(segment_id=segment_id, - port_id=port_id, - vif_id=None, - attachment_type=None, - tags=tags, - tenant=tenant) - self.policy_api.create_or_update(port_def) + @utils.retry_upon_exception( + exceptions.StaleRevision, + max_attempts=self.policy_api.client.max_attempts) + def _detach(): + port = self.policy_api.get(port_def) + port['attachment'] = None + self.policy_api.client.update(path, port) + + _detach() def attach(self, segment_id, port_id, attachment_type,