コード例 #1
0
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')
コード例 #2
0
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'
コード例 #3
0
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']
コード例 #4
0
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']
コード例 #5
0
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
コード例 #6
0
 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.