def test_load_config_syntax_error(): filename = 'tests/resources/boss-badsyntax.yml' with assert_raises(bc.ConfigurationError) as r: bc.load_config(filename) expected = "expected token 'end of print statement', got ':', line 4" assert_true(expected in r.exception.message)
def test_load_config_not_found(): nosuchfile = random_alphanum(100) with assert_raises(bc.ConfigurationError) as r: bc.load_config(nosuchfile) assert_equal(r.exception.message, 'Error loading {}: not found'.format(nosuchfile))
def test_load_config_validation_error1(): filename = 'tests/resources/boss-bad1.yml' with assert_raises(bc.ConfigurationError) as r: bc.load_config(filename) expected = "required key not provided @ data['platforms'][0]['name']" assert_true(expected in r.exception.message)
def test_load_config_validation_error2(): filename = 'tests/resources/boss-bad2.yml' with assert_raises(bc.ConfigurationError) as r: bc.load_config(filename) expected = "Error validating {}: expected bool" assert_true(expected.format(filename) in r.exception.message)
def test_load_config_validation_error2(): filename = 'tests/resources/boss-bad2.yml' with assert_raises(bc.ConfigurationError) as r: bc.load_config(filename) expected = "Error validating {}: expected bool" assert_true(expected.format(filename) in r.exception.message)
def test_load_config_validation_error1(): filename = 'tests/resources/boss-bad1.yml' with assert_raises(bc.ConfigurationError) as r: bc.load_config(filename) expected = "required key not provided @ data['platforms'][0]['name']" assert_true(expected in r.exception.message)
def test_load_config_syntax_error(): filename = 'tests/resources/boss-badsyntax.yml' with assert_raises(bc.ConfigurationError) as r: bc.load_config(filename) expected = "expected token 'end of print statement', got ':', line 4" assert_true(expected in r.exception.message)
def test_load_config_not_found(): nosuchfile = random_alphanum(100) with assert_raises(bc.ConfigurationError) as r: bc.load_config(nosuchfile) assert_equal( r.exception.message, 'Error loading {}: not found'.format(nosuchfile) )
def test_config_env_vars(): default_user = '******' override_user = '******' with mock.patch('os.environ', {}): c1 = bc.load_config('tests/resources/boss-env.yml') assert_equal(c1['amz-2015092-default']['build']['username'], default_user) with mock.patch('os.environ', {'BI_USERNAME': override_user}): c2 = bc.load_config('tests/resources/boss-env.yml') assert_equal(c2['amz-2015092-default']['build']['username'], override_user)
def test_config_env_vars(): default_user = '******' override_user = '******' with mock.patch('os.environ', {}): c1 = bc.load_config('tests/resources/boss-env.yml') assert_equal(c1['amz-2015092-default']['build']['username'], default_user) with mock.patch('os.environ', {'BI_USERNAME': override_user}): c2 = bc.load_config('tests/resources/boss-env.yml') assert_equal(c2['amz-2015092-default']['build']['username'], override_user)
def test_load_config_validation_error2(): filename = 'tests/resources/boss-bad2.yml' with assert_raises(bc.ConfigurationError) as r: bc.load_config(filename) expected = "Error validating {}: expected bool for dictionary value @ data['win-2012r2-default']['become']" assert_equal( r.exception.message, expected.format(filename) )
def test_env_vars(): default_user = '******' override_user = '******' if 'BI_USERNAME' in os.environ: del(os.environ['BI_USERNAME']) c1 = bc.load_config('tests/resources/boss-env.yml') assert_equal(c1['amz-2015092-default']['username'], default_user) os.environ['BI_USERNAME'] = override_user c2 = bc.load_config('tests/resources/boss-env.yml') assert_equal(c2['amz-2015092-default']['username'], override_user)
def ensure_current(): url = 'https://github.com/cloudboss/bossimage' is_old = False try: bc.load_config() click.echo( 'Please update your .boss.yml. Instructions are on {}.'.format( url), err=True) is_old = True except: pass if is_old: raise click.Abort()
def test_make_test(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() with assert_raises(bc.StateError) as r: bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal( r.exception.message, 'Cannot run `make test` before `make image`' ) bc.make_build(ec2, instance, config[instance]['build'], 1) # Should get another StateError because `make image` has not been run with assert_raises(bc.StateError) as r: bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal( r.exception.message, 'Cannot run `make test` before `make image`' ) bc.make_image(ec2, instance, config[instance]['image'], True) reset_probes(['create_instance', 'run_ansible']) bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal(probe.called, ['create_instance', 'run_ansible']) # As with `build`, a second run should create no new resources reset_probes(['create_instance', 'run_ansible']) bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal(probe.called, ['run_ansible']) for f in bc.instance_files(instance).values(): os.unlink(f)
def load_config(): try: c = bc.load_config() yield c except bc.ConfigurationError as e: click.echo(e, err=True) raise click.Abort()
def test_userdata(): c = bc.load_config('tests/resources/boss-userdata.yml') win_2012r2 = c['win-2012r2-default']['build'] win_2012r2_user_data = '''<powershell> winrm qc -q winrm set winrm/config \'@{MaxTimeoutms="1800000"}\' winrm set winrm/config/service \'@{AllowUnencrypted="true"}\' winrm set winrm/config/service/auth \'@{Basic="true"}\' Set-Item wsman:localhost\\client\\trustedhosts -value * -force Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False\n</powershell> ''' assert_equal(bc.user_data(win_2012r2), win_2012r2_user_data) amz_2015092 = c['amz-2015092-default']['build'] amz_2015092_user_data = '''#!/bin/sh pip install ansible ''' assert_equal(bc.user_data(amz_2015092), amz_2015092_user_data) centos_6 = c['centos-6-default']['build'] centos_6_user_data = '''#cloud-config system_info: default_user: name: ec2-user ''' assert_equal(bc.user_data(centos_6), centos_6_user_data) centos_7 = c['centos-7-default']['build'] assert_equal(bc.user_data(centos_7), '')
def test_make_test(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() with assert_raises(bc.StateError) as r: bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal(r.exception.message, 'Cannot run `make test` before `make image`') bc.make_build(ec2, instance, config[instance]['build'], 1) # Should get another StateError because `make image` has not been run with assert_raises(bc.StateError) as r: bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal(r.exception.message, 'Cannot run `make test` before `make image`') bc.make_image(ec2, instance, config[instance]['image'], True) reset_probes(['create_instance', 'run_ansible']) bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal(probe.called, ['create_instance', 'run_ansible']) # As with `build`, a second run should create no new resources reset_probes(['create_instance', 'run_ansible']) bc.make_test(ec2, instance, config[instance]['test'], 1) assert_equal(probe.called, ['run_ansible']) for f in bc.instance_files(instance).values(): os.unlink(f)
def load_config(): try: c = bc.load_config() yield c except bc.ConfigurationError as e: click.echo(e, err=True) raise click.Abort()
def test_userdata(): c = bc.load_config('tests/resources/boss-userdata.yml') win_2012r2 = c['win-2012r2-default']['build'] win_2012r2_user_data = '''<powershell> winrm qc -q winrm set winrm/config \'@{MaxTimeoutms="1800000"}\' winrm set winrm/config/service \'@{AllowUnencrypted="true"}\' winrm set winrm/config/service/auth \'@{Basic="true"}\' Set-Item wsman:localhost\\client\\trustedhosts -value * -force Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False\n</powershell> ''' assert_equal(bc.user_data(win_2012r2), win_2012r2_user_data) amz_2015092 = c['amz-2015092-default']['build'] amz_2015092_user_data = '''#!/bin/sh pip install ansible ''' assert_equal(bc.user_data(amz_2015092), amz_2015092_user_data) centos_6 = c['centos-6-default']['build'] centos_6_user_data = '''#cloud-config system_info: default_user: name: ec2-user ''' assert_equal(bc.user_data(centos_6), centos_6_user_data) centos_7 = c['centos-7-default']['build'] assert_equal(bc.user_data(centos_7), '')
def test_merge_config(): expected = { 'amz-2015092-default': { 'ami_name': '%(role)s-%(profile)s-%(version)s-%(platform)s', 'associate_public_ip_address': True, 'become': True, 'block_device_mappings': [{ 'device_name': '/dev/sdf', 'ebs': { 'delete_on_termination': True, 'volume_size': 100, 'volume_type': 'gp2' } }], 'connection': 'ssh', 'connection_timeout': 600, 'extra_vars': {}, 'instance_type': 't2.micro', 'platform': 'amz-2015092', 'port': 22, 'profile': 'default', 'security_groups': [], 'source_ami': 'amzn-ami-hvm-2015.09.2.x86_64-gp2', 'subnet': '', 'username': '******', 'user_data': '', 'tags': { 'Name': 'hello', 'Description': 'A description', }, }, 'win-2012r2-default': { 'ami_name': 'ami-00000000', 'associate_public_ip_address': True, 'become': False, 'block_device_mappings': [], 'connection': 'winrm', 'connection_timeout': 300, 'extra_vars': {}, 'instance_type': 'm3.medium', 'platform': 'win-2012r2', 'port': 5985, 'profile': 'default', 'security_groups': [], 'source_ami': 'Windows_Server-2012-R2_RTM-English-64Bit-Base-2016.02.10', 'subnet': '', 'username': '******', 'user_data': '', 'tags': {}, } } c = bc.load_config('tests/resources/boss-good.yml') assert_equal(c, expected)
def test_load_config_minimal(): c = bc.load_config('tests/resources/boss-minimal.yml') expected_transformation = { 'amz-2015092-default': { 'platform': 'amz-2015092', 'profile': 'default', 'build': { 'associate_public_ip_address': True, 'become': True, 'block_device_mappings': [], 'connection': 'ssh', 'connection_timeout': 600, 'extra_vars': {}, 'iam_instance_profile': '', 'instance_type': 't2.micro', 'platform': 'amz-2015092', 'port': 22, 'profile': 'default', 'security_groups': [], 'source_ami': 'amzn-ami-hvm-2015.09.2.x86_64-gp2', 'subnet': '', 'tags': {}, 'user_data': '', 'username': '******', }, 'test': { 'associate_public_ip_address': True, 'block_device_mappings': [], 'connection': 'ssh', 'connection_timeout': 600, 'iam_instance_profile': '', 'instance_type': 't2.micro', 'playbook': 'tests/test.yml', 'port': 22, 'security_groups': [], 'subnet': '', 'tags': {}, 'user_data': '', 'username': '******', }, 'image': { 'ami_name': '%(role)s.%(profile)s.%(platform)s.%(vtype)s.%(arch)s.%(version)s', # noqa 'platform': 'amz-2015092', 'profile': 'default', }, }, } assert_equal(c, expected_transformation)
def test_make_image_no_wait(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() wait = False bc.make_build(ec2, instance, config[instance]['build'], 1) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, []) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, [])
def test_create_instance_tags(): config = bc.load_config('tests/resources/boss.yml') ec2 = ec2_connect() # win-2012r2 config has no tags reset_probes(['create_instances', 'create_tags']) bc.create_instance(ec2, config['win-2012r2-default']['build'], 'ami-00000000', 'mykey') assert_equal(probe.called, ['create_instances']) # amz-2015092 config has tags reset_probes(['create_instances', 'create_tags']) bc.create_instance(ec2, config['amz-2015092-default']['build'], 'ami-00000000', 'mykey') assert_equal(probe.called, ['create_instances', 'create_tags'])
def test_make_image_no_wait(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() wait = False bc.make_build(ec2, instance, config[instance]['build'], 1) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, []) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, [])
def test_load_config_minimal(): c = bc.load_config('tests/resources/boss-minimal.yml') expected_transformation = { 'amz-2015092-default': { 'platform': 'amz-2015092', 'profile': 'default', 'build': { 'associate_public_ip_address': True, 'become': True, 'block_device_mappings': [], 'connection': 'ssh', 'connection_timeout': 600, 'extra_vars': {}, 'iam_instance_profile': '', 'instance_type': 't2.micro', 'platform': 'amz-2015092', 'port': 22, 'profile': 'default', 'security_groups': [], 'source_ami': 'amzn-ami-hvm-2015.09.2.x86_64-gp2', 'subnet': '', 'tags': {}, 'user_data': '', 'username': '******', }, 'test': { 'associate_public_ip_address': True, 'block_device_mappings': [], 'connection': 'ssh', 'connection_timeout': 600, 'iam_instance_profile': '', 'instance_type': 't2.micro', 'playbook': 'tests/test.yml', 'port': 22, 'security_groups': [], 'subnet': '', 'tags': {}, 'user_data': '', 'username': '******', }, 'image': { 'ami_name': '%(role)s.%(profile)s.%(platform)s.%(vtype)s.%(arch)s.%(version)s', # noqa 'platform': 'amz-2015092', 'profile': 'default', }, }, } assert_equal(c, expected_transformation)
def test_make_build(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() reset_probes( ['create_keypair', 'create_instance', 'write_playbook', 'run_ansible']) bc.make_build(ec2, instance, config[instance]['build'], 1) assert_equal( probe.called, ['create_keypair', 'create_instance', 'write_playbook', 'run_ansible']) # Ensure that a second run only runs ansible without creating new resources reset_probes( ['create_keypair', 'create_instance', 'write_playbook', 'run_ansible']) bc.make_build(ec2, instance, config[instance]['build'], 1) assert_equal(probe.called, ['run_ansible'])
def test_create_instance_tags(): config = bc.load_config('tests/resources/boss.yml') ec2 = ec2_connect() # win-2012r2 config has no tags reset_probes(['create_instances', 'create_tags']) bc.create_instance( ec2, config['win-2012r2-default']['build'], 'ami-00000000', 'mykey' ) assert_equal(probe.called, ['create_instances']) # amz-2015092 config has tags reset_probes(['create_instances', 'create_tags']) bc.create_instance( ec2, config['amz-2015092-default']['build'], 'ami-00000000', 'mykey' ) assert_equal(probe.called, ['create_instances', 'create_tags'])
def test_make_build(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() reset_probes([ 'create_keypair', 'create_instance', 'write_playbook', 'run_ansible' ]) bc.make_build(ec2, instance, config[instance]['build'], 1) assert_equal(probe.called, [ 'create_keypair', 'create_instance', 'write_playbook', 'run_ansible' ]) # Ensure that a second run only runs ansible without creating new resources reset_probes([ 'create_keypair', 'create_instance', 'write_playbook', 'run_ansible' ]) bc.make_build(ec2, instance, config[instance]['build'], 1) assert_equal(probe.called, ['run_ansible'])
def test_make_image_wait(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() wait = True bc.make_build(ec2, instance, config[instance]['build'], 1) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, ['wait_for_image']) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, []) wait = False reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, []) for f in bc.instance_files(instance).values(): os.unlink(f)
def test_make_image_wait(): config = bc.load_config('tests/resources/boss.yml') instance = 'amz-2015092-default' ec2 = ec2_connect() wait = True bc.make_build(ec2, instance, config[instance]['build'], 1) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, ['wait_for_image']) reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, []) wait = False reset_probes(['wait_for_image']) bc.make_image(ec2, instance, config[instance]['image'], wait) assert_equal(probe.called, []) for f in bc.instance_files(instance).values(): os.unlink(f)
def test_merge_config(): expected = { 'win-2012r2-default': { 'platform': 'win-2012r2', 'profile': 'default', 'build': { 'username': '******', 'subnet': '', 'source_ami': 'Windows_Server-2012-R2_RTM-English-64Bit-Base-2016.02.10', # noqa 'tags': {}, 'extra_vars': {}, 'iam_instance_profile': '', 'user_data': '', 'instance_type': 'm3.medium', 'connection': 'winrm', 'profile': 'default', 'platform': 'win-2012r2', 'associate_public_ip_address': True, 'become': False, 'connection_timeout': 300, 'port': 5985, 'security_groups': [], 'block_device_mappings': [], }, 'test': { 'username': '******', 'subnet': '', 'tags': {}, 'iam_instance_profile': '', 'user_data': '', 'instance_type': 'm3.medium', 'connection': 'winrm', 'playbook': 'tests/test.yml', 'associate_public_ip_address': True, 'connection_timeout': 300, 'port': 5985, 'security_groups': [], 'block_device_mappings': [], }, 'image': { 'profile': 'default', 'platform': 'win-2012r2', 'ami_name': 'ami-00000000' }, }, 'amz-2015092-default': { 'platform': 'amz-2015092', 'profile': 'default', 'test': { 'username': '******', 'subnet': '', 'tags': { 'Name': 'hello', 'Description': 'A description' }, 'iam_instance_profile': '', 'user_data': '', 'instance_type': 't2.micro', 'connection': 'ssh', 'playbook': 'tests/test.yml', 'associate_public_ip_address': True, 'connection_timeout': 600, 'port': 22, 'security_groups': [], 'block_device_mappings': [{ 'ebs': { 'volume_size': 100, 'delete_on_termination': True, 'volume_type': 'gp2' }, 'device_name': '/dev/sdf' }] }, 'image': { 'profile': 'default', 'platform': 'amz-2015092', 'ami_name': '%(role)s-%(profile)s-%(version)s-%(platform)s' }, 'build': { 'username': '******', 'subnet': '', 'source_ami': 'amzn-ami-hvm-2015.09.2.x86_64-gp2', 'tags': { 'Name': 'hello', 'Description': 'A description' }, 'extra_vars': {}, 'iam_instance_profile': '', 'user_data': '', 'instance_type': 't2.micro', 'connection': 'ssh', 'profile': 'default', 'platform': 'amz-2015092', 'associate_public_ip_address': True, 'become': True, 'connection_timeout': 600, 'port': 22, 'security_groups': [], 'block_device_mappings': [{ 'ebs': { 'volume_size': 100, 'delete_on_termination': True, 'volume_type': 'gp2' }, 'device_name': '/dev/sdf' }] } } } c = bc.load_config('tests/resources/boss-good.yml') print(c) assert_equal(c, expected)