merge.py --hot to process and generate HOT
authorSteve Baker <sbaker@redhat.com>
Tue, 8 Jul 2014 00:14:28 +0000 (12:14 +1200)
committerSteve Baker <sbaker@redhat.com>
Thu, 31 Jul 2014 22:49:59 +0000 (10:49 +1200)
This adds a --hot flag to merge.py which will assume source templates
are in the HOT format, and generate a HOT template artifact.

Tests have also been ported to HOT, along with some minor corrections
to the existing tests to make the source and result templates valid
heat templates.

Partial-Blueprint: tripleo-juno-remove-mergepy

Change-Id: If18ff79f89456123c884a1ab2f910ce4cc9a6e0b

25 files changed:
examples/launchconfig1.yaml
examples/launchconfig1_hot.yaml [new file with mode: 0644]
examples/launchconfig2.yaml
examples/launchconfig2_hot.yaml [new file with mode: 0644]
examples/launchconfig_result_hot.yaml [new file with mode: 0644]
examples/lib_hot.yaml [new file with mode: 0644]
examples/scale1.yaml
examples/scale1_hot.yaml [new file with mode: 0644]
examples/scale2_hot.yaml [new file with mode: 0644]
examples/scale_map.yaml
examples/scale_map2_hot.yaml [new file with mode: 0644]
examples/scale_map_hot.yaml [new file with mode: 0644]
examples/scale_map_result_hot.yaml [new file with mode: 0644]
examples/scale_result_hot.yaml [new file with mode: 0644]
examples/source.yaml
examples/source2_hot.yaml [new file with mode: 0644]
examples/source2_lib_result_hot.yaml [new file with mode: 0644]
examples/source_hot.yaml [new file with mode: 0644]
examples/source_include_subkey.yaml
examples/source_include_subkey_hot.yaml [new file with mode: 0644]
examples/source_include_subkey_result_hot.yaml [new file with mode: 0644]
examples/source_lib_result.yaml
examples/source_lib_result_hot.yaml [new file with mode: 0644]
test_merge.bash
tripleo_heat_merge/merge.py

index 9127eab..70ea246 100644 (file)
@@ -1,3 +1,4 @@
+HeatTemplateFormatVersion: '2012-12-12'
 Parameters:
   A:
     Type: String
diff --git a/examples/launchconfig1_hot.yaml b/examples/launchconfig1_hot.yaml
new file mode 100644 (file)
index 0000000..1354f46
--- /dev/null
@@ -0,0 +1,24 @@
+heat_template_version: 2013-05-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: {get_param: A}
+      b: {get_param: B}
+  resource1:
+    type: OS::Nova::Server
+    properties:
+      flavor: test_flavor
+      image: {get_param: resource1Image}
+      key_name: test_key
index 1681637..3ced0cc 100644 (file)
@@ -1,3 +1,4 @@
+HeatTemplateFormatVersion: '2012-12-12'
 Parameters:
   C:
     Type: String
