From 8c5f532ca12e16a20498d6c7ebb112d3c87f6a31 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Tue, 4 Feb 2020 08:09:24 -0500 Subject: [PATCH 01/11] azure initial management group creation --- atst/domain/csp/cloud/azure_cloud_provider.py | 42 +++++++++++++++++ atst/domain/csp/cloud/mock_cloud_provider.py | 27 +++++++++++ atst/domain/csp/cloud/models.py | 20 ++++++-- atst/models/mixins/state_machines.py | 2 + tests/domain/cloud/test_azure_csp.py | 47 +++++++++++++++++++ tests/domain/test_portfolio_state_machine.py | 2 + 6 files changed, 135 insertions(+), 5 deletions(-) diff --git a/atst/domain/csp/cloud/azure_cloud_provider.py b/atst/domain/csp/cloud/azure_cloud_provider.py index 13b474e6..da21fee7 100644 --- a/atst/domain/csp/cloud/azure_cloud_provider.py +++ b/atst/domain/csp/cloud/azure_cloud_provider.py @@ -25,7 +25,10 @@ from .models import ( BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, KeyVaultCredentials, + ManagementGroupCSPPayload, ManagementGroupCSPResponse, + ManagementGroupGetCSPPayload, + ManagementGroupGetCSPResponse, ProductPurchaseCSPPayload, ProductPurchaseCSPResult, ProductPurchaseVerificationCSPPayload, @@ -209,6 +212,40 @@ class AzureCloudProvider(CloudProviderInterface): return ApplicationCSPResult(**response) + def create_initial_mgmt_group(self, payload: ManagementGroupCSPPayload): + creds = self._source_creds(payload.tenant_id) + credentials = self._get_credential_obj( + { + "client_id": creds.root_sp_client_id, + "secret_key": creds.root_sp_key, + "tenant_id": creds.root_tenant_id, + }, + resource=self.sdk.cloud.endpoints.resource_manager, + ) + response = self._create_management_group( + credentials, payload.management_group_name, payload.display_name, + ) + + return ManagementGroupCSPResponse(**response) + + def create_initial_mgmt_group_verification( + self, payload: ManagementGroupGetCSPPayload + ): + creds = self._source_creds(payload.tenant_id) + credentials = self._get_credential_obj( + { + "client_id": creds.root_sp_client_id, + "secret_key": creds.root_sp_key, + "tenant_id": creds.root_tenant_id, + }, + resource=self.sdk.cloud.endpoints.resource_manager, + ) + + response = self._get_management_group( + credentials, payload.management_group_name, + ) + return ManagementGroupGetCSPResponse(**response.result()) + def _create_management_group( self, credentials, management_group_id, display_name, parent_id=None, ): @@ -235,6 +272,11 @@ class AzureCloudProvider(CloudProviderInterface): # instead? return create_request.result() + def _get_management_group(self, credentials, management_group_id): + mgmgt_group_client = self.sdk.managementgroups.ManagementGroupsAPI(credentials) + response = mgmgt_group_client.management_groups.get(management_group_id) + return response + def _create_policy_definition( self, credentials, subscription_id, management_group_id, properties, ): diff --git a/atst/domain/csp/cloud/mock_cloud_provider.py b/atst/domain/csp/cloud/mock_cloud_provider.py index dce01f4e..0a573937 100644 --- a/atst/domain/csp/cloud/mock_cloud_provider.py +++ b/atst/domain/csp/cloud/mock_cloud_provider.py @@ -25,6 +25,10 @@ from .models import ( BillingProfileTenantAccessCSPResult, BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, + ManagementGroupCSPPayload, + ManagementGroupCSPResponse, + ManagementGroupGetCSPPayload, + ManagementGroupGetCSPResponse, ProductPurchaseCSPPayload, ProductPurchaseCSPResult, ProductPurchaseVerificationCSPPayload, @@ -319,6 +323,29 @@ class MockCloudProvider(CloudProviderInterface): } ) + def create_initial_mgmt_group(self, payload: ManagementGroupCSPPayload): + self._maybe_raise(self.NETWORK_FAILURE_PCT, self.NETWORK_EXCEPTION) + self._maybe_raise(self.SERVER_FAILURE_PCT, self.SERVER_EXCEPTION) + self._maybe_raise(self.UNAUTHORIZED_RATE, self.AUTHORIZATION_EXCEPTION) + + return ManagementGroupCSPResponse( + id=f"{AZURE_MGMNT_PATH}{payload.management_group_name}" + ) + + def create_initial_mgmt_group_verification( + self, payload: ManagementGroupGetCSPPayload + ): + self._maybe_raise(self.NETWORK_FAILURE_PCT, self.NETWORK_EXCEPTION) + self._maybe_raise(self.SERVER_FAILURE_PCT, self.SERVER_EXCEPTION) + self._maybe_raise(self.UNAUTHORIZED_RATE, self.AUTHORIZATION_EXCEPTION) + + return ManagementGroupGetCSPResponse( + **dict( + id="Test Id" + # id=f"{AZURE_MGMNT_PATH}{payload.management_group_name}" + ) + ) + def create_product_purchase(self, payload: ProductPurchaseCSPPayload): self._maybe_raise(self.NETWORK_FAILURE_PCT, self.NETWORK_EXCEPTION) self._maybe_raise(self.SERVER_FAILURE_PCT, self.SERVER_EXCEPTION) diff --git a/atst/domain/csp/cloud/models.py b/atst/domain/csp/cloud/models.py index efd4b8cf..bbf72815 100644 --- a/atst/domain/csp/cloud/models.py +++ b/atst/domain/csp/cloud/models.py @@ -318,7 +318,7 @@ class ManagementGroupCSPPayload(AliasModel): tenant_id: str management_group_name: Optional[str] display_name: str - parent_id: str + parent_id: Optional[str] @validator("management_group_name", pre=True, always=True) def supply_management_group_name_default(cls, name): @@ -336,18 +336,28 @@ class ManagementGroupCSPPayload(AliasModel): def enforce_display_name_length(cls, name): return name[0:90] + @validator("parent_id", pre=True, always=True) def enforce_parent_id_pattern(cls, id_): - if AZURE_MGMNT_PATH not in id_: - return f"{AZURE_MGMNT_PATH}{id_}" - else: - return id_ + if id_: + if AZURE_MGMNT_PATH not in id_: + return f"{AZURE_MGMNT_PATH}{id_}" + else: + return id_ class ManagementGroupCSPResponse(AliasModel): id: str +class ManagementGroupGetCSPPayload(BaseCSPPayload): + management_group_name: str + + +class ManagementGroupGetCSPResponse(AliasModel): + id: str + + class ApplicationCSPPayload(ManagementGroupCSPPayload): pass diff --git a/atst/models/mixins/state_machines.py b/atst/models/mixins/state_machines.py index a7edf268..64355d54 100644 --- a/atst/models/mixins/state_machines.py +++ b/atst/models/mixins/state_machines.py @@ -24,6 +24,8 @@ class AzureStages(Enum): TENANT_PRINCIPAL_CREDENTIAL = "tenant principal credential" ADMIN_ROLE_DEFINITION = "admin role definition" PRINCIPAL_ADMIN_ROLE = "tenant principal admin" + INITIAL_MGMT_GROUP = "initial management group" + INITIAL_MGMT_GROUP_VERIFICATION = "initial management group verification" TENANT_ADMIN_OWNERSHIP = "tenant admin ownership" TENANT_PRINCIPAL_OWNERSHIP = "tenant principial ownership" diff --git a/tests/domain/cloud/test_azure_csp.py b/tests/domain/cloud/test_azure_csp.py index eef5620e..fd98fddf 100644 --- a/tests/domain/cloud/test_azure_csp.py +++ b/tests/domain/cloud/test_azure_csp.py @@ -20,6 +20,10 @@ from atst.domain.csp.cloud.models import ( BillingProfileTenantAccessCSPResult, BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, + ManagementGroupCSPPayload, + ManagementGroupCSPResponse, + ManagementGroupGetCSPPayload, + ManagementGroupGetCSPResponse, ProductPurchaseCSPPayload, ProductPurchaseCSPResult, ProductPurchaseVerificationCSPPayload, @@ -55,6 +59,12 @@ def mock_management_group_create(mock_azure, spec_dict): ) +def mock_management_group_get(mock_azure, spec_dict): + mock_azure.sdk.managementgroups.ManagementGroupsAPI.return_value.management_groups.get.return_value.result.return_value = ( + spec_dict + ) + + def test_create_environment_succeeds(mock_azure: AzureCloudProvider): environment = EnvironmentFactory.create() @@ -97,6 +107,43 @@ def test_create_application_succeeds(mock_azure: AzureCloudProvider): assert result.id == "Test Id" +def test_create_initial_mgmt_group_succeeds(mock_azure: AzureCloudProvider): + application = ApplicationFactory.create() + mock_management_group_create(mock_azure, {"id": "Test Id"}) + mock_azure = mock_get_secret(mock_azure) + + payload = ManagementGroupCSPPayload( + tenant_id="1234", + display_name=application.name, + management_group_name=str(uuid4()), + ) + + result: ManagementGroupCSPResponse = mock_azure.create_initial_mgmt_group(payload) + + assert result.id == "Test Id" + + +def test_create_initial_mgmt_group_verification_succeeds( + mock_azure: AzureCloudProvider, +): + application = ApplicationFactory.create() + mock_management_group_get(mock_azure, {"id": "Test Id"}) + mock_azure = mock_get_secret(mock_azure) + + management_group_name = str(uuid4()) + + payload = ManagementGroupGetCSPPayload( + tenant_id="1234", management_group_name=management_group_name + ) + + result: ManagementGroupGetCSPResponse = mock_azure.create_initial_mgmt_group_verification( + payload + ) + + assert result.id == "Test Id" + # assert result.name == management_group_name + + def test_create_atat_admin_user_succeeds(mock_azure: AzureCloudProvider): environment_id = str(uuid4()) diff --git a/tests/domain/test_portfolio_state_machine.py b/tests/domain/test_portfolio_state_machine.py index 2c27cfd8..3b5c8af8 100644 --- a/tests/domain/test_portfolio_state_machine.py +++ b/tests/domain/test_portfolio_state_machine.py @@ -111,6 +111,8 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): FSMStates.TENANT_PRINCIPAL_CREDENTIAL_CREATED, FSMStates.ADMIN_ROLE_DEFINITION_CREATED, FSMStates.PRINCIPAL_ADMIN_ROLE_CREATED, + FSMStates.INITIAL_MGMT_GROUP_CREATED, + FSMStates.PRODUCT_PURCHASE_VERIFICATION_CREATED, FSMStates.TENANT_ADMIN_OWNERSHIP_CREATED, FSMStates.TENANT_PRINCIPAL_OWNERSHIP_CREATED, ] From b52d6c89ac2d3baafba0055fb2e06f61090b6683 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Tue, 4 Feb 2020 10:23:35 -0500 Subject: [PATCH 02/11] initial mgmt group verfication query for root mgmt group by tenant_id --- atst/domain/csp/cloud/azure_cloud_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atst/domain/csp/cloud/azure_cloud_provider.py b/atst/domain/csp/cloud/azure_cloud_provider.py index da21fee7..0daa804c 100644 --- a/atst/domain/csp/cloud/azure_cloud_provider.py +++ b/atst/domain/csp/cloud/azure_cloud_provider.py @@ -242,7 +242,7 @@ class AzureCloudProvider(CloudProviderInterface): ) response = self._get_management_group( - credentials, payload.management_group_name, + credentials, payload.tenant_id, ) return ManagementGroupGetCSPResponse(**response.result()) From ac6c715056a768913f087c34744f805b15f45a17 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Wed, 5 Feb 2020 12:22:20 -0500 Subject: [PATCH 03/11] formatting --- atst/domain/csp/cloud/azure_cloud_provider.py | 4 +--- atst/domain/csp/cloud/models.py | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/atst/domain/csp/cloud/azure_cloud_provider.py b/atst/domain/csp/cloud/azure_cloud_provider.py index 5f97e161..5117c58c 100644 --- a/atst/domain/csp/cloud/azure_cloud_provider.py +++ b/atst/domain/csp/cloud/azure_cloud_provider.py @@ -245,9 +245,7 @@ class AzureCloudProvider(CloudProviderInterface): resource=self.sdk.cloud.endpoints.resource_manager, ) - response = self._get_management_group( - credentials, payload.tenant_id, - ) + response = self._get_management_group(credentials, payload.tenant_id,) return ManagementGroupGetCSPResponse(**response.result()) def _create_management_group( diff --git a/atst/domain/csp/cloud/models.py b/atst/domain/csp/cloud/models.py index ad095bf7..7836b311 100644 --- a/atst/domain/csp/cloud/models.py +++ b/atst/domain/csp/cloud/models.py @@ -338,7 +338,6 @@ class ManagementGroupCSPPayload(AliasModel): def enforce_display_name_length(cls, name): return name[0:90] - @validator("parent_id", pre=True, always=True) def enforce_parent_id_pattern(cls, id_): if id_: From 6420cce4fc38b94b32ea6aa6c5b926bf58720665 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Thu, 6 Feb 2020 10:13:27 -0500 Subject: [PATCH 04/11] initial mgmt group stage data classes extend the management group data class --- atst/domain/csp/cloud/azure_cloud_provider.py | 15 ++--- atst/domain/csp/cloud/mock_cloud_provider.py | 18 +++--- atst/domain/csp/cloud/models.py | 16 +++++ atst/models/portfolio_state_machine.py | 58 +++++++++---------- tests/domain/cloud/test_azure_csp.py | 18 +++--- tests/domain/test_portfolio_state_machine.py | 4 +- 6 files changed, 73 insertions(+), 56 deletions(-) diff --git a/atst/domain/csp/cloud/azure_cloud_provider.py b/atst/domain/csp/cloud/azure_cloud_provider.py index 5117c58c..8f4f2506 100644 --- a/atst/domain/csp/cloud/azure_cloud_provider.py +++ b/atst/domain/csp/cloud/azure_cloud_provider.py @@ -25,11 +25,12 @@ from .models import ( BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, CostManagementQueryCSPResult, + InitialMgmtGroupCSPPayload, + InitialMgmtGroupCSPResponse, + InitialMgmtGroupVerificationCSPPayload, + InitialMgmtGroupVerificationCSPResponse, KeyVaultCredentials, - ManagementGroupCSPPayload, ManagementGroupCSPResponse, - ManagementGroupGetCSPPayload, - ManagementGroupGetCSPResponse, ProductPurchaseCSPPayload, ProductPurchaseCSPResult, ProductPurchaseVerificationCSPPayload, @@ -216,7 +217,7 @@ class AzureCloudProvider(CloudProviderInterface): return ApplicationCSPResult(**response) - def create_initial_mgmt_group(self, payload: ManagementGroupCSPPayload): + def create_initial_mgmt_group(self, payload: InitialMgmtGroupCSPPayload): creds = self._source_creds(payload.tenant_id) credentials = self._get_credential_obj( { @@ -230,10 +231,10 @@ class AzureCloudProvider(CloudProviderInterface): credentials, payload.management_group_name, payload.display_name, ) - return ManagementGroupCSPResponse(**response) + return InitialMgmtGroupCSPResponse(**response) def create_initial_mgmt_group_verification( - self, payload: ManagementGroupGetCSPPayload + self, payload: InitialMgmtGroupVerificationCSPPayload ): creds = self._source_creds(payload.tenant_id) credentials = self._get_credential_obj( @@ -246,7 +247,7 @@ class AzureCloudProvider(CloudProviderInterface): ) response = self._get_management_group(credentials, payload.tenant_id,) - return ManagementGroupGetCSPResponse(**response.result()) + return InitialMgmtGroupVerificationCSPResponse(**response.result()) def _create_management_group( self, credentials, management_group_id, display_name, parent_id=None, diff --git a/atst/domain/csp/cloud/mock_cloud_provider.py b/atst/domain/csp/cloud/mock_cloud_provider.py index 98e474bf..e7458ef3 100644 --- a/atst/domain/csp/cloud/mock_cloud_provider.py +++ b/atst/domain/csp/cloud/mock_cloud_provider.py @@ -25,10 +25,10 @@ from .models import ( BillingProfileTenantAccessCSPResult, BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, - ManagementGroupCSPPayload, - ManagementGroupCSPResponse, - ManagementGroupGetCSPPayload, - ManagementGroupGetCSPResponse, + InitialMgmtGroupCSPPayload, + InitialMgmtGroupCSPResponse, + InitialMgmtGroupVerificationCSPPayload, + InitialMgmtGroupVerificationCSPResponse, CostManagementQueryCSPResult, CostManagementQueryProperties, ProductPurchaseCSPPayload, @@ -329,23 +329,23 @@ class MockCloudProvider(CloudProviderInterface): } ) - def create_initial_mgmt_group(self, payload: ManagementGroupCSPPayload): + def create_initial_mgmt_group(self, payload: InitialMgmtGroupCSPPayload): self._maybe_raise(self.NETWORK_FAILURE_PCT, self.NETWORK_EXCEPTION) self._maybe_raise(self.SERVER_FAILURE_PCT, self.SERVER_EXCEPTION) self._maybe_raise(self.UNAUTHORIZED_RATE, self.AUTHORIZATION_EXCEPTION) - return ManagementGroupCSPResponse( - id=f"{AZURE_MGMNT_PATH}{payload.management_group_name}" + return InitialMgmtGroupCSPResponse( + id=f"{AZURE_MGMNT_PATH}{payload.management_group_name}", ) def create_initial_mgmt_group_verification( - self, payload: ManagementGroupGetCSPPayload + self, payload: InitialMgmtGroupVerificationCSPPayload ): self._maybe_raise(self.NETWORK_FAILURE_PCT, self.NETWORK_EXCEPTION) self._maybe_raise(self.SERVER_FAILURE_PCT, self.SERVER_EXCEPTION) self._maybe_raise(self.UNAUTHORIZED_RATE, self.AUTHORIZATION_EXCEPTION) - return ManagementGroupGetCSPResponse( + return InitialMgmtGroupVerificationCSPResponse( **dict( id="Test Id" # id=f"{AZURE_MGMNT_PATH}{payload.management_group_name}" diff --git a/atst/domain/csp/cloud/models.py b/atst/domain/csp/cloud/models.py index 7836b311..3351e4ec 100644 --- a/atst/domain/csp/cloud/models.py +++ b/atst/domain/csp/cloud/models.py @@ -367,6 +367,22 @@ class ApplicationCSPResult(ManagementGroupCSPResponse): pass +class InitialMgmtGroupCSPPayload(ManagementGroupCSPPayload): + pass + + +class InitialMgmtGroupCSPResponse(ManagementGroupCSPResponse): + pass + + +class InitialMgmtGroupVerificationCSPPayload(ManagementGroupGetCSPPayload): + pass + + +class InitialMgmtGroupVerificationCSPResponse(ManagementGroupGetCSPResponse): + pass + + class KeyVaultCredentials(BaseModel): root_sp_client_id: Optional[str] root_sp_key: Optional[str] diff --git a/atst/models/portfolio_state_machine.py b/atst/models/portfolio_state_machine.py index f5c1a461..96fd029d 100644 --- a/atst/models/portfolio_state_machine.py +++ b/atst/models/portfolio_state_machine.py @@ -155,37 +155,37 @@ class PortfolioStateMachine( print(exc.json()) app.logger.info(payload) self.fail_stage(stage) + else: + # TODO: Determine best place to do this, maybe @reconstructor + self.csp = app.csp.cloud - # TODO: Determine best place to do this, maybe @reconstructor - self.csp = app.csp.cloud + try: + func_name = f"create_{stage}" + response = getattr(self.csp, func_name)(payload_data) + if self.portfolio.csp_data is None: + self.portfolio.csp_data = {} + self.portfolio.csp_data.update(response.dict()) + db.session.add(self.portfolio) + db.session.commit() + except PydanticValidationError as exc: + app.logger.error( + f"Failed to cast response to valid result class {self.__repr__()}:", + exc_info=1, + ) + app.logger.info(exc.json()) + print(exc.json()) + app.logger.info(payload_data) + # TODO: Ensure that failing the stage does not preclude a Celery retry + self.fail_stage(stage) + # TODO: catch and handle general CSP exception here + except (ConnectionException, UnknownServerException) as exc: + app.logger.error( + f"CSP api call. Caught exception for {self.__repr__()}.", exc_info=1, + ) + # TODO: Ensure that failing the stage does not preclude a Celery retry + self.fail_stage(stage) - try: - func_name = f"create_{stage}" - response = getattr(self.csp, func_name)(payload_data) - if self.portfolio.csp_data is None: - self.portfolio.csp_data = {} - self.portfolio.csp_data.update(response.dict()) - db.session.add(self.portfolio) - db.session.commit() - except PydanticValidationError as exc: - app.logger.error( - f"Failed to cast response to valid result class {self.__repr__()}:", - exc_info=1, - ) - app.logger.info(exc.json()) - print(exc.json()) - app.logger.info(payload_data) - # TODO: Ensure that failing the stage does not preclude a Celery retry - self.fail_stage(stage) - # TODO: catch and handle general CSP exception here - except (ConnectionException, UnknownServerException) as exc: - app.logger.error( - f"CSP api call. Caught exception for {self.__repr__()}.", exc_info=1, - ) - # TODO: Ensure that failing the stage does not preclude a Celery retry - self.fail_stage(stage) - - self.finish_stage(stage) + self.finish_stage(stage) def is_csp_data_valid(self, event): """ diff --git a/tests/domain/cloud/test_azure_csp.py b/tests/domain/cloud/test_azure_csp.py index fea9ab43..6074f4c1 100644 --- a/tests/domain/cloud/test_azure_csp.py +++ b/tests/domain/cloud/test_azure_csp.py @@ -22,10 +22,10 @@ from atst.domain.csp.cloud.models import ( BillingProfileTenantAccessCSPResult, BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, - ManagementGroupCSPPayload, - ManagementGroupCSPResponse, - ManagementGroupGetCSPPayload, - ManagementGroupGetCSPResponse, + InitialMgmtGroupCSPPayload, + InitialMgmtGroupCSPResponse, + InitialMgmtGroupVerificationCSPPayload, + InitialMgmtGroupVerificationCSPResponse, CostManagementQueryCSPResult, ProductPurchaseCSPPayload, ProductPurchaseCSPResult, @@ -116,13 +116,12 @@ def test_create_initial_mgmt_group_succeeds(mock_azure: AzureCloudProvider): mock_management_group_create(mock_azure, {"id": "Test Id"}) mock_azure = mock_get_secret(mock_azure) - payload = ManagementGroupCSPPayload( + payload = InitialMgmtGroupCSPPayload( tenant_id="1234", display_name=application.name, management_group_name=str(uuid4()), ) - - result: ManagementGroupCSPResponse = mock_azure.create_initial_mgmt_group(payload) + result: InitialMgmtGroupCSPResponse = mock_azure.create_initial_mgmt_group(payload) assert result.id == "Test Id" @@ -136,11 +135,10 @@ def test_create_initial_mgmt_group_verification_succeeds( management_group_name = str(uuid4()) - payload = ManagementGroupGetCSPPayload( + payload = InitialMgmtGroupVerificationCSPPayload( tenant_id="1234", management_group_name=management_group_name ) - - result: ManagementGroupGetCSPResponse = mock_azure.create_initial_mgmt_group_verification( + result: InitialMgmtGroupVerificationCSPResponse = mock_azure.create_initial_mgmt_group_verification( payload ) diff --git a/tests/domain/test_portfolio_state_machine.py b/tests/domain/test_portfolio_state_machine.py index 3b5c8af8..651f39c8 100644 --- a/tests/domain/test_portfolio_state_machine.py +++ b/tests/domain/test_portfolio_state_machine.py @@ -112,7 +112,7 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): FSMStates.ADMIN_ROLE_DEFINITION_CREATED, FSMStates.PRINCIPAL_ADMIN_ROLE_CREATED, FSMStates.INITIAL_MGMT_GROUP_CREATED, - FSMStates.PRODUCT_PURCHASE_VERIFICATION_CREATED, + FSMStates.INITIAL_MGMT_GROUP_VERIFICATION_CREATED, FSMStates.TENANT_ADMIN_OWNERSHIP_CREATED, FSMStates.TENANT_PRINCIPAL_OWNERSHIP_CREATED, ] @@ -133,6 +133,8 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): "user_id": user_id, "password": "jklfsdNCVD83nklds2#202", # pragma: allowlist secret "domain_name": domain_name, + "display_name" : "mgmt group display name", + "management_group_name" : "mgmt-group-uuid", "first_name": ppoc.first_name, "last_name": ppoc.last_name, "country_code": "US", From c3c2f2e1c5d7e9d8a74f0505973460dee5f92a84 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Thu, 6 Feb 2020 10:44:32 -0500 Subject: [PATCH 05/11] rename state machine data class --- atst/domain/csp/cloud/azure_cloud_provider.py | 8 ++++---- atst/domain/csp/cloud/mock_cloud_provider.py | 8 ++++---- atst/domain/csp/cloud/models.py | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/atst/domain/csp/cloud/azure_cloud_provider.py b/atst/domain/csp/cloud/azure_cloud_provider.py index 17c55a30..3b49ddb1 100644 --- a/atst/domain/csp/cloud/azure_cloud_provider.py +++ b/atst/domain/csp/cloud/azure_cloud_provider.py @@ -26,9 +26,9 @@ from .models import ( BillingProfileVerificationCSPResult, CostManagementQueryCSPResult, InitialMgmtGroupCSPPayload, - InitialMgmtGroupCSPResponse, + InitialMgmtGroupCSPResult, InitialMgmtGroupVerificationCSPPayload, - InitialMgmtGroupVerificationCSPResponse, + InitialMgmtGroupVerificationCSPResult, EnvironmentCSPPayload, EnvironmentCSPResult, KeyVaultCredentials, @@ -207,7 +207,7 @@ class AzureCloudProvider(CloudProviderInterface): credentials, payload.management_group_name, payload.display_name, ) - return InitialMgmtGroupCSPResponse(**response) + return InitialMgmtGroupCSPResult(**response) def create_initial_mgmt_group_verification( self, payload: InitialMgmtGroupVerificationCSPPayload @@ -223,7 +223,7 @@ class AzureCloudProvider(CloudProviderInterface): ) response = self._get_management_group(credentials, payload.tenant_id,) - return InitialMgmtGroupVerificationCSPResponse(**response.result()) + return InitialMgmtGroupVerificationCSPResult(**response.result()) def _create_management_group( self, credentials, management_group_id, display_name, parent_id=None, diff --git a/atst/domain/csp/cloud/mock_cloud_provider.py b/atst/domain/csp/cloud/mock_cloud_provider.py index 70e54304..c03dbbf5 100644 --- a/atst/domain/csp/cloud/mock_cloud_provider.py +++ b/atst/domain/csp/cloud/mock_cloud_provider.py @@ -24,9 +24,9 @@ from .models import ( BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, InitialMgmtGroupCSPPayload, - InitialMgmtGroupCSPResponse, + InitialMgmtGroupCSPResult, InitialMgmtGroupVerificationCSPPayload, - InitialMgmtGroupVerificationCSPResponse, + InitialMgmtGroupVerificationCSPResult, CostManagementQueryCSPResult, CostManagementQueryProperties, ProductPurchaseCSPPayload, @@ -289,7 +289,7 @@ class MockCloudProvider(CloudProviderInterface): self._maybe_raise(self.SERVER_FAILURE_PCT, self.SERVER_EXCEPTION) self._maybe_raise(self.UNAUTHORIZED_RATE, self.AUTHORIZATION_EXCEPTION) - return InitialMgmtGroupCSPResponse( + return InitialMgmtGroupCSPResult( id=f"{AZURE_MGMNT_PATH}{payload.management_group_name}", ) @@ -300,7 +300,7 @@ class MockCloudProvider(CloudProviderInterface): self._maybe_raise(self.SERVER_FAILURE_PCT, self.SERVER_EXCEPTION) self._maybe_raise(self.UNAUTHORIZED_RATE, self.AUTHORIZATION_EXCEPTION) - return InitialMgmtGroupVerificationCSPResponse( + return InitialMgmtGroupVerificationCSPResult( **dict( id="Test Id" # id=f"{AZURE_MGMNT_PATH}{payload.management_group_name}" diff --git a/atst/domain/csp/cloud/models.py b/atst/domain/csp/cloud/models.py index e8ee45ec..4c31fce5 100644 --- a/atst/domain/csp/cloud/models.py +++ b/atst/domain/csp/cloud/models.py @@ -371,7 +371,7 @@ class InitialMgmtGroupCSPPayload(ManagementGroupCSPPayload): pass -class InitialMgmtGroupCSPResponse(ManagementGroupCSPResponse): +class InitialMgmtGroupCSPResult(ManagementGroupCSPResponse): pass @@ -379,7 +379,7 @@ class InitialMgmtGroupVerificationCSPPayload(ManagementGroupGetCSPPayload): pass -class InitialMgmtGroupVerificationCSPResponse(ManagementGroupGetCSPResponse): +class InitialMgmtGroupVerificationCSPResult(ManagementGroupGetCSPResponse): pass From eb4201d6e3f48bfa370a22fbf2e0a6e5f4354302 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Thu, 6 Feb 2020 11:26:08 -0500 Subject: [PATCH 06/11] correct data class name --- tests/domain/cloud/test_azure_csp.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/domain/cloud/test_azure_csp.py b/tests/domain/cloud/test_azure_csp.py index cbf61bc6..9060060c 100644 --- a/tests/domain/cloud/test_azure_csp.py +++ b/tests/domain/cloud/test_azure_csp.py @@ -23,9 +23,9 @@ from atst.domain.csp.cloud.models import ( BillingProfileVerificationCSPPayload, BillingProfileVerificationCSPResult, InitialMgmtGroupCSPPayload, - InitialMgmtGroupCSPResponse, + InitialMgmtGroupCSPResult, InitialMgmtGroupVerificationCSPPayload, - InitialMgmtGroupVerificationCSPResponse, + InitialMgmtGroupVerificationCSPResult, CostManagementQueryCSPResult, EnvironmentCSPPayload, EnvironmentCSPResult, @@ -128,7 +128,7 @@ def test_create_initial_mgmt_group_succeeds(mock_azure: AzureCloudProvider): display_name=application.name, management_group_name=str(uuid4()), ) - result: InitialMgmtGroupCSPResponse = mock_azure.create_initial_mgmt_group(payload) + result: InitialMgmtGroupCSPResult = mock_azure.create_initial_mgmt_group(payload) assert result.id == "Test Id" @@ -145,7 +145,7 @@ def test_create_initial_mgmt_group_verification_succeeds( payload = InitialMgmtGroupVerificationCSPPayload( tenant_id="1234", management_group_name=management_group_name ) - result: InitialMgmtGroupVerificationCSPResponse = mock_azure.create_initial_mgmt_group_verification( + result: InitialMgmtGroupVerificationCSPResult = mock_azure.create_initial_mgmt_group_verification( payload ) From 86c01f69874afb989212a1cb679e73a21776e1b6 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Thu, 6 Feb 2020 12:11:04 -0500 Subject: [PATCH 07/11] provision initial mgmt group migration script --- .../542bd3215dec_state_machine_stage_added.py | 264 ++++++++++++++++++ atst/domain/permission_sets.py | 6 +- tests/domain/test_portfolio_state_machine.py | 8 +- 3 files changed, 272 insertions(+), 6 deletions(-) create mode 100644 alembic/versions/542bd3215dec_state_machine_stage_added.py diff --git a/alembic/versions/542bd3215dec_state_machine_stage_added.py b/alembic/versions/542bd3215dec_state_machine_stage_added.py new file mode 100644 index 00000000..e8d59741 --- /dev/null +++ b/alembic/versions/542bd3215dec_state_machine_stage_added.py @@ -0,0 +1,264 @@ +"""state machine stage added. + +Revision ID: 542bd3215dec +Revises: 0039308c6351 +Create Date: 2020-02-06 12:01:58.077840 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '542bd3215dec' # pragma: allowlist secret +down_revision = '0039308c6351' # pragma: allowlist secret +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column( + "portfolio_state_machines", + "state", + type_=sa.Enum( + "UNSTARTED", + "STARTING", + "STARTED", + "COMPLETED", + "FAILED", + "TENANT_CREATED", + "TENANT_IN_PROGRESS", + "TENANT_FAILED", + "BILLING_PROFILE_CREATION_CREATED", + "BILLING_PROFILE_CREATION_IN_PROGRESS", + "BILLING_PROFILE_CREATION_FAILED", + "BILLING_PROFILE_VERIFICATION_CREATED", + "BILLING_PROFILE_VERIFICATION_IN_PROGRESS", + "BILLING_PROFILE_VERIFICATION_FAILED", + "BILLING_PROFILE_TENANT_ACCESS_CREATED", + "BILLING_PROFILE_TENANT_ACCESS_IN_PROGRESS", + "BILLING_PROFILE_TENANT_ACCESS_FAILED", + "TASK_ORDER_BILLING_CREATION_CREATED", + "TASK_ORDER_BILLING_CREATION_IN_PROGRESS", + "TASK_ORDER_BILLING_CREATION_FAILED", + "TASK_ORDER_BILLING_VERIFICATION_CREATED", + "TASK_ORDER_BILLING_VERIFICATION_IN_PROGRESS", + "TASK_ORDER_BILLING_VERIFICATION_FAILED", + "BILLING_INSTRUCTION_CREATED", + "BILLING_INSTRUCTION_IN_PROGRESS", + "BILLING_INSTRUCTION_FAILED", + "PRODUCT_PURCHASE_CREATED", + "PRODUCT_PURCHASE_IN_PROGRESS", + "PRODUCT_PURCHASE_FAILED", + "PRODUCT_PURCHASE_VERIFICATION_CREATED", + "PRODUCT_PURCHASE_VERIFICATION_IN_PROGRESS", + "PRODUCT_PURCHASE_VERIFICATION_FAILED", + "TENANT_PRINCIPAL_APP_CREATED", + "TENANT_PRINCIPAL_APP_IN_PROGRESS", + "TENANT_PRINCIPAL_APP_FAILED", + "TENANT_PRINCIPAL_CREATED", + "TENANT_PRINCIPAL_IN_PROGRESS", + "TENANT_PRINCIPAL_FAILED", + "TENANT_PRINCIPAL_CREDENTIAL_CREATED", + "TENANT_PRINCIPAL_CREDENTIAL_IN_PROGRESS", + "TENANT_PRINCIPAL_CREDENTIAL_FAILED", + "ADMIN_ROLE_DEFINITION_CREATED", + "ADMIN_ROLE_DEFINITION_IN_PROGRESS", + "ADMIN_ROLE_DEFINITION_FAILED", + "PRINCIPAL_ADMIN_ROLE_CREATED", + "PRINCIPAL_ADMIN_ROLE_IN_PROGRESS", + "PRINCIPAL_ADMIN_ROLE_FAILED", + "INITIAL_MGMT_GROUP_CREATED", + "INITIAL_MGMT_GROUP_IN_PROGRESS", + "INITIAL_MGMT_GROUP_FAILED", + "INITIAL_MGMT_GROUP_VERIFICATION_CREATED", + "INITIAL_MGMT_GROUP_VERIFICATION_IN_PROGRESS", + "INITIAL_MGMT_GROUP_VERIFICATION_FAILED", + "TENANT_ADMIN_OWNERSHIP_CREATED", + "TENANT_ADMIN_OWNERSHIP_IN_PROGRESS", + "TENANT_ADMIN_OWNERSHIP_FAILED", + "TENANT_PRINCIPAL_OWNERSHIP_CREATED", + "TENANT_PRINCIPAL_OWNERSHIP_IN_PROGRESS", + "TENANT_PRINCIPAL_OWNERSHIP_FAILED", + name="fsmstates", + native_enum=False, + ), + existing_type=sa.Enum( + "UNSTARTED", + "STARTING", + "STARTED", + "COMPLETED", + "FAILED", + "TENANT_CREATED", + "TENANT_IN_PROGRESS", + "TENANT_FAILED", + "BILLING_PROFILE_CREATION_CREATED", + "BILLING_PROFILE_CREATION_IN_PROGRESS", + "BILLING_PROFILE_CREATION_FAILED", + "BILLING_PROFILE_VERIFICATION_CREATED", + "BILLING_PROFILE_VERIFICATION_IN_PROGRESS", + "BILLING_PROFILE_VERIFICATION_FAILED", + "BILLING_PROFILE_TENANT_ACCESS_CREATED", + "BILLING_PROFILE_TENANT_ACCESS_IN_PROGRESS", + "BILLING_PROFILE_TENANT_ACCESS_FAILED", + "TASK_ORDER_BILLING_CREATION_CREATED", + "TASK_ORDER_BILLING_CREATION_IN_PROGRESS", + "TASK_ORDER_BILLING_CREATION_FAILED", + "TASK_ORDER_BILLING_VERIFICATION_CREATED", + "TASK_ORDER_BILLING_VERIFICATION_IN_PROGRESS", + "TASK_ORDER_BILLING_VERIFICATION_FAILED", + "BILLING_INSTRUCTION_CREATED", + "BILLING_INSTRUCTION_IN_PROGRESS", + "BILLING_INSTRUCTION_FAILED", + "TENANT_PRINCIPAL_APP_CREATED", + "TENANT_PRINCIPAL_APP_IN_PROGRESS", + "TENANT_PRINCIPAL_APP_FAILED", + "TENANT_PRINCIPAL_CREATED", + "TENANT_PRINCIPAL_IN_PROGRESS", + "TENANT_PRINCIPAL_FAILED", + "TENANT_PRINCIPAL_CREDENTIAL_CREATED", + "TENANT_PRINCIPAL_CREDENTIAL_IN_PROGRESS", + "TENANT_PRINCIPAL_CREDENTIAL_FAILED", + "ADMIN_ROLE_DEFINITION_CREATED", + "ADMIN_ROLE_DEFINITION_IN_PROGRESS", + "ADMIN_ROLE_DEFINITION_FAILED", + "PRINCIPAL_ADMIN_ROLE_CREATED", + "PRINCIPAL_ADMIN_ROLE_IN_PROGRESS", + "PRINCIPAL_ADMIN_ROLE_FAILED", + "TENANT_ADMIN_OWNERSHIP_CREATED", + "TENANT_ADMIN_OWNERSHIP_IN_PROGRESS", + "TENANT_ADMIN_OWNERSHIP_FAILED", + "TENANT_PRINCIPAL_OWNERSHIP_CREATED", + "TENANT_PRINCIPAL_OWNERSHIP_IN_PROGRESS", + "TENANT_PRINCIPAL_OWNERSHIP_FAILED", + name="fsmstates", + native_enum=False, + ), + existing_nullable=False, + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column( + "portfolio_state_machines", + "state", + type_=sa.Enum( + "UNSTARTED", + "STARTING", + "STARTED", + "COMPLETED", + "FAILED", + "TENANT_CREATED", + "TENANT_IN_PROGRESS", + "TENANT_FAILED", + "BILLING_PROFILE_CREATION_CREATED", + "BILLING_PROFILE_CREATION_IN_PROGRESS", + "BILLING_PROFILE_CREATION_FAILED", + "BILLING_PROFILE_VERIFICATION_CREATED", + "BILLING_PROFILE_VERIFICATION_IN_PROGRESS", + "BILLING_PROFILE_VERIFICATION_FAILED", + "BILLING_PROFILE_TENANT_ACCESS_CREATED", + "BILLING_PROFILE_TENANT_ACCESS_IN_PROGRESS", + "BILLING_PROFILE_TENANT_ACCESS_FAILED", + "TASK_ORDER_BILLING_CREATION_CREATED", + "TASK_ORDER_BILLING_CREATION_IN_PROGRESS", + "TASK_ORDER_BILLING_CREATION_FAILED", + "TASK_ORDER_BILLING_VERIFICATION_CREATED", + "TASK_ORDER_BILLING_VERIFICATION_IN_PROGRESS", + "TASK_ORDER_BILLING_VERIFICATION_FAILED", + "BILLING_INSTRUCTION_CREATED", + "BILLING_INSTRUCTION_IN_PROGRESS", + "BILLING_INSTRUCTION_FAILED", + "TENANT_PRINCIPAL_APP_CREATED", + "TENANT_PRINCIPAL_APP_IN_PROGRESS", + "TENANT_PRINCIPAL_APP_FAILED", + "TENANT_PRINCIPAL_CREATED", + "TENANT_PRINCIPAL_IN_PROGRESS", + "TENANT_PRINCIPAL_FAILED", + "TENANT_PRINCIPAL_CREDENTIAL_CREATED", + "TENANT_PRINCIPAL_CREDENTIAL_IN_PROGRESS", + "TENANT_PRINCIPAL_CREDENTIAL_FAILED", + "ADMIN_ROLE_DEFINITION_CREATED", + "ADMIN_ROLE_DEFINITION_IN_PROGRESS", + "ADMIN_ROLE_DEFINITION_FAILED", + "PRINCIPAL_ADMIN_ROLE_CREATED", + "PRINCIPAL_ADMIN_ROLE_IN_PROGRESS", + "PRINCIPAL_ADMIN_ROLE_FAILED", + "TENANT_ADMIN_OWNERSHIP_CREATED", + "TENANT_ADMIN_OWNERSHIP_IN_PROGRESS", + "TENANT_ADMIN_OWNERSHIP_FAILED", + "TENANT_PRINCIPAL_OWNERSHIP_CREATED", + "TENANT_PRINCIPAL_OWNERSHIP_IN_PROGRESS", + "TENANT_PRINCIPAL_OWNERSHIP_FAILED", + name="fsmstates", + native_enum=False, + ), + existing_type=sa.Enum( + "UNSTARTED", + "STARTING", + "STARTED", + "COMPLETED", + "FAILED", + "TENANT_CREATED", + "TENANT_IN_PROGRESS", + "TENANT_FAILED", + "BILLING_PROFILE_CREATION_CREATED", + "BILLING_PROFILE_CREATION_IN_PROGRESS", + "BILLING_PROFILE_CREATION_FAILED", + "BILLING_PROFILE_VERIFICATION_CREATED", + "BILLING_PROFILE_VERIFICATION_IN_PROGRESS", + "BILLING_PROFILE_VERIFICATION_FAILED", + "BILLING_PROFILE_TENANT_ACCESS_CREATED", + "BILLING_PROFILE_TENANT_ACCESS_IN_PROGRESS", + "BILLING_PROFILE_TENANT_ACCESS_FAILED", + "TASK_ORDER_BILLING_CREATION_CREATED", + "TASK_ORDER_BILLING_CREATION_IN_PROGRESS", + "TASK_ORDER_BILLING_CREATION_FAILED", + "TASK_ORDER_BILLING_VERIFICATION_CREATED", + "TASK_ORDER_BILLING_VERIFICATION_IN_PROGRESS", + "TASK_ORDER_BILLING_VERIFICATION_FAILED", + "BILLING_INSTRUCTION_CREATED", + "BILLING_INSTRUCTION_IN_PROGRESS", + "BILLING_INSTRUCTION_FAILED", + "PRODUCT_PURCHASE_CREATED", + "PRODUCT_PURCHASE_IN_PROGRESS", + "PRODUCT_PURCHASE_FAILED", + "PRODUCT_PURCHASE_VERIFICATION_CREATED", + "PRODUCT_PURCHASE_VERIFICATION_IN_PROGRESS", + "PRODUCT_PURCHASE_VERIFICATION_FAILED", + "TENANT_PRINCIPAL_APP_CREATED", + "TENANT_PRINCIPAL_APP_IN_PROGRESS", + "TENANT_PRINCIPAL_APP_FAILED", + "TENANT_PRINCIPAL_CREATED", + "TENANT_PRINCIPAL_IN_PROGRESS", + "TENANT_PRINCIPAL_FAILED", + "TENANT_PRINCIPAL_CREDENTIAL_CREATED", + "TENANT_PRINCIPAL_CREDENTIAL_IN_PROGRESS", + "TENANT_PRINCIPAL_CREDENTIAL_FAILED", + "ADMIN_ROLE_DEFINITION_CREATED", + "ADMIN_ROLE_DEFINITION_IN_PROGRESS", + "ADMIN_ROLE_DEFINITION_FAILED", + "PRINCIPAL_ADMIN_ROLE_CREATED", + "PRINCIPAL_ADMIN_ROLE_IN_PROGRESS", + "PRINCIPAL_ADMIN_ROLE_FAILED", + "INITIAL_MGMT_GROUP_CREATED", + "INITIAL_MGMT_GROUP_IN_PROGRESS", + "INITIAL_MGMT_GROUP_FAILED", + "INITIAL_MGMT_GROUP_VERIFICATION_CREATED", + "INITIAL_MGMT_GROUP_VERIFICATION_IN_PROGRESS", + "INITIAL_MGMT_GROUP_VERIFICATION_FAILED", + "TENANT_ADMIN_OWNERSHIP_CREATED", + "TENANT_ADMIN_OWNERSHIP_IN_PROGRESS", + "TENANT_ADMIN_OWNERSHIP_FAILED", + "TENANT_PRINCIPAL_OWNERSHIP_CREATED", + "TENANT_PRINCIPAL_OWNERSHIP_IN_PROGRESS", + "TENANT_PRINCIPAL_OWNERSHIP_FAILED", + name="fsmstates", + native_enum=False, + ), + existing_nullable=False, + ) + diff --git a/atst/domain/permission_sets.py b/atst/domain/permission_sets.py index 8d110dc3..7d0239ed 100644 --- a/atst/domain/permission_sets.py +++ b/atst/domain/permission_sets.py @@ -30,7 +30,8 @@ class PermissionSets(object): try: role = db.session.query(PermissionSet).filter_by(name=perms_set_name).one() except NoResultFound: - raise NotFoundError("permission_set") + #raise NotFoundError("permission_set") + pass return role @@ -47,7 +48,8 @@ class PermissionSets(object): ) if len(permission_sets) != len(perms_set_names): - raise NotFoundError("permission_set") + #raise NotFoundError("permission_set") + pass return permission_sets diff --git a/tests/domain/test_portfolio_state_machine.py b/tests/domain/test_portfolio_state_machine.py index 678f84b6..5d04d7c7 100644 --- a/tests/domain/test_portfolio_state_machine.py +++ b/tests/domain/test_portfolio_state_machine.py @@ -123,7 +123,7 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): csp_data = {} ppoc = portfolio.owner - user_id = f"{ppoc.first_name[0]}{ppoc.last_name}".lower() + user_id = "johndoe"#f"{ppoc.first_name[0]}{ppoc.last_name}".lower() domain_name = re.sub("[^0-9a-zA-Z]+", "", portfolio.name).lower() initial_task_order: TaskOrder = portfolio.task_orders[0] @@ -135,10 +135,10 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): "domain_name": domain_name, "display_name": "mgmt group display name", "management_group_name": "mgmt-group-uuid", - "first_name": ppoc.first_name, - "last_name": ppoc.last_name, + "first_name": "123",#ppoc.first_name, + "last_name": "123",#ppoc.last_name, "country_code": "US", - "password_recovery_email_address": ppoc.email, + "password_recovery_email_address": "email@example.com",#ppoc.email, "address": { # TODO: TBD if we're sourcing this from data or config "company_name": "", "address_line_1": "", From 93840ac7b862d9f6bb8bc6a3bfefa84808a78b8b Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Thu, 6 Feb 2020 12:29:54 -0500 Subject: [PATCH 08/11] revert local changes --- atst/domain/permission_sets.py | 4 ++-- tests/domain/test_portfolio_state_machine.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/atst/domain/permission_sets.py b/atst/domain/permission_sets.py index 7d0239ed..b8e744c9 100644 --- a/atst/domain/permission_sets.py +++ b/atst/domain/permission_sets.py @@ -30,7 +30,7 @@ class PermissionSets(object): try: role = db.session.query(PermissionSet).filter_by(name=perms_set_name).one() except NoResultFound: - #raise NotFoundError("permission_set") + # raise NotFoundError("permission_set") pass return role @@ -48,7 +48,7 @@ class PermissionSets(object): ) if len(permission_sets) != len(perms_set_names): - #raise NotFoundError("permission_set") + # raise NotFoundError("permission_set") pass return permission_sets diff --git a/tests/domain/test_portfolio_state_machine.py b/tests/domain/test_portfolio_state_machine.py index 5d04d7c7..cf58b8fb 100644 --- a/tests/domain/test_portfolio_state_machine.py +++ b/tests/domain/test_portfolio_state_machine.py @@ -123,7 +123,7 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): csp_data = {} ppoc = portfolio.owner - user_id = "johndoe"#f"{ppoc.first_name[0]}{ppoc.last_name}".lower() + user_id = "johndoe" # f"{ppoc.first_name[0]}{ppoc.last_name}".lower() domain_name = re.sub("[^0-9a-zA-Z]+", "", portfolio.name).lower() initial_task_order: TaskOrder = portfolio.task_orders[0] @@ -135,10 +135,10 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): "domain_name": domain_name, "display_name": "mgmt group display name", "management_group_name": "mgmt-group-uuid", - "first_name": "123",#ppoc.first_name, - "last_name": "123",#ppoc.last_name, + "first_name": "123", # ppoc.first_name, + "last_name": "123", # ppoc.last_name, "country_code": "US", - "password_recovery_email_address": "email@example.com",#ppoc.email, + "password_recovery_email_address": "email@example.com", # ppoc.email, "address": { # TODO: TBD if we're sourcing this from data or config "company_name": "", "address_line_1": "", From 350c631745f6e2976174b69f0414a7420a9f1999 Mon Sep 17 00:00:00 2001 From: Philip Kalinsky Date: Thu, 6 Feb 2020 12:47:40 -0500 Subject: [PATCH 09/11] revert local changes --- atst/domain/permission_sets.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/atst/domain/permission_sets.py b/atst/domain/permission_sets.py index b8e744c9..8d110dc3 100644 --- a/atst/domain/permission_sets.py +++ b/atst/domain/permission_sets.py @@ -30,8 +30,7 @@ class PermissionSets(object): try: role = db.session.query(PermissionSet).filter_by(name=perms_set_name).one() except NoResultFound: - # raise NotFoundError("permission_set") - pass + raise NotFoundError("permission_set") return role @@ -48,8 +47,7 @@ class PermissionSets(object): ) if len(permission_sets) != len(perms_set_names): - # raise NotFoundError("permission_set") - pass + raise NotFoundError("permission_set") return permission_sets From 24414bc3a9d3f1a88c81781ee91595d529c09856 Mon Sep 17 00:00:00 2001 From: tomdds Date: Tue, 11 Feb 2020 11:13:03 -0500 Subject: [PATCH 10/11] Fix DB migration conflict --- .../versions/542bd3215dec_state_machine_stage_added.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/alembic/versions/542bd3215dec_state_machine_stage_added.py b/alembic/versions/542bd3215dec_state_machine_stage_added.py index e8d59741..8a3410af 100644 --- a/alembic/versions/542bd3215dec_state_machine_stage_added.py +++ b/alembic/versions/542bd3215dec_state_machine_stage_added.py @@ -1,7 +1,7 @@ -"""state machine stage added. +"""state machine stage added. Revision ID: 542bd3215dec -Revises: 0039308c6351 +Revises: 567bfb019a87 Create Date: 2020-02-06 12:01:58.077840 """ @@ -10,8 +10,8 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '542bd3215dec' # pragma: allowlist secret -down_revision = '0039308c6351' # pragma: allowlist secret +revision = "542bd3215dec" # pragma: allowlist secret +down_revision = "567bfb019a87" # pragma: allowlist secret branch_labels = None depends_on = None From 92bc848da5c0df1df3c67bdb3ea1115242db7603 Mon Sep 17 00:00:00 2001 From: tomdds Date: Tue, 11 Feb 2020 11:20:26 -0500 Subject: [PATCH 11/11] Remove placeholder data in portfolio state machine test --- tests/domain/test_portfolio_state_machine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/domain/test_portfolio_state_machine.py b/tests/domain/test_portfolio_state_machine.py index cf58b8fb..2c8796d5 100644 --- a/tests/domain/test_portfolio_state_machine.py +++ b/tests/domain/test_portfolio_state_machine.py @@ -123,7 +123,7 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): csp_data = {} ppoc = portfolio.owner - user_id = "johndoe" # f"{ppoc.first_name[0]}{ppoc.last_name}".lower() + user_id = f"{ppoc.first_name[0]}{ppoc.last_name}".lower() domain_name = re.sub("[^0-9a-zA-Z]+", "", portfolio.name).lower() initial_task_order: TaskOrder = portfolio.task_orders[0] @@ -135,8 +135,8 @@ def test_fsm_transition_start(mock_cloud_provider, portfolio: Portfolio): "domain_name": domain_name, "display_name": "mgmt group display name", "management_group_name": "mgmt-group-uuid", - "first_name": "123", # ppoc.first_name, - "last_name": "123", # ppoc.last_name, + "first_name": ppoc.first_name, + "last_name": ppoc.last_name, "country_code": "US", "password_recovery_email_address": "email@example.com", # ppoc.email, "address": { # TODO: TBD if we're sourcing this from data or config