def test_c4_orchestration_manager_find_stack(): mocked_boto3 = MockBoto3() mock_stack_names = [ 'foo-bar-baz', 'awseb-e-foo-stack', 'c4-network-cgap-test-123', 'c4-iam-cgap-test-456' ] MockBotoCloudFormationClient.setup_boto3_mocked_stacks( boto3=mocked_boto3, mock_stack_names=mock_stack_names) with mock.patch.object(cloudformation_utils, "boto3", mocked_boto3): manager = cloudformation_utils.C4OrchestrationManager() network_stack = manager.find_stack('network') assert network_stack.name == 'c4-network-cgap-test-123' mocked_boto3 = MockBoto3() mock_stack_names = [ 'foo-bar-baz', 'awseb-e-foo-stack', 'c4-network-cgap-test-123', 'c4-network-cgap-prod-456' ] MockBotoCloudFormationClient.setup_boto3_mocked_stacks( boto3=mocked_boto3, mock_stack_names=mock_stack_names) with mock.patch.object(cloudformation_utils, "boto3", mocked_boto3): manager = cloudformation_utils.C4OrchestrationManager() with pytest.raises(ValueError, match="too many"): manager.find_stack('network')
def test_c4_orchestration_manager_find_stack_resource(): mocked_boto3 = MockBoto3() private_subnet_a = MockBotoCloudFormationResourceSummary( logical_id='MyPrivateSubnetA', physical_resource_id='subnet-111111') private_subnet_b = MockBotoCloudFormationResourceSummary( logical_id='MyPrivateSubnetB', physical_resource_id='subnet-222222') public_subnet_a = MockBotoCloudFormationResourceSummary( logical_id='MyPublicSubnetA', physical_resource_id='subnet-333333') public_subnet_b = MockBotoCloudFormationResourceSummary( logical_id='MyPublicSubnetA', physical_resource_id='subnet-444444') network_resource_summaries = [ private_subnet_a, private_subnet_b, public_subnet_a, public_subnet_b ] mocked_stacks = [ MockBotoCloudFormationStack( 'c4-network-main-stack', mock_resource_summaries=network_resource_summaries), MockBotoCloudFormationStack('c4-iam-main-stack') ] MockBotoCloudFormationClient.setup_boto3_mocked_stacks( boto3=mocked_boto3, mocked_stacks=mocked_stacks) with mock.patch.object(cloudformation_utils, "boto3", mocked_boto3): manager = cloudformation_utils.C4OrchestrationManager() assert manager.find_stack_resource( 'network', 'MyPrivateSubnetA') == private_subnet_a assert manager.find_stack_resource( 'network', 'MyPrivateSubnetB') == private_subnet_b assert manager.find_stack_resource('network', 'MyPrivateSubnetC') is None assert manager.find_stack_resource('network', 'MyPrivateSubnetA', 'logical_id') == 'MyPrivateSubnetA' assert manager.find_stack_resource('network', 'MyPrivateSubnetC', 'logical_id') is None assert manager.find_stack_resource( 'network', 'MyPrivateSubnetA', 'physical_resource_id') == 'subnet-111111' assert manager.find_stack_resource('network', 'MyPrivateSubnetC', 'physical_resource_id') is None assert manager.find_stack_resource('network', 'MyPrivateSubnetC', 'physical_resource_id', 'foo') == 'foo'
def test_c4_orchestration_manager_find_stack_outputs(): mocked_boto3 = MockBoto3() network_outputs = [ { 'OutputKey': 'rds', 'OutputValue': 'some-db-thing' }, { 'OutputKey': 'es', 'OutputValue': 'some-es-thing' }, ] iam_outputs = [ { 'OutputKey': 'user1', 'OutputValue': 'Joe' }, { 'OutputKey': 'user2', 'OutputValue': 'Sally' }, ] mocked_stacks = [ MockBotoCloudFormationStack('c4-network-main-stack', mock_outputs=network_outputs), MockBotoCloudFormationStack('c4-iam-main-stack', mock_outputs=iam_outputs), ] MockBotoCloudFormationClient.setup_boto3_mocked_stacks( boto3=mocked_boto3, mocked_stacks=mocked_stacks) with mock.patch.object(cloudformation_utils, "boto3", mocked_boto3): manager = cloudformation_utils.C4OrchestrationManager() # Looking up a simple key by name assert manager.find_stack_outputs('user1') == {'user1': 'Joe'} assert manager.find_stack_outputs('user1', value_only=True) == ['Joe'] assert manager.find_stack_outputs('rds') == {'rds': 'some-db-thing'} assert manager.find_stack_outputs( 'rds', value_only=True) == ['some-db-thing'] assert manager.find_stack_outputs('not-there') == {} assert manager.find_stack_outputs('not-there', value_only=True) == [] # Use of predicate to find several related keys assert manager.find_stack_outputs(lambda x: x.startswith("user")) == { 'user1': 'Joe', 'user2': 'Sally' } assert sorted( manager.find_stack_outputs(lambda x: x.startswith("user"), value_only=True)) == ['Joe', 'Sally']
def test_c4_orchestration_manager_all_stacks(): mocked_boto3 = MockBoto3() mock_stack_names = [ 'foo-bar-baz', 'awseb-e-123-stack', 'c4-foo-123', 'c4-foo-456' ] MockBotoCloudFormationClient.setup_boto3_mocked_stacks( boto3=mocked_boto3, mock_stack_names=mock_stack_names) with mock.patch.object(cloudformation_utils, "boto3", mocked_boto3): manager = cloudformation_utils.C4OrchestrationManager() all_stacks = manager.all_stacks() assert sorted(s.name for s in all_stacks) == ['c4-foo-123', 'c4-foo-456']
def test_c4_orchestration_manager_get_stack_output(): mocked_boto3 = MockBoto3() with mock.patch.object(cloudformation_utils, "boto3", mocked_boto3): manager = cloudformation_utils.C4OrchestrationManager() mock_outputs = [{ 'OutputKey': 'alpha', 'OutputValue': 'one' }, { 'OutputKey': 'beta', 'OutputValue': 'two' }] s = MockBotoCloudFormationStack('foo', mock_outputs=mock_outputs) assert manager.get_stack_output(s, 'alpha') == 'one' assert manager.get_stack_output(s, 'beta') == 'two' assert manager.get_stack_output(s, 'gamma') is None
def extract(stack_name): stack = MockBotoCloudFormationStack(stack_name) manager = cloudformation_utils.C4OrchestrationManager() return manager._extract_stack_name_token( stack) # noQA - I know this is protected. Just testing it.