Ejemplo n.º 1
0
    def test_tfstate_bucket_set_up_in_dev_account_for_aslive_deployment(
            self, mock_open):
        # When
        cli.run(['deploy', 'live', '1.2.3'])

        # Then
        mock_open.assert_called_once_with('.terragrunt', 'w')
Ejemplo n.º 2
0
    def test_files_are_always_attempted_to_be_removed(self, load_manifest,
                                                      mock_sys, rmtree):
        # Given
        load_manifest.side_effect = UserFacingError

        # When
        cli.run(['release', '--platform-config', 'path/to/config', 'version'])

        # Then
        rmtree.assert_called_once_with('.terraform/')
Ejemplo n.º 3
0
    def test_deploy_is_configured_and_run(self):
        # When
        with self.assertLogs('cdflow_commands.logger', level='INFO') as logs:
            cli.run(['deploy', 'aslive', '1.2.3'])

        # Then
        self.check_call.assert_any_call(['terragrunt', 'get', 'infra'])

        image_name = ('123456789.dkr.ecr.eu-west-12.amazonaws.com/'
                      'dummy-component:1.2.3')

        self.check_call.assert_any_call(
            [
                'terragrunt', 'plan', '-var', 'component=dummy-component',
                '-var', 'env=aslive', '-var', 'aws_region=eu-west-12', '-var',
                'team=dummy-team', '-var', 'image={}'.format(image_name),
                '-var', 'version=1.2.3', '-var', 'ecs_cluster=default',
                '-var-file', 'infra/platform-config/mmg/dev/eu-west-12.json',
                '-var-file', ANY, 'infra'
            ],
            env={
                'JOB_NAME': 'dummy-job-name',
                'AWS_ACCESS_KEY_ID': self.aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': self.aws_secret_access_key,
                'AWS_SESSION_TOKEN': self.aws_session_token
            })

        self.check_call.assert_any_call(
            [
                'terragrunt', 'apply', '-var', 'component=dummy-component',
                '-var', 'env=aslive', '-var', 'aws_region=eu-west-12', '-var',
                'team=dummy-team', '-var', 'image={}'.format(image_name),
                '-var', 'version=1.2.3', '-var', 'ecs_cluster=default',
                '-var-file', 'infra/platform-config/mmg/dev/eu-west-12.json',
                '-var-file', ANY, 'infra'
            ],
            env={
                'JOB_NAME': 'dummy-job-name',
                'AWS_ACCESS_KEY_ID': self.aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': self.aws_secret_access_key,
                'AWS_SESSION_TOKEN': self.aws_session_token
            })

        assert logs.output == [
            ('INFO:cdflow_commands.logger:ECS service tasks - '
             'desired: 2 pending: 0 running: 0 previous: 0'),
            ('INFO:cdflow_commands.logger:ECS service tasks - '
             'desired: 2 pending: 0 running: 1 previous: 0'),
            ('INFO:cdflow_commands.logger:ECS service tasks - '
             'desired: 2 pending: 0 running: 2 previous: 0'),
            'INFO:cdflow_commands.logger:Deployment complete'
        ]

        self.rmtree.assert_called_once_with('.terraform/')
        self.unlink.assert_called_once_with('.terragrunt')
Ejemplo n.º 4
0
    def test_prod_session_passed_to_live_deployments(self):
        # Given
        environment_name = 'live'

        # When
        cli.run(['deploy', environment_name, '1.2.3'])

        # Then
        self.mock_sts_client.assume_role.assert_called_with(
            RoleArn='arn:aws:iam::987654321:role/admin',
            RoleSessionName=self.mock_os_deploy.environ['JOB_NAME'])
Ejemplo n.º 5
0
    def test_short_verbose_flag_in_arguments(self, load_service_metadata, _1,
                                             _2, _3):
        # Given
        load_service_metadata.side_effect = UserFacingError

        # When
        with self.assertLogs('cdflow_commands.logger', level='DEBUG') as logs:
            cli.run(['release', 'version', '-v'])

        # Then
        assert 'DEBUG:cdflow_commands.logger:Debug logging on' in logs.output
