From ed652edb38414343528bd78378fde06f7af5b66a Mon Sep 17 00:00:00 2001 From: Bin Qian Date: Fri, 12 Jun 2020 10:50:09 -0400 Subject: [PATCH] Update dc-cert subcloud status endpoint when subcloud online Set it to in-sync and will be replaced with dc-cert validation result (coming soon). Ensure updating dc-cert status before subcloud is unmanaged. This is because the subcloud is bootstrap with in-sync dc-cert. And dc-cert is audit when subcloud is online (before set to managed). Change-Id: I2e6aa597e53da5e26f44430767eb6fd4d3e784ee Story: 2007347 Task: 40070 Signed-off-by: Bin Qian --- .../dcmanager/manager/subcloud_manager.py | 13 ++++- .../unit/manager/test_subcloud_manager.py | 48 +++++++++++++++++-- distributedcloud/dcorch/common/consts.py | 4 +- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/distributedcloud/dcmanager/manager/subcloud_manager.py b/distributedcloud/dcmanager/manager/subcloud_manager.py index 887a328ac..1d055d4c9 100644 --- a/distributedcloud/dcmanager/manager/subcloud_manager.py +++ b/distributedcloud/dcmanager/manager/subcloud_manager.py @@ -1059,12 +1059,15 @@ class SubcloudManager(manager.Manager): raise e # Only allow updating the sync status if managed and online. + # except dc-cert endpoint is audit only when subcloud is online + # this could happen before subcloud is being managed. # This means if a subcloud is going offline or unmanaged, then # the sync status update must be done first. if (((subcloud.availability_status == consts.AVAILABILITY_ONLINE) and (subcloud.management_state == - consts.MANAGEMENT_MANAGED)) + consts.MANAGEMENT_MANAGED or + endpoint_type == dcorch_consts.ENDPOINT_TYPE_DC_CERT)) or (sync_status != consts.SYNC_STATUS_IN_SYNC)): # update a single subcloud @@ -1212,6 +1215,14 @@ class SubcloudManager(manager.Manager): ' update: %s' % subcloud_name) return + if availability_status == consts.AVAILABILITY_ONLINE: + # Subcloud is going online, we always want the dc-cert + # endpoint to start out as synced. + self._update_subcloud_endpoint_status( + context, subcloud_name, + endpoint_type=dcorch_consts.ENDPOINT_TYPE_DC_CERT, + sync_status=consts.SYNC_STATUS_IN_SYNC) + # Send dcorch a state update self._update_subcloud_state(context, subcloud_name, updated_subcloud.management_state, diff --git a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py index ccd093903..82ef95dd4 100644 --- a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py +++ b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py @@ -73,6 +73,10 @@ FAKE_SERVICES = [ dcorch_consts.ENDPOINT_TYPE_NFV, 5 ), + FakeService( + dcorch_consts.ENDPOINT_TYPE_DC_CERT, + 6 + ) ] @@ -357,7 +361,8 @@ class TestSubcloudManager(base.DCManagerTestCase): dcorch_consts.ENDPOINT_TYPE_IDENTITY, dcorch_consts.ENDPOINT_TYPE_PATCHING, dcorch_consts.ENDPOINT_TYPE_FM, - dcorch_consts.ENDPOINT_TYPE_NFV]: + dcorch_consts.ENDPOINT_TYPE_NFV, + dcorch_consts.ENDPOINT_TYPE_DC_CERT]: status = db_api.subcloud_status_create( self.ctx, subcloud.id, endpoint) self.assertIsNotNone(status) @@ -369,7 +374,8 @@ class TestSubcloudManager(base.DCManagerTestCase): dcorch_consts.ENDPOINT_TYPE_IDENTITY, dcorch_consts.ENDPOINT_TYPE_PATCHING, dcorch_consts.ENDPOINT_TYPE_FM, - dcorch_consts.ENDPOINT_TYPE_NFV]: + dcorch_consts.ENDPOINT_TYPE_NFV, + dcorch_consts.ENDPOINT_TYPE_DC_CERT]: # Update sm.update_subcloud_endpoint_status( self.ctx, subcloud_name=subcloud.name, @@ -388,7 +394,8 @@ class TestSubcloudManager(base.DCManagerTestCase): dcorch_consts.ENDPOINT_TYPE_IDENTITY, dcorch_consts.ENDPOINT_TYPE_PATCHING, dcorch_consts.ENDPOINT_TYPE_FM, - dcorch_consts.ENDPOINT_TYPE_NFV]: + dcorch_consts.ENDPOINT_TYPE_NFV, + dcorch_consts.ENDPOINT_TYPE_DC_CERT]: sm.update_subcloud_endpoint_status( self.ctx, subcloud_name=subcloud.name, endpoint_type=endpoint, @@ -431,6 +438,19 @@ class TestSubcloudManager(base.DCManagerTestCase): self.assertEqual(updated_subcloud_status.sync_status, consts.SYNC_STATUS_OUT_OF_SYNC) + endpoint = dcorch_consts.ENDPOINT_TYPE_DC_CERT + sm.update_subcloud_endpoint_status( + self.ctx, subcloud_name=subcloud.name, + endpoint_type=endpoint, + sync_status=consts.SYNC_STATUS_IN_SYNC) + + updated_subcloud_status = db_api.subcloud_status_get( + self.ctx, subcloud.id, endpoint) + self.assertIsNotNone(updated_subcloud_status) + # No change in status: Only online/managed clouds are updated + self.assertEqual(updated_subcloud_status.sync_status, + consts.SYNC_STATUS_IN_SYNC) + # Set/verify the subcloud is online/managed db_api.subcloud_update( self.ctx, subcloud.id, @@ -448,7 +468,8 @@ class TestSubcloudManager(base.DCManagerTestCase): dcorch_consts.ENDPOINT_TYPE_IDENTITY, dcorch_consts.ENDPOINT_TYPE_PATCHING, dcorch_consts.ENDPOINT_TYPE_FM, - dcorch_consts.ENDPOINT_TYPE_NFV]: + dcorch_consts.ENDPOINT_TYPE_NFV, + dcorch_consts.ENDPOINT_TYPE_DC_CERT]: sm.update_subcloud_endpoint_status( self.ctx, subcloud_name=subcloud.name, endpoint_type=endpoint, @@ -467,7 +488,8 @@ class TestSubcloudManager(base.DCManagerTestCase): dcorch_consts.ENDPOINT_TYPE_IDENTITY, dcorch_consts.ENDPOINT_TYPE_PATCHING, dcorch_consts.ENDPOINT_TYPE_FM, - dcorch_consts.ENDPOINT_TYPE_NFV]: + dcorch_consts.ENDPOINT_TYPE_NFV, + dcorch_consts.ENDPOINT_TYPE_DC_CERT]: sm.update_subcloud_endpoint_status( self.ctx, subcloud_name=subcloud.name, endpoint_type=endpoint, @@ -485,11 +507,27 @@ class TestSubcloudManager(base.DCManagerTestCase): def test_update_subcloud_availability_go_online(self): # create a subcloud subcloud = self.create_subcloud_static(self.ctx, name='subcloud1') + self.assertIsNotNone(subcloud) self.assertEqual(subcloud.availability_status, consts.AVAILABILITY_OFFLINE) sm = subcloud_manager.SubcloudManager() + db_api.subcloud_update(self.ctx, subcloud.id, + management_state=consts.MANAGEMENT_MANAGED) + + # create sync statuses for endpoints + for endpoint in [dcorch_consts.ENDPOINT_TYPE_PLATFORM, + dcorch_consts.ENDPOINT_TYPE_IDENTITY, + dcorch_consts.ENDPOINT_TYPE_PATCHING, + dcorch_consts.ENDPOINT_TYPE_FM, + dcorch_consts.ENDPOINT_TYPE_NFV, + dcorch_consts.ENDPOINT_TYPE_DC_CERT]: + status = db_api.subcloud_status_create( + self.ctx, subcloud.id, endpoint) + self.assertIsNotNone(status) + self.assertEqual(status.sync_status, consts.SYNC_STATUS_UNKNOWN) + sm.update_subcloud_availability(self.ctx, subcloud.name, consts.AVAILABILITY_ONLINE) diff --git a/distributedcloud/dcorch/common/consts.py b/distributedcloud/dcorch/common/consts.py index 01822f9ae..8f1da3d9d 100644 --- a/distributedcloud/dcorch/common/consts.py +++ b/distributedcloud/dcorch/common/consts.py @@ -128,12 +128,14 @@ ENDPOINT_TYPE_IDENTITY = "identity" ENDPOINT_TYPE_FM = "faultmanagement" ENDPOINT_TYPE_NFV = "nfv" ENDPOINT_TYPE_LOAD = "load" +ENDPOINT_TYPE_DC_CERT = 'dc-cert' # All endpoint types ENDPOINT_TYPES_LIST = [ENDPOINT_TYPE_PLATFORM, ENDPOINT_TYPE_PATCHING, ENDPOINT_TYPE_IDENTITY, - ENDPOINT_TYPE_LOAD] + ENDPOINT_TYPE_LOAD, + ENDPOINT_TYPE_DC_CERT] # Dcorch sync endpoint types SYNC_ENDPOINT_TYPES_LIST = [ENDPOINT_TYPE_PLATFORM,