diff --git a/examples/launchconfig2_hot.yaml b/examples/launchconfig2_hot.yaml
new file mode 100644 (file)
index 0000000..3bd5549
--- /dev/null
@@ -0,0 +1,20 @@
+heat_template_version: 2013-05-23
+parameters:
+  C:
+    type: string
+    default: test3
+  resource2Image:
+    type: string
+    default: resource2
+resources:
+  notcomputeConfigMixin:
+    type: AWS::AutoScaling::LaunchConfiguration
+    metadata:
+      OpenStack::Role: notcomputeConfig
+      c: {get_param: C}
+  resource2:
+    type: OS::Nova::Server
+    properties:
+      flavor: test_flavor
+      image: {get_param: resource2Image}
+      key_name: test_key
diff --git a/examples/launchconfig_result_hot.yaml b/examples/launchconfig_result_hot.yaml
new file mode 100644 (file)
index 0000000..e3019f2
--- /dev/null
@@ -0,0 +1,43 @@
+description: examples/launchconfig1_hot.yaml,examples/launchconfig2_hot.yaml
+heat_template_version: '2013-05-23'
+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:
+        get_param: A
+      b:
+        get_param: B
+      c:
+        get_param: C
+    type: AWS::AutoScaling::LaunchConfiguration
+  resource1:
+    properties:
+      flavor: test_flavor
+      image:
+        get_param: resource1Image
+      key_name: test_key
+    type: OS::Nova::Server
+  resource2:
+    properties:
+      flavor: test_flavor
+      image:
+        get_param: resource2Image
+      key_name: test_key
+    type: OS::Nova::Server
diff --git a/examples/lib_hot.yaml b/examples/lib_hot.yaml
new file mode 100644 (file)
index 0000000..b5af05e
--- /dev/null
@@ -0,0 +1,13 @@
+parameters:
+  ImportantValue:
+    default: a_default
+    type: string
+  BImage:
+    type: string
+resources:
+  GenericB:
+    type: OS::Nova::Server
+    properties:
+      image: {get_param: BImage}
+    metadata:
+      my_meta: {get_param: ImportantValue}
index bbe618d..6acb604 100644 (file)
@@ -1,3 +1,4 @@
+HeatTemplateFormatVersion: '2012-12-12'
 Resources:
   ComputeUser:
     Type: AWS::IAM::User
diff --git a/examples/scale1_hot.yaml b/examples/scale1_hot.yaml
new file mode 100644 (file)
index 0000000..5597bbb
--- /dev/null
@@ -0,0 +1,32 @@
+heat_template_version: 2013-05-23
+resources:
+  ComputeUser:
+    type: AWS::IAM::User
+    properties:
+      Policies: [ { get_param: ComputeAccessPolicy } ]
+  GlobalAccessPolicy:
+    type: OS::Heat::AccessPolicy
+  NovaCompute0Key:
+    type: FileInclude
+    Path: examples/scale2_hot.yaml
+    SubKey: resources.NovaCompute0Key
+  NovaCompute0CompletionCondition:
+    type: FileInclude
+    Path: examples/scale2_hot.yaml
+    SubKey: resources.NovaCompute0CompletionCondition
+  NovaCompute0CompletionHandle:
+    type: FileInclude
+    Path: examples/scale2_hot.yaml
+    SubKey: resources.NovaCompute0CompletionHandle
+  NovaCompute0Config:
+    type: FileInclude
+    Path: examples/scale2_hot.yaml
+    SubKey: resources.NovaCompute0Config
+    parameters:
+        ComputeImage: "123"
+        RabbitUserName: "guest"
+        RabbitPassword: "guest"
+  NovaCompute0:
+    type: FileInclude
+    Path: examples/scale2_hot.yaml
+    SubKey: resources.NovaCompute0
diff --git a/examples/scale2_hot.yaml b/examples/scale2_hot.yaml
new file mode 100644 (file)
index 0000000..8800a6c
--- /dev/null
@@ -0,0 +1,69 @@
+heat_template_version: 2013-05-23
+parameters:
+  ComputeImage:
+    type: string
+  RabbitUserName:
+    type: string
+  RabbitPassword:
+    type: string
+    hidden: true
+resources:
+  ComputeAccessPolicy:
+    type: OS::Heat::AccessPolicy
+    properties:
+      AllowedResources: [ NovaCompute0 ]
+  NovaCompute0Key:
+    type: AWS::IAM::AccessKey
+    properties:
+      UserName:
+        get_param: ComputeUser
+  NovaCompute0CompletionCondition:
+    type: AWS::CloudFormation::WaitCondition
+    depends_on: notcompute
+    properties:
+      Handle: {get_resource: NovaCompute0CompletionHandle}
+      Count: '1'
+      Timeout: '1800'
+  NovaCompute0CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute0:
+    type: OS::Nova::Server
+    properties:
+      image:
+        get_param: ComputeImage
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          secret_access_key:
+            get_attr: [ NovaCompute0Key, SecretAccessKey ]
+          stack_name: {get_param: 'AWS::StackName'}
+          path: NovaCompute0Config.Metadata
+  NovaCompute0Config:
+    type: AWS::AutoScaling::LaunchConfiguration
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute0CompletionHandle
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          secret_access_key:
+            get_attr: [ NovaCompute0Key, SecretAccessKey ]
+          stack_name: {get_param: 'AWS::StackName'}
+          path: NovaCompute0Config.Metadata
+      neutron:
+        ovs:
+          local_ip:
+            Fn::Select:
+              - 0
+              - Fn::Select:
+                - ctlplane
+                - get_attr:
+                  - NovaCompute0
+                  - networks
+      rabbit:
+        username: {get_param: RabbitUserName}
+        password: {get_param: RabbitPassword}
+
index 7c79ad5..08bcbf7 100644 (file)
@@ -1,3 +1,4 @@
+HeatTemplateFormatVersion: '2012-12-12'
 Resources:
   ComputeUser:
     Type: AWS::IAM::User
