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')
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/')
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')
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'])
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
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
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
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')
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
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
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)
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
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 })
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
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'}}, )
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'}}, )
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')
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])
import sys from cdflow_commands.cli import run run(sys.argv[1:])