Ejemplo n.º 6
0
    def test_non_zero_exit(self, load_service_metadata, mock_sys, _1, _2):
        # Given
        load_service_metadata.side_effect = UserFacingError('Error')

        # When
        with self.assertLogs('cdflow_commands.logger', level='ERROR') as logs:
            cli.run(['release', 'version'])

        # Then
        mock_sys.exit.assert_called_once_with(1)
        expected_message = 'ERROR:cdflow_commands.logger:Error'
        assert expected_message in logs.output
Ejemplo n.º 7
0
    def test_non_zero_exit(self, load_manifest, mock_sys, _):
        # Given
        load_manifest.side_effect = UserFacingError('Error')

        # When
        with self.assertLogs('cdflow_commands.logger', level='ERROR') as logs:
            cli.run(
                ['release', '--platform-config', 'path/to/config', 'version'])

        # Then
        mock_sys.exit.assert_called_once_with(1)
        expected_message = 'ERROR:cdflow_commands.logger:Error'
        assert expected_message in logs.output
Ejemplo n.º 8
0
    def test_files_are_always_attempted_to_be_removed(self,
                                                      load_service_metadata,
                                                      mock_sys, unlink,
                                                      rmtree):
        # Given
        load_service_metadata.side_effect = UserFacingError

        # When
        cli.run(['release', 'version'])

        # Then
        rmtree.assert_called_once_with('.terraform/')
        unlink.assert_called_once_with('.terragrunt')
Ejemplo n.º 9
0
    def test_short_verbose_flag_in_arguments(self, load_manifest, _1, _2):
        # Given
        load_manifest.side_effect = UserFacingError

        # When
        with self.assertLogs('cdflow_commands.logger', level='DEBUG') as logs:
            cli.run([
                'release', '--platform-config', 'path/to/config', 'version',
                '-v'
            ])

        # Then
        assert 'DEBUG:cdflow_commands.logger:Debug logging on' in logs.output
Ejemplo n.º 10
0
    def test_missing_files_are_ignored(self, load_manifest, mock_sys, rmtree):
        # Given
        load_manifest.side_effect = UserFacingError
        rmtree.side_effect = OSError

        # When
        with self.assertLogs('cdflow_commands.logger', level='DEBUG') as logs:
            cli.run(
                ['release', '--platform-config', 'path/to/config', 'version'])

        # Then
        rmtree.assert_called_once_with('.terraform/')

        message_template = 'DEBUG:cdflow_commands.logger:No path {} to remove'
        assert message_template.format('.terraform/') in logs.output
Ejemplo n.º 11
0
    def test_destroy_is_planned_with_flag(self, *args):
        check_call_state, check_call_destroy, popen_call, TemporaryDirectory, \
            mock_assumed_session, NamedTemporaryFile_destroy, time, \
            aws_access_key_id, aws_secret_access_key, aws_session_token, \
            rmtree, component_name = self.setup_mocks(*args)

        # Given
        version = '1'

        workdir = '{}/{}-{}'.format(
            TemporaryDirectory.return_value.__enter__.return_value,
            component_name,
            version,
        )
        # When
        cli.run(['destroy', 'live', '--plan-only'])

        # Then
        popen_call.assert_called_once_with(
            [
                'terraform',
                'plan',
                '-input=false',
                '-destroy',
                '-detailed-exitcode',
                '-var',
                'env=live',
                '-var-file',
                'release.json',
                '-var-file',
                ANY,
                '-var-file',
                NamedTemporaryFile_destroy.return_value.__enter__.return_value.
                name,
                '-out',
                'plan-{}'.format(time.return_value),
                'infra',
            ],
            cwd=workdir,
            env={
                'foo': 'bar',
                'AWS_ACCESS_KEY_ID': aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': aws_secret_access_key,
                'AWS_SESSION_TOKEN': aws_session_token,
                'AWS_DEFAULT_REGION': mock_assumed_session.region_name,
            },
            stdout=PIPE,
            stderr=PIPE)