diff --git a/examples/scale_map2_hot.yaml b/examples/scale_map2_hot.yaml
new file mode 100644 (file)
index 0000000..b2b6dfb
--- /dev/null
@@ -0,0 +1,54 @@
+heat_template_version: 2013-05-23
+parameters:
+  AllHosts:
+    type: string
+  ComputeImage:
+    type: string
+resources:
+  ComputeAccessPolicy:
+    type: OS::Heat::AccessPolicy
+    properties:
+      AllowedResources: [ NovaCompute0 ]
+  NovaCompute0Key:
+    type: AWS::IAM::AccessKey
+    properties:
+      UserName:
+        get_param: ComputeUser
+  NovaCompute0CompletionCondition:
+    type: AWS::CloudFormation::WaitCondition
+    depends_on: notcompute
+    properties:
+      Handle: {get_resource: NovaCompute0CompletionHandle}
+      Count: '1'
+      Timeout: '1800'
+  NovaCompute0CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute0:
+    type: OS::Nova::Server
+    properties:
+      image:
+        get_param: ComputeImage
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          secret_access_key:
+            get_attr: [ NovaCompute0Key, SecretAccessKey ]
+          stack_name: {get_param: 'AWS::StackName'}
+          path: NovaCompute0Config.Metadata
+  NovaCompute0Config:
+    type: AWS::AutoScaling::LaunchConfiguration
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute0CompletionHandle
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          secret_access_key:
+            get_attr: [ NovaCompute0Key, SecretAccessKey ]
+          stack_name: {get_param: 'AWS::StackName'}
+          path: NovaCompute0Config.Metadata
+      hosts:
+        get_param: AllHosts
diff --git a/examples/scale_map_hot.yaml b/examples/scale_map_hot.yaml
new file mode 100644 (file)
index 0000000..282d49b
--- /dev/null
@@ -0,0 +1,56 @@
+heat_template_version: 2013-05-23
+resources:
+  ComputeUser:
+    type: AWS::IAM::User
+    properties:
+      Policies: [ { get_param: ComputeAccessPolicy } ]
+  GlobalAccessPolicy:
+    type: OS::Heat::AccessPolicy
+  NovaCompute0Key:
+    type: FileInclude
+    Path: examples/scale_map2_hot.yaml
+    SubKey: resources.NovaCompute0Key
+  NovaCompute0CompletionCondition:
+    type: FileInclude
+    Path: examples/scale_map2_hot.yaml
+    SubKey: resources.NovaCompute0CompletionCondition
+  NovaCompute0CompletionHandle:
+    type: FileInclude
+    Path: examples/scale_map2_hot.yaml
+    SubKey: resources.NovaCompute0CompletionHandle
+  NovaCompute0Config:
+    type: FileInclude
+    Path: examples/scale_map2_hot.yaml
+    SubKey: resources.NovaCompute0Config
+    parameters:
+      AllHosts:
+        list_join:
+        - "\n"
+        - Merge::Map:
+            NovaCompute0:
+              list_join:
+              - ' '
+              - - Fn::Select:
+                  - 0
+                  - Fn::Select:
+                    - ctlplane
+                    - get_attr:
+                      - NovaCompute0
+                      - networks
+                - Fn::Select:
+                  - name
+                  - get_attr:
+                    - NovaCompute0
+                    - show
+                - list_join:
+                  - '.'
+                  - - Fn::Select:
+                      - name
+                      - get_attr:
+                        - NovaCompute0
+                        - show
+                    - 'local'
+  NovaCompute0:
+    type: FileInclude
+    Path: examples/scale_map2_hot.yaml
+    SubKey: resources.NovaCompute0
diff --git a/examples/scale_map_result_hot.yaml b/examples/scale_map_result_hot.yaml
new file mode 100644 (file)
index 0000000..5976e54
--- /dev/null
@@ -0,0 +1,367 @@
+description: examples/scale_map_hot.yaml
+heat_template_version: '2013-05-23'
+resources:
+  ComputeUser:
+    properties:
+      Policies:
+      - get_param: ComputeAccessPolicy
+    type: AWS::IAM::User
+  GlobalAccessPolicy:
+    type: OS::Heat::AccessPolicy
+  NovaCompute0:
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          path: NovaCompute0Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute0Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    properties:
+      image:
+        get_param: ComputeImage
+    type: OS::Nova::Server
+  NovaCompute0CompletionCondition:
+    depends_on: notcompute
+    properties:
+      Count: '1'
+      Handle:
+        get_resource: NovaCompute0CompletionHandle
+      Timeout: '1800'
+    type: AWS::CloudFormation::WaitCondition
+  NovaCompute0CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute0Config:
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute0CompletionHandle
+      hosts:
+        list_join:
+        - '
+
+          '
+        - - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute0
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute0
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute0
+                      - show
+                  - local
+          - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute1
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute1
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute1
+                      - show
+                  - local
+          - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute2
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute2
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute2
+                      - show
+                  - local
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          path: NovaCompute0Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute0Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    type: AWS::AutoScaling::LaunchConfiguration
+  NovaCompute0Key:
+    properties:
+      UserName:
+        get_param: ComputeUser
+    type: AWS::IAM::AccessKey
+  NovaCompute1:
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute1Key
+          path: NovaCompute1Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute1Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    properties:
+      image:
+        get_param: ComputeImage
+    type: OS::Nova::Server
+  NovaCompute1CompletionCondition:
+    depends_on: notcompute
+    properties:
+      Count: '1'
+      Handle:
+        get_resource: NovaCompute1CompletionHandle
+      Timeout: '1800'
+    type: AWS::CloudFormation::WaitCondition
+  NovaCompute1CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute1Config:
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute1CompletionHandle
+      hosts:
+        list_join:
+        - '
+
+          '
+        - - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute0
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute0
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute0
+                      - show
+                  - local
+          - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute1
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute1
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute1
+                      - show
+                  - local
+          - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute2
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute2
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute2
+                      - show
+                  - local
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute1Key
+          path: NovaCompute1Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute1Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    type: AWS::AutoScaling::LaunchConfiguration
+  NovaCompute1Key:
+    properties:
+      UserName:
+        get_param: ComputeUser
+    type: AWS::IAM::AccessKey
+  NovaCompute2:
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute2Key
+          path: NovaCompute2Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute2Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    properties:
+      image:
+        get_param: ComputeImage
+    type: OS::Nova::Server
+  NovaCompute2CompletionCondition:
+    depends_on: notcompute
+    properties:
+      Count: '1'
+      Handle:
+        get_resource: NovaCompute2CompletionHandle
+      Timeout: '1800'
+    type: AWS::CloudFormation::WaitCondition
+  NovaCompute2CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute2Config:
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute2CompletionHandle
+      hosts:
+        list_join:
+        - '
+
+          '
+        - - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute0
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute0
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute0
+                      - show
+                  - local
+          - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute1
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute1
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute1
+                      - show
+                  - local
+          - list_join:
+            - ' '
+            - - Fn::Select:
+                - 0
+                - Fn::Select:
+                  - ctlplane
+                  - get_attr:
+                    - NovaCompute2
+                    - networks
+              - Fn::Select:
+                - name
+                - get_attr:
+                  - NovaCompute2
+                  - show
+              - list_join:
+                - .
+                - - Fn::Select:
+                    - name
+                    - get_attr:
+                      - NovaCompute2
+                      - show
+                  - local
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute2Key
+          path: NovaCompute2Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute2Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    type: AWS::AutoScaling::LaunchConfiguration
+  NovaCompute2Key:
+    properties:
+      UserName:
+        get_param: ComputeUser
+    type: AWS::IAM::AccessKey
diff --git a/examples/scale_result_hot.yaml b/examples/scale_result_hot.yaml
new file mode 100644 (file)
index 0000000..17c0514
--- /dev/null
@@ -0,0 +1,193 @@
+description: examples/scale1_hot.yaml
+heat_template_version: '2013-05-23'
+resources:
+  ComputeUser:
+    properties:
+      Policies:
+      - get_param: ComputeAccessPolicy
+    type: AWS::IAM::User
+  GlobalAccessPolicy:
+    type: OS::Heat::AccessPolicy
+  NovaCompute0:
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          path: NovaCompute0Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute0Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    properties:
+      image:
+        get_param: ComputeImage
+    type: OS::Nova::Server
+  NovaCompute0CompletionCondition:
+    depends_on: notcompute
+    properties:
+      Count: '1'
+      Handle:
+        get_resource: NovaCompute0CompletionHandle
+      Timeout: '1800'
+    type: AWS::CloudFormation::WaitCondition
+  NovaCompute0CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute0Config:
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute0CompletionHandle
+      neutron:
+        ovs:
+          local_ip:
+            Fn::Select:
+            - 0
+            - Fn::Select:
+              - ctlplane
+              - get_attr:
+                - NovaCompute0
+                - networks
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute0Key
+          path: NovaCompute0Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute0Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+      rabbit:
+        password: guest
+        username: guest
+    type: AWS::AutoScaling::LaunchConfiguration
+  NovaCompute0Key:
+    properties:
+      UserName:
+        get_param: ComputeUser
+    type: AWS::IAM::AccessKey
+  NovaCompute1:
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute1Key
+          path: NovaCompute1Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute1Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    properties:
+      image:
+        get_param: ComputeImage
+    type: OS::Nova::Server
+  NovaCompute1CompletionCondition:
+    depends_on: notcompute
+    properties:
+      Count: '1'
+      Handle:
+        get_resource: NovaCompute1CompletionHandle
+      Timeout: '1800'
+    type: AWS::CloudFormation::WaitCondition
+  NovaCompute1CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute1Config:
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute1CompletionHandle
+      neutron:
+        ovs:
+          local_ip:
+            Fn::Select:
+            - 0
+            - Fn::Select:
+              - ctlplane
+              - get_attr:
+                - NovaCompute1
+                - networks
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute1Key
+          path: NovaCompute1Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute1Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+      rabbit:
+        password: guest
+        username: guest
+    type: AWS::AutoScaling::LaunchConfiguration
+  NovaCompute1Key:
+    properties:
+      UserName:
+        get_param: ComputeUser
+    type: AWS::IAM::AccessKey
+  NovaCompute2:
+    metadata:
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute2Key
+          path: NovaCompute2Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute2Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+    properties:
+      image:
+        get_param: ComputeImage
+    type: OS::Nova::Server
+  NovaCompute2CompletionCondition:
+    depends_on: notcompute
+    properties:
+      Count: '1'
+      Handle:
+        get_resource: NovaCompute2CompletionHandle
+      Timeout: '1800'
+    type: AWS::CloudFormation::WaitCondition
+  NovaCompute2CompletionHandle:
+    type: AWS::CloudFormation::WaitConditionHandle
+  NovaCompute2Config:
+    metadata:
+      completion-handle:
+        get_resource: NovaCompute2CompletionHandle
+      neutron:
+        ovs:
+          local_ip:
+            Fn::Select:
+            - 0
+            - Fn::Select:
+              - ctlplane
+              - get_attr:
+                - NovaCompute2
+                - networks
+      os-collect-config:
+        cfn:
+          access_key_id:
+            get_resource: NovaCompute2Key
+          path: NovaCompute2Config.Metadata
+          secret_access_key:
+            get_attr:
+            - NovaCompute2Key
+            - SecretAccessKey
+          stack_name:
+            get_param: AWS::StackName
+      rabbit:
+        password: guest
+        username: guest
+    type: AWS::AutoScaling::LaunchConfiguration
+  NovaCompute2Key:
+    properties:
+      UserName:
+        get_param: ComputeUser
+    type: AWS::IAM::AccessKey
index 89707a7..88f0bde 100644 (file)
@@ -1,7 +1,8 @@
+HeatTemplateFormatVersion: '2012-12-12'
 Parameters:
   SourceImage:
