def test_kumo_utils_ensure_ebs_tags(cleanup_stack_ec2, awsclient): are_credentials_still_valid(awsclient) cloudformation_ec2, _ = load_cloudformation_template( here('resources/sample_ec2_cloudformation_stack/cloudformation.py') ) exit_code = deploy_stack(awsclient, {}, config_ec2, cloudformation_ec2, override_stack_policy=False) assert exit_code == 0 stack_name = _get_stack_name(config_ec2) stack_output = get_outputs_for_stack(awsclient, stack_name) instance_id = stack_output.get('InstanceId', None) assert instance_id is not None tags = [{'Key': 'kumo-test', 'Value': 'Success'}] ensure_ebs_volume_tags_ec2_instance(awsclient, instance_id, tags) client_ec2 = awsclient.get_client('ec2') volumes = client_ec2.describe_volumes(Filters=[ { 'Name': 'attachment.instance-id', 'Values': [instance_id] } ]) for vol in volumes['Volumes']: for tag in tags: assert check_volume_tagged(vol, tag)
def test_output_deployment(cleanup_stack_tenkai, awsclient, logcapture): logcapture.level = logging.INFO are_credentials_still_valid(awsclient) # Set up stack with an ec2 deployment cloudformation, _ = load_cloudformation_template( here('resources/sample_codedeploy_app/cloudformation.py')) exit_code = deploy_stack(awsclient, {}, config_sample_codeploy_stack, cloudformation, override_stack_policy=False) assert_equal(exit_code, 0) stack_name = _get_stack_name(config_sample_codeploy_stack) stack_output = get_outputs_for_stack(awsclient, stack_name) app_name = stack_output.get('ApplicationName', None) deployment_group = stack_output.get('DeploymentGroupName', None) not_working_deploy_dir = here( './resources/sample_codedeploy_app/not_working') os.chdir(not_working_deploy_dir) folders = [{'source': 'codedeploy', 'target': ''}] # test deployment which should exit with exit code 1 deploy_id_1 = tenkai_deploy(awsclient, app_name, deployment_group, 'CodeDeployDefault.AllAtOnce', '7finity-infra-dev-deployment', bundle_revision(folders)) exit_code = output_deployment_status(awsclient, deploy_id_1) assert exit_code == 1 output_deployment_summary(awsclient, deploy_id_1) output_deployment_diagnostics(awsclient, deploy_id_1, 'unknown_log_group') records = list(logcapture.actual()) assert ('gcdt.tenkai_core', 'INFO', 'Instance ID Status Most recent event') in records #assert ('gcdt.tenkai_core', 'INFO', u'\x1b[35mi-0396d1ca00089c672 \x1b[39m Failed ValidateService') in records assert ('gcdt.tenkai_core', 'INFO', u'Error Code: ScriptFailed') in records assert ('gcdt.tenkai_core', 'INFO', u'Script Name: appspec.sh') in records assert ( 'gcdt.tenkai_core', 'INFO', 'Message: Script at specified location: appspec.sh run as user root failed with exit code 1' ) in records assert ( 'gcdt.tenkai_core', 'INFO', u'Log Tail: LifecycleEvent - ApplicationStart\nScript - appspec.sh\n[stdout]LIFECYCLE_EVENT=ApplicationStart\n[stderr]mv: cannot stat \u2018not-existing-file.txt\u2019: No such file or directory\n' ) in records
def test_kumo_utils_ensure_autoscaling_ebs_tags(cleanup_stack_autoscaling, awsclient): are_credentials_still_valid(awsclient) cloudformation_autoscaling, _ = load_cloudformation_template( here('resources/sample_autoscaling_cloudformation_stack/cloudformation.py') ) exit_code = deploy_stack(awsclient, {}, config_autoscaling, cloudformation_autoscaling, override_stack_policy=False) assert exit_code == 0 stack_name = _get_stack_name(config_autoscaling) stack_output = get_outputs_for_stack(awsclient, stack_name) as_group_name = stack_output.get('AutoScalingGroupName', None) assert as_group_name is not None tags_v1 = [{'Key': 'kumo-test', 'Value': 'version1'}] ensure_ebs_volume_tags_autoscaling_group(awsclient, as_group_name, tags_v1) autoscale_filter = { 'Name': 'tag:aws:autoscaling:groupName', 'Values': [as_group_name] } client_ec2 = awsclient.get_client('ec2') response = client_ec2.describe_instances(Filters=[autoscale_filter]) for r in response['Reservations']: for i in r['Instances']: volumes = client_ec2.describe_volumes(Filters=[ { 'Name': 'attachment.instance-id', 'Values': [i['InstanceId']] } ]) for vol in volumes['Volumes']: for tag in tags_v1: assert check_volume_tagged(vol, tag) tags_v2 = [{'Key': 'kumo-test', 'Value': 'version2'}] ensure_ebs_volume_tags_autoscaling_group(awsclient, as_group_name, tags_v2) for r in response['Reservations']: for i in r['Instances']: volumes = client_ec2.describe_volumes(Filters=[ { 'Name': 'attachment.instance-id', 'Values': [i['InstanceId']] } ]) for vol in volumes['Volumes']: for tag in tags_v2: assert check_volume_tagged(vol, tag) for tag in tags_v1: assert not check_volume_tagged(vol, tag)
def test_tenkai_exit_codes(cleanup_stack_tenkai, awsclient): are_credentials_still_valid(awsclient) # Set up stack with an ec2 deployment cloudformation, _ = load_cloudformation_template( here('resources/sample_codedeploy_app/cloudformation.py')) exit_code = deploy_stack(awsclient, {}, config_sample_codeploy_stack, cloudformation, override_stack_policy=False) assert_equal(exit_code, 0) stack_name = _get_stack_name(config_sample_codeploy_stack) stack_output = get_outputs_for_stack(awsclient, stack_name) app_name = stack_output.get('ApplicationName', None) deployment_group = stack_output.get('DeploymentGroupName', None) cwd = here('.') not_working_deploy_dir = here( './resources/sample_codedeploy_app/not_working') working_deploy_dir = here('./resources/sample_codedeploy_app/working') os.chdir(not_working_deploy_dir) folders = [{'source': 'codedeploy', 'target': ''}] # test deployment which should exit with exit code 1 deploy_id_1 = tenkai_deploy(awsclient, app_name, deployment_group, 'CodeDeployDefault.AllAtOnce', '7finity-infra-dev-deployment', bundle_revision(folders)) exit_code = output_deployment_status(awsclient, deploy_id_1) assert exit_code == 1 # test deployment which should exit with exit code 0 os.chdir(working_deploy_dir) deploy_id_2 = tenkai_deploy(awsclient, app_name, deployment_group, 'CodeDeployDefault.AllAtOnce', '7finity-infra-dev-deployment', bundle_revision(folders)) exit_code = output_deployment_status(awsclient, deploy_id_2) assert exit_code == 0 os.chdir(cwd)
def test_get_outputs_for_stack(awsclient, simple_cloudformation_stack): # used in cloudformation! outputs = get_outputs_for_stack(awsclient, simple_cloudformation_stack) assert 'BucketName' in outputs assert outputs['BucketName'].startswith( 'infra-dev-kumo-sample-stack-s3bucket1-')