Ejemplo n.º 12
0
    def test_missing_files_are_ignored(self, load_service_metadata, mock_sys,
                                       unlink, rmtree):
        # Given
        load_service_metadata.side_effect = UserFacingError
        unlink.side_effect = OSError
        rmtree.side_effect = OSError

        # When
        with self.assertLogs('cdflow_commands.logger', level='DEBUG') as logs:
            cli.run(['release', 'version'])

        # Then
        rmtree.assert_called_once_with('.terraform/')
        unlink.assert_called_once_with('.terragrunt')

        message_template = 'DEBUG:cdflow_commands.logger:No path {} to remove'
        assert message_template.format('.terraform/') in logs.output
        assert message_template.format('.terragrunt') in logs.output
Ejemplo n.º 13
0
    def test_deploy_is_configured_and_run(self):
        # Given

        # When
        cli.run([
            'deploy', 'aslive', '--var', 'raindrops=roses', '--var',
            'whiskers=kittens'
        ])

        # Then
        self.check_call.assert_any_call(['terragrunt', 'get', 'infra'])

        self.check_call.assert_any_call(
            [
                'terragrunt', 'plan', '-var', 'component=dummy-component',
                '-var', 'env=aslive', '-var', 'aws_region=eu-west-12', '-var',
                'team=dummy-team', '-var-file',
                'infra/platform-config/mmg/dev/eu-west-12.json', '-var-file',
                ANY, '-var', 'raindrops=roses', '-var', 'whiskers=kittens',
                'infra'
            ],
            env={
                'JOB_NAME': 'dummy-job-name',
                'AWS_ACCESS_KEY_ID': self.aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': self.aws_secret_access_key,
                'AWS_SESSION_TOKEN': self.aws_session_token
            })

        self.check_call.assert_any_call(
            [
                'terragrunt', 'apply', '-var', 'component=dummy-component',
                '-var', 'env=aslive', '-var', 'aws_region=eu-west-12', '-var',
                'team=dummy-team', '-var-file',
                'infra/platform-config/mmg/dev/eu-west-12.json', '-var-file',
                ANY, '-var', 'raindrops=roses', '-var', 'whiskers=kittens',
                'infra'
            ],
            env={
                'JOB_NAME': 'dummy-job-name',
                'AWS_ACCESS_KEY_ID': self.aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': self.aws_secret_access_key,
                'AWS_SESSION_TOKEN': self.aws_session_token
            })
Ejemplo n.º 14
0
    def test_release_is_a_no_op(self, check_output, mock_open,
                                Session_from_cli, _1, _2):
        mock_metadata_file = MagicMock(spec=TextIOWrapper)
        metadata = {
            'TEAM': 'dummy-team',
            'TYPE': 'infrastructure',
            'REGION': 'eu-west-12',
            'ACCOUNT_PREFIX': 'mmg'
        }
        mock_metadata_file.read.return_value = json.dumps(metadata)

        mock_dev_file = MagicMock(spec=TextIOWrapper)
        dev_config = {
            'platform_config': {
                'account_id': 123456789,
            }
        }
        mock_dev_file.read.return_value = json.dumps(dev_config)

        mock_prod_file = MagicMock(spec=TextIOWrapper)
        prod_config = {
            'platform_config': {
                'account_id': 987654321,
            }
        }
        mock_prod_file.read.return_value = json.dumps(prod_config)

        mock_open.return_value.__enter__.side_effect = (
            f for f in (mock_metadata_file, mock_dev_file, mock_prod_file))

        mock_root_session = Mock()
        mock_root_session.region_name = 'eu-west-12'
        Session_from_cli.return_value = mock_root_session

        with self.assertLogs('cdflow_commands.logger', level='INFO') as logs:
            cli.run(['release'])

        message = ('INFO:cdflow_commands.logger:'
                   'Release takes no action on infrastructure type project')
        assert message in logs.output