-  Type: String
-  Default: my_image
+    Type: String
+    Default: my_image
 Resources:
   A:
     Type: OS::Nova::Server
diff --git a/examples/source2_hot.yaml b/examples/source2_hot.yaml
new file mode 100644 (file)
index 0000000..e3861a6
--- /dev/null
@@ -0,0 +1,4 @@
+__include__:
+  path: examples/lib_hot.yaml
+  params:
+    ImportantValue: Foo
diff --git a/examples/source2_lib_result_hot.yaml b/examples/source2_lib_result_hot.yaml
new file mode 100644 (file)
index 0000000..3f891e4
--- /dev/null
@@ -0,0 +1,16 @@
+description: examples/source2_hot.yaml
+heat_template_version: '2013-05-23'
+parameters:
+  BImage:
+    type: string
+  ImportantValue:
+    default: a_default
+    type: string
+resources:
+  GenericB:
+    metadata:
+      my_meta: Foo
+    properties:
+      image:
+        get_param: BImage
+    type: OS::Nova::Server
diff --git a/examples/source_hot.yaml b/examples/source_hot.yaml
new file mode 100644 (file)
index 0000000..e8dd59a
--- /dev/null
@@ -0,0 +1,16 @@
+heat_template_version: 2013-05-23
+parameters:
+  SourceImage:
+    type: string
+    default: my_image
+resources:
+  A:
+    type: OS::Nova::Server
+    properties:
+      image: {get_param: SourceImage}
+  B:
+    type: FileInclude
+    Path: examples/lib_hot.yaml
+    SubKey: resources.GenericB
+    parameters:
+      ImportantValue: {list_join: [ '', ['one', 'two', 'three']]}
index be344cd..37591d8 100644 (file)
@@ -1,3 +1,4 @@
+HeatTemplateFormatVersion: '2012-12-12'
 Parameters:
   Foo:
     Type: String
