def test_component_taupage_auto_scaling_group_user_data_with_lists_and_empty_dict(): configuration = { 'resources': ['A', {"Ref": "Res1"}], 'ports': {} } expected_user_data = {'Fn::Join': ['', [ '#taupage-ami-config\nports: {}\nresources:\n- A\n- ', {'Ref': 'Res1'}, '\n']]} assert expected_user_data == generate_user_data(configuration, 'region')
def test_component_taupage_auto_scaling_group_user_data_with_lists_and_empty_dict(): configuration = { 'resources': ['A', {"Ref": "Res1"}], 'ports': {} } expected_user_data = {'Fn::Join': ['', [ '#taupage-ami-config\nports: {}\nresources:\n- A\n- ', {'Ref': 'Res1'}, '\n']]} assert expected_user_data == generate_user_data(configuration, 'region')
def test_component_taupage_auto_scaling_group_user_data_without_ref(): configuration = { 'runtime': 'Docker', 'environment': { 'ENV3': "r3" } } expected_user_data = '#taupage-ami-config\nenvironment:\n ENV3: r3\nruntime: Docker\n' assert expected_user_data == generate_user_data(configuration, 'region')
def test_component_taupage_auto_scaling_group_user_data_without_ref(): configuration = { 'runtime': 'Docker', 'environment': { 'ENV3': "r3" } } expected_user_data = '#taupage-ami-config\nenvironment:\n ENV3: r3\nruntime: Docker\n' assert expected_user_data == generate_user_data(configuration, 'region')
def test_component_taupage_auto_scaling_group_user_data_with_ref(): configuration = { 'runtime': 'Docker', 'source': { 'Fn::Join': [ '/', [ 'pierone.stups.zalan.do', 'cool', { 'Fn::GetAtt': ['Obj1', 'Attr1'] } ] ] }, 'mint_bucket': { 'Ref': 'REF1' }, 'environment': { 'ENV1': { 'Fn::GetAtt': ['Obj2', 'Attr2'] }, 'ENV2': { 'Ref': 'REF2' }, 'ENV3': "r3" } } expected_user_data = { 'Fn::Join': [ '', [ '#taupage-ami-config\nenvironment:\n ENV1: ', { 'Fn::GetAtt': ['Obj2', 'Attr2'] }, '\n ENV2: ', { 'Ref': 'REF2' }, '\n ENV3: r3\nmint_bucket: ', { 'Ref': 'REF1' }, '\nruntime: Docker\nsource: ', { 'Fn::Join': [ '/', [ 'pierone.stups.zalan.do', 'cool', { 'Fn::GetAtt': ['Obj1', 'Attr1'] } ] ] }, '\n' ] ] } assert expected_user_data == generate_user_data(configuration)
def extract_user_data(configuration, elastigroup_config, info: dict, force, account_info): """ This function converts a classic TaupageConfig into a base64 encoded value for the compute.launchSpecification.userData See https://api.spotinst.com/elastigroup/amazon-web-services/create/#compute.launchSpecification.userData Any existing TaupageConfig will _always_ overwrite the userData for the Elastigroup """ elastigroup_config = ensure_keys(elastigroup_config, "compute", "launchSpecification") taupage_config = configuration.get("TaupageConfig", None) if taupage_config: if 'notify_cfn' not in taupage_config: taupage_config['notify_cfn'] = { 'stack': '{}-{}'.format(info["StackName"], info["StackVersion"]), 'resource': configuration['Name'] } if 'application_id' not in taupage_config: taupage_config['application_id'] = info['StackName'] if 'application_version' not in taupage_config: taupage_config['application_version'] = info['StackVersion'] check_application_id(taupage_config['application_id']) check_application_version(taupage_config['application_version']) runtime = taupage_config.get('runtime') if runtime != 'Docker': raise click.UsageError( 'Taupage only supports the "Docker" runtime currently') source = taupage_config.get('source') if not source: raise click.UsageError( 'The "source" property of TaupageConfig must be specified') docker_image = pierone.api.DockerImage.parse(source) if not force and docker_image.registry: check_docker_image_exists(docker_image) user_data = base64.urlsafe_b64encode( generate_user_data(taupage_config, account_info.Region).encode('utf-8')) elastigroup_config["compute"]["launchSpecification"][ "userData"] = user_data.decode('utf-8')
def test_component_taupage_auto_scaling_group_user_data_with_ref(): configuration = { 'runtime': 'Docker', 'source': {'Fn::Join': ['/', ['pierone.stups.zalan.do', 'cool', {'Fn::GetAtt': ['Obj1', 'Attr1']}]]}, 'mint_bucket': {'Ref': 'REF1'}, 'environment': { 'ENV1': {'Fn::GetAtt': ['Obj2', 'Attr2']}, 'ENV2': {'Ref': 'REF2'}, 'ENV3': "r3" } } expected_user_data = { 'Fn::Join': ['', [ '#taupage-ami-config\nenvironment:\n ENV1: ', {'Fn::GetAtt': ['Obj2', 'Attr2']}, '\n ENV2: ', {'Ref': 'REF2'}, '\n ENV3: r3\nmint_bucket: ', {'Ref': 'REF1'}, '\nruntime: Docker\nsource: ', {'Fn::Join': ['/', ['pierone.stups.zalan.do', 'cool', {'Fn::GetAtt': ['Obj1', 'Attr1']}]]}, '\n']]} assert expected_user_data == generate_user_data(configuration, 'region')
def extract_user_data(configuration, elastigroup_config, info: dict, force, account_info): """ This function converts a classic TaupageConfig into a base64 encoded value for the compute.launchSpecification.userData See https://api.spotinst.com/elastigroup/amazon-web-services/create/#compute.launchSpecification.userData Any existing TaupageConfig will _always_ overwrite the userData for the Elastigroup """ elastigroup_config = ensure_keys(elastigroup_config, "compute", "launchSpecification") taupage_config = configuration.get("TaupageConfig", None) if taupage_config: if 'notify_cfn' not in taupage_config: taupage_config['notify_cfn'] = {'stack': '{}-{}'.format(info["StackName"], info["StackVersion"]), 'resource': configuration['Name']} if 'application_id' not in taupage_config: taupage_config['application_id'] = info['StackName'] if 'application_version' not in taupage_config: taupage_config['application_version'] = info['StackVersion'] check_application_id(taupage_config['application_id']) check_application_version(taupage_config['application_version']) runtime = taupage_config.get('runtime') if runtime != 'Docker': raise click.UsageError('Taupage only supports the "Docker" runtime currently') source = taupage_config.get('source') if not source: raise click.UsageError('The "source" property of TaupageConfig must be specified') docker_image = pierone.api.DockerImage.parse(source) if not force and docker_image.registry: check_docker_image_exists(docker_image) user_data = base64.urlsafe_b64encode(generate_user_data(taupage_config, account_info.Region).encode('utf-8')) elastigroup_config["compute"]["launchSpecification"]["userData"] = user_data.decode('utf-8')