Ejemplo n.º 15
0
    def test_release_package_is_created(self, check_output, mock_open_config,
                                        Session_from_config, Session_from_cli,
                                        rmtree, mock_os, mock_open_release,
                                        make_archive, check_call, copytree,
                                        mock_os_release, mock_os_lambda,
                                        ZipFile, check_output_cli, _):
        # Given
        mock_metadata_file = MagicMock(spec=TextIOWrapper)
        metadata = {
            'account-scheme-url': 's3://bucket/key',
            'team': 'your-team',
            'type': 'lambda',
        }
        mock_metadata_file.read.return_value = yaml.dump(metadata)

        mock_open_config.return_value.__enter__.return_value = \
            mock_metadata_file

        check_output_cli.return_value = 'hash\n'.encode('utf-8')

        mock_root_session = Mock()
        mock_root_session.region_name = 'us-east-1'

        mock_s3_body = Mock()
        mock_s3_body.read.return_value = json.dumps({
            'accounts': {
                'foodev': {
                    'id': '123456789',
                    'role': 'admin',
                }
            },
            'release-account':
            'foodev',
            'release-bucket':
            'releases',
            'default-region':
            'us-north-4',
            'lambda-bucket':
            'dummy-lambda-bucket',
            'environments': {
                'live': 'foodev',
            },
            'terraform-backend-s3-bucket':
            'tfstate-bucket',
            'terraform-backend-s3-dynamodb-table':
            'tflocks-table',
            'classic-metadata-handling':
            True,
        })

        mock_s3_resource = Mock()
        mock_s3_resource.Object.return_value.get.return_value = {
            'Body': mock_s3_body,
        }
        mock_root_session.resource.return_value = mock_s3_resource

        Session_from_cli.return_value = mock_root_session

        mock_s3_client = Mock()
        mock_s3_client.list_buckets.return_value = {
            'Buckets': [],
            'Owner': {
                'DisplayName': 'string',
                'ID': 'string'
            }
        }

        mock_session = Mock()
        mock_session.client.return_value = mock_s3_client
        Session_from_config.return_value = mock_session

        mock_sts = Mock()
        mock_sts.get_caller_identity.return_value = {
            u'UserId': 'foo',
            'Arn': 'dummy_arn'
        }
        mock_sts.assume_role.return_value = {
            'Credentials': {
                'AccessKeyId': 'dummy-access-key-id',
                'SecretAccessKey': 'dummy-secret-access-key',
                'SessionToken': 'dummy-session-token',
                'Expiration': datetime(2015, 1, 1)
            },
            'AssumedRoleUser': {
                'AssumedRoleId': 'dummy-assumed-role-id',
                'Arn': 'dummy-arn'
            },
            'PackedPolicySize': 123
        }
        mock_root_session.client.return_value = mock_sts

        component_name = 'dummy-component'
        version = '6.1.7'

        make_archive.return_value = '/tmp/tmpvyzXQB/{}-{}.zip'.format(
            component_name, version)

        mock_os_release.environ = {'CDFLOW_IMAGE_DIGEST': 'hash'}

        # When
        cli.run([
            'release', '--platform-config', 'path/to/config', version, '-c',
            component_name
        ])

        # Then
        mock_s3_client.upload_file.assert_called_once_with(
            ZipFile.return_value.__enter__.return_value.filename,
            'dummy-lambda-bucket', 'dummy-component/dummy-component-6.1.7.zip')

        mock_session.resource.return_value.Object.assert_called_once_with(
            'releases', '{}/{}-{}.zip'.format(component_name, component_name,
                                              version))

        mock_session.resource.return_value.Object.return_value\
            .upload_file.assert_called_once_with(
                make_archive.return_value,
                ExtraArgs={'Metadata': {'cdflow_image_digest': 'hash'}},
            )