diff --git a/examples/source_include_subkey_hot.yaml b/examples/source_include_subkey_hot.yaml
new file mode 100644 (file)
index 0000000..b330efe
--- /dev/null
@@ -0,0 +1,11 @@
+heat_template_version: 2013-05-23
+parameters:
+  Foo:
+    type: string
+resources:
+  __include__:
+    path: examples/lib_hot.yaml
+    subkey: resources
+    params:
+      BImage:
+        get_param: Foo
diff --git a/examples/source_include_subkey_result_hot.yaml b/examples/source_include_subkey_result_hot.yaml
new file mode 100644 (file)
index 0000000..f8853c2
--- /dev/null
@@ -0,0 +1,14 @@
+description: examples/source_include_subkey_hot.yaml
+heat_template_version: '2013-05-23'
+parameters:
+  Foo:
+    type: string
+resources:
+  GenericB:
+    metadata:
+      my_meta:
+        get_param: ImportantValue
+    properties:
+      image:
+        get_param: Foo
+    type: OS::Nova::Server
index ceb8a32..5844c81 100644 (file)
@@ -1,9 +1,9 @@
 Description: examples/source.yaml
 HeatTemplateFormatVersion: '2012-12-12'
 Parameters:
-  Default: my_image
-  SourceImage: null
-  Type: String
+  SourceImage:
+    Default: my_image
+    Type: String
 Resources:
   A:
     Properties:
