def test_project_settings(self): mock_project_settings = {'Test': 'Setting'} mock_configuration_bucket_arn = 'mock-arn' mock_response = mock_aws.s3_get_object_response( json.dumps(mock_project_settings)) with mock_aws.patch_client('s3', 'get_object', return_value=mock_response, reload=stack_info) as mock_get_object: with mock.patch( 'resource_manager_common.stack_info.ProjectInfo.configuration_bucket', new_callable=mock.PropertyMock, return_value=mock_configuration_bucket_arn): with mock.patch( "resource_manager_common.json_utils.JSONCustomEncoder.default", return_value='mock'): target = stack_info.ProjectInfo(MOCK_STACK_ARN) actual_project_settings = target.project_settings self.assertEquals(actual_project_settings, mock_project_settings) mock_get_object.assert_called_once_with( Bucket=mock_configuration_bucket_arn, Key='project-settings.json')
def test_project_settings_missing_object(self): mock_configuration_bucket_arn = 'mock-arn' error_response = { 'Error': { 'Message': 'Access Denied', 'Code': 'AccessDenied' } } client_error = ClientError(error_response, 'get_object') with mock_aws.patch_client('s3', 'get_object', side_effect=client_error, reload=stack_info) as mock_get_object: with mock.patch( 'resource_manager_common.stack_info.ProjectInfo.configuration_bucket', new_callable=mock.PropertyMock, return_value=mock_configuration_bucket_arn): target = stack_info.ProjectInfo(MOCK_STACK_ARN) actual_project_settings = target.project_settings self.assertEquals(actual_project_settings, {}) mock_get_object.assert_called_once_with( Bucket=mock_configuration_bucket_arn, Key='project-settings.json')
def get_resource_physical_id(event): project_stack_arn = os.environ.get('PROJECT_STACK_ARN') if not project_stack_arn: raise RuntimeError( 'Configuration error: PROJECT_STACK_ARN was not defined') stack = event.get('stack') if stack != 'Access': raise RuntimeError('Invalid stack {}'.format(stack)) deployment_name = event.get('deployment_name') if not deployment_name: raise RuntimeError('Missing deployment_name') resource_name = event.get('resource_name') if not resource_name: raise RuntimeError('Missing resource_name') project = stack_info.ProjectInfo(project_stack_arn) for deployment in project.deployments: if deployment.deployment_name == deployment_name: physical_id = deployment.deployment_access.resources.get_by_logical_id( resource_name).physical_id return {'physical_id': physical_id} raise RuntimeError('Deployment {} not found'.format(deployment_name))
def test_constructor(self): target = stack_info.ProjectInfo( MOCK_STACK_ARN, client=MOCK_CLIENT, stack_description=MOCK_STACK_DESCRIPTION) self.assertEquals(target.stack_type, stack_info.StackInfo.STACK_TYPE_PROJECT) self.assertIs(target.client, MOCK_CLIENT) self.assertIs(target.stack_description, MOCK_STACK_DESCRIPTION)
def get_deployment_access_resource_info(request, deployment_name, resource_name): project_stack_arn = CloudCanvas.get_setting('PROJECT_STACK_ARN') project = stack_info.ProjectInfo(project_stack_arn) for deployment in project.deployments: if deployment.deployment_name == deployment_name: physical_id = deployment.deployment_access.resources.get_by_logical_id( resource_name).physical_id if physical_id: return {'PhysicalId': physical_id} raise errors.NotFoundError( 'Resource {} not found.'.format(resource_name)) raise errors.NotFoundError( 'Deployment {} not found'.format(deployment_name))
def test_configuration_bucket(self): expected_configuration_bucket_id = 'test-id' mock_resource = mock.MagicMock( physical_id=expected_configuration_bucket_id) mock_resources = mock.MagicMock() mock_resources.get_by_logical_id.return_value = mock_resource with mock.patch( 'resource_manager_common.stack_info.ProjectInfo.resources', new=mock.PropertyMock(return_value=mock_resources)): target = stack_info.ProjectInfo(MOCK_STACK_ARN) actual_configuration_bucket_id = target.configuration_bucket self.assertEquals(actual_configuration_bucket_id, expected_configuration_bucket_id) mock_resources.get_by_logical_id.assert_called_once_with( 'Configuration', expected_type='AWS::S3::Bucket')
def test_deployments(self): mock_deployment_1_name = 'dep1' mock_deployment_2_name = 'dep2' mock_deployment_1_stack_arn = make_stack_arn(mock_deployment_1_name) mock_deployment_2_stack_arn = make_stack_arn(mock_deployment_2_name) mock_deployment_1_access_stack_arn = make_stack_arn( mock_deployment_1_name + 'access') mock_deployment_2_access_stack_arn = make_stack_arn( mock_deployment_2_name + 'access') mock_project_settings = { 'deployment': { mock_deployment_1_name: { 'DeploymentStackId': mock_deployment_1_stack_arn, 'DeploymentAccessStackId': mock_deployment_1_access_stack_arn }, mock_deployment_2_name: { 'DeploymentStackId': mock_deployment_2_stack_arn, 'DeploymentAccessStackId': mock_deployment_2_access_stack_arn }, '*': {} } } mock_deployments = ['test-deployment-info-1', 'test-deployment-info-2'] with mock.patch('resource_manager_common.stack_info.DeploymentInfo', side_effect=mock_deployments) as mock_DeploymentInfo: with mock.patch( 'resource_manager_common.stack_info.ProjectInfo.project_settings', new_callable=mock.PropertyMock, return_value=mock_project_settings): target = stack_info.ProjectInfo(MOCK_STACK_ARN, client=MOCK_CLIENT) actual_deployments = target.deployments mock_DeploymentInfo.assert_any_call( mock_deployment_1_stack_arn, deployment_access_stack_arn= mock_deployment_1_access_stack_arn, client=MOCK_CLIENT, project_info=target) mock_DeploymentInfo.assert_any_call( mock_deployment_2_stack_arn, deployment_access_stack_arn= mock_deployment_2_access_stack_arn, client=MOCK_CLIENT, project_info=target) self.assertItemsEqual(actual_deployments, mock_deployments)
def get_resource_group_resource_info(request, deployment_name, resource_group_name, resource_name): project_stack_arn = CloudCanvas.get_setting('ProjectStackArn') stack_info_manager = stack_info.StackInfoManager() project = stack_info.ProjectInfo(stack_info_manager, project_stack_arn) for deployment in project.deployments: if deployment.deployment_name == deployment_name: for resource_group in deployment.resource_groups: if resource_group.resource_group_name == resource_group_name: physical_id = resource_group.resources.get_by_logical_id( resource_name).physical_id if physical_id: return {'PhysicalId': physical_id} raise errors.NotFoundError( 'Resource {} not found.'.format(resource_name)) raise errors.NotFoundError( 'Resource Group {} not found.'.format(resource_group)) raise errors.NotFoundError( 'Deployment {} not found'.format(deployment_name))
def list_deployment_resources(request, deployment_name): project_stack_arn = CloudCanvas.get_setting('ProjectStackArn') stack_info_manager = stack_info.StackInfoManager() project = stack_info.ProjectInfo(stack_info_manager, project_stack_arn) for deployment in project.deployments: if deployment.deployment_name == deployment_name: resources = {} for resource_group in deployment.resource_groups: for resource in resource_group.resources: full_logical_id = '.'.join([ resource_group.resource_group_name, resource.logical_id ]) if resource.type == 'Custom::ServiceApi': resources[full_logical_id] = __get_service_api_mapping( resource_group, resource) else: resources[full_logical_id] = { 'PhysicalResourceId': resource.physical_id, 'ResourceType': resource.type } return {'Resources': resources} raise errors.NotFoundError( 'Deployment {} not found'.format(deployment_name))
def test_project_name(self): target = stack_info.ProjectInfo(MOCK_STACK_ARN) self.assertEquals(target.project_name, MOCK_STACK_NAME)