Ejemplo n.º 16
0
    def test_enters_shell(self, pty, atexit, check_output_state,
                          NamedTemporaryFile_state, chdir, cli_getcwd,
                          config_check_output, Session_from_config,
                          Session_from_cli, _open, check_call_state, copytree,
                          copy):
        cli_getcwd.return_value = '/tmp/'

        config_check_output.return_value = (
            '[email protected]:org/my-component.git').encode('utf-8')

        Session_from_config.return_value.get_credentials.return_value = creds(
            'access-key',
            'secret-key',
            'token',
        )
        Session_from_config.return_value.region_name = 'eu-central-2'

        mock_metadata_file = MagicMock(spec=TextIOWrapper)
        metadata = {
            'account-scheme-url': 's3://bucket/key',
            'team': 'your-team',
            'type': 'docker',
        }
        mock_metadata_file.read.return_value = yaml.dump(metadata)
        mock_metadata_file_open = MagicMock()
        mock_metadata_file_open.__enter__.return_value = mock_metadata_file
        _open.return_value = mock_metadata_file_open

        account_scheme = {
            'accounts': {
                'foodev': {
                    'id': '123456789',
                    'role': 'admin',
                }
            },
            'release-account': 'foodev',
            'release-bucket': 'releases',
            'default-region': 'us-north-4',
            'environments': {
                'live': 'foodev',
            },
            'terraform-backend-s3-bucket': 'tfstate-bucket',
            'terraform-backend-s3-dynamodb-table': 'tflocks-table',
        }

        mock_account_scheme = MagicMock(spec=TextIOWrapper)
        mock_account_scheme.read.return_value = json.dumps(account_scheme)
        mock_account_scheme_open = MagicMock()
        mock_account_scheme_open.__enter__.return_value = mock_account_scheme

        mock_sts_client = Mock()
        mock_sts_client.get_caller_identity.return_value = {
            u'UserId': 'foo',
            'Arn': 'dummy_arn'
        }
        mock_sts_client.assume_role.return_value = {
            'Credentials': {
                'AccessKeyId': 'dummy-access-key',
                'SecretAccessKey': 'dummy-secret-key',
                'SessionToken': 'dummy-session-token',
            }
        }

        mock_root_session = Mock()
        mock_root_session.client.return_value = mock_sts_client
        mock_root_session.region_name = 'eu-west-12'

        mock_s3_body = Mock()
        mock_s3_body.read.return_value = json.dumps(account_scheme)

        mock_s3_resource = Mock()
        mock_s3_resource.Object.return_value.get.return_value = {
            'Body': mock_s3_body,
        }
        mock_root_session.resource.return_value = mock_s3_resource
        Session_from_cli.return_value = mock_root_session

        check_output_state.return_value = '* default\n  live'.encode('utf-8')

        cli.run(['shell', 'live', '-v'])

        check_call_state.assert_any_call(
            [
                'terraform',
                'init',
                '-get=true',
                '-get-plugins=true',
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
            ],
            cwd=ANY,
        )

        check_call_state.assert_any_call(
            [
                'terraform',
                'workspace',
                'select',
                'live',
                ANY,
            ],
            cwd=ANY,
        )

        pty.spawn.assert_called_once()

        mock_sts_client.assume_role.assert_called_with(
            DurationSeconds=14400,
            RoleArn='arn:aws:iam::123456789:role/admin',
            RoleSessionName=ANY,
        )
    def test_deploy_is_configured_and_run(self, *args):
        check_call_state, check_call_deploy, popen_call, TemporaryDirectory, \
            mock_assumed_session, NamedTemporaryFile_deploy, time, \
            aws_access_key_id, aws_secret_access_key, aws_session_token, \
            rmtree, component_name = self.setup_mocks(*args)

        # Given
        version = '1.2.3'

        workdir = '{}/{}-{}'.format(
            TemporaryDirectory.return_value.__enter__.return_value,
            component_name,
            version,
        )

        # When
        cli.run(['deploy', 'live', version])

        # Then
        check_call_state.assert_any_call(
            [
                'terraform',
                'init',
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                ANY,
                join(workdir, INFRASTRUCTURE_DEFINITIONS_PATH),
            ],
            cwd=workdir,
        )

        popen_call.assert_any_call(
            [
                'terraform',
                'plan',
                '-input=false',
                '-var',
                'env=live',
                '-var-file',
                'release.json',
                '-var-file',
                ANY,
                '-var-file',
                NamedTemporaryFile_deploy.return_value.__enter__.return_value.
                name,
                '-out',
                'plan-{}'.format(time.return_value),
                'infra',
            ],
            cwd=workdir,
            env={
                'foo': 'bar',
                'AWS_ACCESS_KEY_ID': aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': aws_secret_access_key,
                'AWS_SESSION_TOKEN': aws_session_token,
                'AWS_DEFAULT_REGION': mock_assumed_session.region_name
            },
            stdout=PIPE,
            stderr=PIPE)

        check_call_deploy.assert_any_call(
            [
                'terraform',
                'apply',
                '-input=false',
                'plan-{}'.format(time.return_value),
            ],
            env={
                'foo': 'bar',
                'AWS_ACCESS_KEY_ID': aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': aws_secret_access_key,
                'AWS_SESSION_TOKEN': aws_session_token,
                'AWS_DEFAULT_REGION': mock_assumed_session.region_name,
            },
            cwd=workdir,
        )

        rmtree.assert_called_once_with('.terraform/')
    def test_release_is_configured_and_created(
            self, check_call, check_output, mock_open, Session_from_config,
            Session_from_cli, rmtree, mock_os, mock_open_release, make_archive,
            check_call_release, copytree, mock_os_release, check_output_cli,
            _):
        mock_metadata_file = MagicMock(spec=TextIOWrapper)
        metadata = {
            'account-scheme-url': 's3://bucket/key',
            'team': 'your-team',
            'type': 'docker',
        }
        mock_metadata_file.read.return_value = yaml.dump(metadata)

        mock_open.return_value.__enter__.return_value = mock_metadata_file

        mock_root_session = Mock()
        mock_root_session.region_name = 'us-east-1'
        Session_from_cli.return_value = mock_root_session

        mock_s3_body = Mock()
        mock_s3_body.read.return_value = json.dumps({
            'accounts': {
                'foodev': {
                    'id': '123456789',
                    'role': 'admin',
                }
            },
            'release-account':
            'foodev',
            'release-bucket':
            'releases',
            'default-region':
            'us-north-4',
            'environments': {
                'live': 'foodev',
            },
            'terraform-backend-s3-bucket':
            'tfstate-bucket',
            'terraform-backend-s3-dynamodb-table':
            'tflocks-table',
            'classic-metadata-handling':
            True,
        })

        mock_s3_resource = Mock()
        mock_s3_resource.Object.return_value.get.return_value = {
            'Body': mock_s3_body,
        }
        mock_root_session.resource.return_value = mock_s3_resource

        mock_ecr_client = Mock()
        mock_ecr_client.get_authorization_token.return_value = {
            'authorizationData': [{
                'authorizationToken': 'dXNlcm5hbWU6cGFzc3dvcmQ=',
                'proxyEndpoint': 'dummy-endpoint'
            }]
        }

        mock_session = Mock()
        mock_session.client.return_value = mock_ecr_client
        Session_from_config.return_value = mock_session

        mock_sts = Mock()
        user_id = 'foo'
        mock_sts.get_caller_identity.return_value = {
            u'UserId': user_id,
            'Arn': 'dummy_arn'
        }
        mock_sts.assume_role.return_value = {
            'Credentials': {
                'AccessKeyId': 'dummy-access-key-id',
                'SecretAccessKey': 'dummy-secret-access-key',
                'SessionToken': 'dummy-session-token',
                'Expiration': datetime(2015, 1, 1)
            },
            'AssumedRoleUser': {
                'AssumedRoleId': 'dummy-assumed-role-id',
                'Arn': 'dummy-arn'
            },
            'PackedPolicySize': 123
        }
        mock_root_session.client.return_value = mock_sts

        mock_release_file = MagicMock(spec=TextIOWrapper)
        mock_open_release.return_value.__enter__.return_value = \
            mock_release_file

        component_name = 'dummy-component'
        version = '1.2.3'

        make_archive.return_value = '/tmp/tmpvyzXQB/{}-{}.zip'.format(
            component_name, version)

        mock_os_release.environ = {'CDFLOW_IMAGE_DIGEST': 'hash'}

        check_output_cli.return_value = 'hash\n'.encode('utf-8')

        image_name = '{}.dkr.ecr.{}.amazonaws.com/{}:{}'.format(
            123456789, 'us-north-4', component_name, version)

        cli.run([
            'release', '--platform-config', 'path/to/config', version, '-c',
            component_name
        ])

        check_output_cli.assert_called_once_with(['git', 'rev-parse', 'HEAD'])

        mock_sts.assume_role.assert_called_once_with(
            DurationSeconds=14400,
            RoleArn='arn:aws:iam::123456789:role/admin',
            RoleSessionName=user_id,
        )

        check_call.assert_any_call(['docker', 'build', '-t', image_name, '.'])
        check_call.assert_any_call(['docker', 'push', image_name])

        mock_session.resource.return_value.Object.assert_called_once_with(
            'releases', '{}/{}-{}.zip'.format(component_name, component_name,
                                              version))

        mock_session.resource.return_value.Object.return_value\
            .upload_file.assert_called_once_with(
                make_archive.return_value,
                ExtraArgs={'Metadata': {'cdflow_image_digest': 'hash'}},
            )