diff --git a/examples/source_lib_result_hot.yaml b/examples/source_lib_result_hot.yaml
new file mode 100644 (file)
index 0000000..4c07da0
--- /dev/null
@@ -0,0 +1,24 @@
+description: examples/source_hot.yaml
+heat_template_version: '2013-05-23'
+parameters:
+  SourceImage:
+    default: my_image
+    type: string
+resources:
+  A:
+    properties:
+      image:
+        get_param: SourceImage
+    type: OS::Nova::Server
+  B:
+    metadata:
+      my_meta:
+        list_join:
+        - ''
+        - - one
+          - two
+          - three
+    properties:
+      image:
+        get_param: BImage
+    type: OS::Nova::Server
index 19d7537..d076f50 100755 (executable)
@@ -30,6 +30,12 @@ run_test "python $merge_py examples/source_include_subkey.yaml" examples/source_
 run_test "python $merge_py examples/launchconfig1.yaml examples/launchconfig2.yaml" examples/launchconfig_result.yaml
 run_test "python $merge_py --scale NovaCompute=3 examples/scale1.yaml" examples/scale_result.yaml
 run_test "python $merge_py --scale NovaCompute=3 examples/scale_map.yaml" examples/scale_map_result.yaml
+run_test "python $merge_py --hot examples/source_hot.yaml" examples/source_lib_result_hot.yaml
+run_test "python $merge_py --hot examples/source2_hot.yaml" examples/source2_lib_result_hot.yaml
+run_test "python $merge_py --hot examples/source_include_subkey_hot.yaml" examples/source_include_subkey_result_hot.yaml
+run_test "python $merge_py --hot examples/launchconfig1_hot.yaml examples/launchconfig2_hot.yaml" examples/launchconfig_result_hot.yaml
+run_test "python $merge_py --hot --scale NovaCompute=3 examples/scale1_hot.yaml" examples/scale_result_hot.yaml
+run_test "python $merge_py --hot --scale NovaCompute=3 examples/scale_map_hot.yaml" examples/scale_map_result_hot.yaml
 echo
 trap - EXIT
 exit $fail
index d919d02..077bcb1 100644 (file)
@@ -23,6 +23,25 @@ class Cfn(object):
     get_attr = 'Fn::GetAtt'
 
 
+class Hot(object):
+
+    base_template = {
+        'heat_template_version': '2013-05-23',
+        'description': []
+    }
+    get_resource = 'get_resource'
+    get_param = 'get_param'
+    description = 'description'
+    parameters = 'parameters'
+    outputs = 'outputs'
+    resources = 'resources'
+    type = 'type'
+    properties = 'properties'
+    metadata = 'metadata'
+    depends_on = 'depends_on'
+    get_attr = 'get_attr'
+
+
 lang = Cfn()
 
 
@@ -241,7 +260,15 @@ def main(argv=None):
         help="Change parameters in templates to match resource names. This was "
              " the default at one time but it causes issues when parameter "
              " names need to remain stable.")
+    parser.add_argument(
+        '--hot', action='store_true', default=False,
+        help="Assume source templates are in the HOT format, and generate a "
+             "HOT template artifact.")
     args = parser.parse_args(argv)
+    if args.hot:
+        global lang
+        lang = Hot()
+
     templates = args.templates
     scaling = parse_scaling(args.scale)
     merged_template = merge(templates, args.master_role, args.slave_roles,