From fcbead3871c995f4da423c9fffe9ed444407a5ce Mon Sep 17 00:00:00 2001 From: Roman Podolyaka Date: Fri, 11 Oct 2013 17:54:09 +0300 Subject: [PATCH] Make LaunchConfiguration resources mergeable This can be very useful for merging of Metadata to be used by optional services (e. g. to add services like tuskar to undercloud on demand). Change-Id: Ifc4016d6e994064c0772c12e668e98bf055fada9 --- examples/launchconfig1.yaml | 23 +++++++++++++++++ examples/launchconfig2.yaml | 19 ++++++++++++++ examples/launchconfig_result.yaml | 43 +++++++++++++++++++++++++++++++ merge.py | 20 ++++++++------ test_merge.bash | 1 + 5 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 examples/launchconfig1.yaml create mode 100644 examples/launchconfig2.yaml create mode 100644 examples/launchconfig_result.yaml diff --git a/examples/launchconfig1.yaml b/examples/launchconfig1.yaml new file mode 100644 index 0000000000..9127eab917 --- /dev/null +++ b/examples/launchconfig1.yaml @@ -0,0 +1,23 @@ +Parameters: + A: + Type: String + Default: test1 + B: + Type: String + Default: test2 + resource1Image: + Type: String + Default: resource1 +Resources: + notcomputeConfigBase: + Type: AWS::AutoScaling::LaunchConfiguration + Metadata: + OpenStack::Role: notcomputeConfig + a: {Ref: A} + b: {Ref: B} + resource1: + Type: OS::Nova::Server + Properties: + flavor: test_flavor + image: {Ref: resource1Image} + key_name: test_key diff --git a/examples/launchconfig2.yaml b/examples/launchconfig2.yaml new file mode 100644 index 0000000000..1681637be2 --- /dev/null +++ b/examples/launchconfig2.yaml @@ -0,0 +1,19 @@ +Parameters: + C: + Type: String + Default: test3 + resource2Image: + Type: String + Default: resource2 +Resources: + notcomputeConfigMixin: + Type: AWS::AutoScaling::LaunchConfiguration + Metadata: + OpenStack::Role: notcomputeConfig + c: {Ref: C} + resource2: + Type: OS::Nova::Server + Properties: + flavor: test_flavor + image: {Ref: resource2Image} + key_name: test_key diff --git a/examples/launchconfig_result.yaml b/examples/launchconfig_result.yaml new file mode 100644 index 0000000000..76c12b84ab --- /dev/null +++ b/examples/launchconfig_result.yaml @@ -0,0 +1,43 @@ +Description: examples/launchconfig1.yaml,examples/launchconfig2.yaml +HeatTemplateFormatVersion: '2012-12-12' +Parameters: + A: + Default: test1 + Type: String + B: + Default: test2 + Type: String + C: + Default: test3 + Type: String + resource1Image: + Default: resource1 + Type: String + resource2Image: + Default: resource2 + Type: String +Resources: + notcomputeConfig: + Metadata: + OpenStack::Role: notcomputeConfig + a: + Ref: A + b: + Ref: B + c: + Ref: C + Type: AWS::AutoScaling::LaunchConfiguration + resource1: + Properties: + flavor: test_flavor + image: + Ref: resource1Image + key_name: test_key + Type: OS::Nova::Server + resource2: + Properties: + flavor: test_flavor + image: + Ref: resource2Image + key_name: test_key + Type: OS::Nova::Server diff --git a/merge.py b/merge.py index 3b7d2dd35d..fe42b8db3b 100644 --- a/merge.py +++ b/merge.py @@ -48,6 +48,8 @@ MERGABLE_TYPES = {'OS::Nova::Server': {'image': 'image'}, 'AWS::EC2::Instance': {'image': 'ImageId'}, + 'AWS::AutoScaling::LaunchConfiguration': + {}, } @@ -119,10 +121,11 @@ for template_path in templates: new_resources = template.get('Resources', {}) for r, rbody in sorted(new_resources.items()): if rbody['Type'] in MERGABLE_TYPES: - image_key = MERGABLE_TYPES[rbody['Type']]['image'] - # XXX Assuming ImageId is always a Ref - ikey_val = end_template['Parameters'][rbody['Properties'][image_key]['Ref']] - del end_template['Parameters'][rbody['Properties'][image_key]['Ref']] + if 'image' in MERGABLE_TYPES[rbody['Type']]: + image_key = MERGABLE_TYPES[rbody['Type']]['image'] + # XXX Assuming ImageId is always a Ref + ikey_val = end_template['Parameters'][rbody['Properties'][image_key]['Ref']] + del end_template['Parameters'][rbody['Properties'][image_key]['Ref']] role = rbody.get('Metadata', {}).get('OpenStack::Role', r) role = translate_role(role) if role != r: @@ -143,9 +146,10 @@ for template_path in templates: if 'Resources' not in end_template: end_template['Resources'] = {} end_template['Resources'][role] = rbody - ikey = '%sImage' % (role) - end_template['Resources'][role]['Properties'][image_key] = {'Ref': ikey} - end_template['Parameters'][ikey] = ikey_val + if 'image' in MERGABLE_TYPES[rbody['Type']]: + ikey = '%sImage' % (role) + end_template['Resources'][role]['Properties'][image_key] = {'Ref': ikey} + end_template['Parameters'][ikey] = ikey_val elif rbody['Type'] == 'FileInclude': with open(rbody['Path']) as rfile: include_content = yaml.safe_load(rfile.read()) @@ -196,7 +200,7 @@ def fix_ref(item, old, new): for change in resource_changes: fix_ref(end_template, change[0], change[1]) - + if errors: for e in errors: sys.stderr.write("ERROR: %s\n" % e) diff --git a/test_merge.bash b/test_merge.bash index 0eeb226261..e6bfb19262 100755 --- a/test_merge.bash +++ b/test_merge.bash @@ -26,6 +26,7 @@ echo run_test "python merge.py examples/source.yaml" examples/source_lib_result.yaml run_test "python merge.py examples/source2.yaml" examples/source2_lib_result.yaml run_test "python merge.py examples/source_include_subkey.yaml" examples/source_include_subkey_result.yaml +run_test "python merge.py examples/launchconfig1.yaml examples/launchconfig2.yaml" examples/launchconfig_result.yaml echo trap - EXIT exit $fail