Ejemplo n.º 19
0
    def test_destroy_is_configured_and_run(self, check_output, check_call,
                                           mock_open, Session_from_config,
                                           Session_from_cli, mock_os_cli,
                                           mock_os_deploy, _, unlink, rmtree):
        # Given
        mock_os_cli.environ = {'JOB_NAME': 'dummy-job-name'}
        mock_os_deploy.environ = {}

        mock_metadata_file = MagicMock(spec=TextIOWrapper)
        metadata = {
            'TEAM': 'dummy-team',
            'TYPE': 'docker',
            'REGION': 'eu-west-12',
            'ACCOUNT_PREFIX': 'mmg'
        }
        mock_metadata_file.read.return_value = json.dumps(metadata)

        mock_dev_file = MagicMock(spec=TextIOWrapper)
        dev_config = {
            'platform_config': {
                'account_id': 123456789,
            }
        }
        mock_dev_file.read.return_value = json.dumps(dev_config)

        mock_prod_file = MagicMock(spec=TextIOWrapper)
        prod_config = {
            'platform_config': {
                'account_id': 987654321,
            }
        }
        mock_prod_file.read.return_value = json.dumps(prod_config)

        mock_open.return_value.__enter__.side_effect = (
            f for f in (mock_metadata_file, mock_dev_file, mock_prod_file))

        mock_sts_client = Mock()
        mock_sts_client.assume_role.return_value = {
            'Credentials': {
                'AccessKeyId': 'dummy-access-key',
                'SecretAccessKey': 'dummy-secret-key',
                'SessionToken': 'dummy-session-token',
            }
        }

        mock_root_session = Mock()
        mock_root_session.client.return_value = mock_sts_client
        mock_root_session.region_name = 'eu-west-12'
        Session_from_cli.return_value = mock_root_session

        aws_access_key_id = 'dummy-access-key-id'
        aws_secret_access_key = 'dummy-secret-access-key'
        aws_session_token = 'dummy-session-token'
        mock_assumed_session = Mock()
        mock_assumed_session.region_name = 'eu-west-12'
        mock_assumed_session.get_credentials.return_value = BotoCreds(
            aws_access_key_id, aws_secret_access_key, aws_session_token)

        Session_from_config.return_value = mock_assumed_session

        component_name = 'dummy-component'

        check_output.return_value = '[email protected]:org/{}.git'.format(
            component_name).encode('utf-8')

        # When
        cli.run(['destroy', 'aslive'])

        # Then
        check_call.assert_any_call(
            [
                'terragrunt', 'plan', '-destroy', '-var',
                'aws_region=eu-west-12', '/cdflow/tf-destroy'
            ],
            env={
                'AWS_ACCESS_KEY_ID': aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': aws_secret_access_key,
                'AWS_SESSION_TOKEN': aws_session_token
            })

        check_call.assert_any_call(
            [
                'terragrunt', 'destroy', '-force', '-var',
                'aws_region=eu-west-12', '/cdflow/tf-destroy'
            ],
            env={
                'AWS_ACCESS_KEY_ID': aws_access_key_id,
                'AWS_SECRET_ACCESS_KEY': aws_secret_access_key,
                'AWS_SESSION_TOKEN': aws_session_token
            })

        rmtree.assert_called_once_with('.terraform/')
        unlink.assert_called_once_with('.terragrunt')
Ejemplo n.º 20
0
    def test_release_uses_component_name_from_origin(self, check_call,
                                                     check_output, mock_open,
                                                     Session_from_config,
                                                     Session_from_cli, mock_os,
                                                     _1, _2):
        mock_metadata_file = MagicMock(spec=TextIOWrapper)
        metadata = {
            'TEAM': 'dummy-team',
            'TYPE': 'docker',
            'REGION': 'eu-west-12',
            'ACCOUNT_PREFIX': 'mmg'
        }
        mock_metadata_file.read.return_value = json.dumps(metadata)

        mock_dev_file = MagicMock(spec=TextIOWrapper)
        dev_config = {
            'platform_config': {
                'account_id': 123456789,
            }
        }
        mock_dev_file.read.return_value = json.dumps(dev_config)

        mock_prod_file = MagicMock(spec=TextIOWrapper)
        prod_config = {
            'platform_config': {
                'account_id': 987654321,
            }
        }
        mock_prod_file.read.return_value = json.dumps(prod_config)

        mock_open.return_value.__enter__.side_effect = (
            f for f in (mock_metadata_file, mock_dev_file, mock_prod_file))

        mock_root_session = Mock()
        mock_root_session.region_name = 'eu-west-12'
        Session_from_cli.return_value = mock_root_session

        mock_ecr_client = Mock()
        mock_ecr_client.get_authorization_token.return_value = {
            'authorizationData': [{
                'authorizationToken': 'dXNlcm5hbWU6cGFzc3dvcmQ=',
                'proxyEndpoint': 'dummy-endpoint'
            }]
        }

        mock_session = Mock()
        mock_session.client.return_value = mock_ecr_client
        Session_from_config.return_value = mock_session

        mock_sts = Mock()
        mock_sts.assume_role.return_value = {
            'Credentials': {
                'AccessKeyId': 'dummy-access-key-id',
                'SecretAccessKey': 'dummy-secret-access-key',
                'SessionToken': 'dummy-session-token',
                'Expiration': datetime(2015, 1, 1)
            },
            'AssumedRoleUser': {
                'AssumedRoleId': 'dummy-assumed-role-id',
                'Arn': 'dummy-arn'
            },
            'PackedPolicySize': 123
        }
        mock_root_session.client.return_value = mock_sts

        mock_os.environ = {'JOB_NAME': 'dummy-job-name'}

        component_name = 'dummy-component'
        version = '1.2.3'

        check_output.return_value = '[email protected]:org/{}.git'.format(
            component_name).encode('utf-8')

        cli.run(['release', version])

        image_name = '{}.dkr.ecr.{}.amazonaws.com/{}:{}'.format(
            123456789, 'eu-west-12', component_name, version)

        check_call.assert_any_call(['docker', 'build', '-t', image_name, '.'])
        check_call.assert_any_call(['docker', 'push', image_name])
Ejemplo n.º 21
0
import sys

from cdflow_commands.cli import run

run(sys.argv[1:])