Integration test for software-config tools

This test currently exercises the following hooks:
- script
- puppet
- cfn-init
This requires devstack building a custom image. Since gating doesn't
yet have a test image available the test is skipped by default via
config value skip_software_config_tests.

To run this test locally, build your own custom image and set
skip_software_config_tests=false in
heat_integrationtests/heat_integrationtests.conf

Change-Id: I9d27664638de95e52bc954e1fa00299e6711de90
diff --git a/scenario/templates/test_server_software_config.yaml b/scenario/templates/test_server_software_config.yaml
new file mode 100644
index 0000000..e6ecae4
--- /dev/null
+++ b/scenario/templates/test_server_software_config.yaml
@@ -0,0 +1,174 @@
+heat_template_version: 2014-10-16
+parameters:
+  key_name:
+    type: string
+  flavor:
+    type: string
+  image:
+    type: string
+  network:
+    type: string
+  signal_transport:
+    type: string
+    default: CFN_SIGNAL
+  dep1_foo:
+    default: fooooo
+    type: string
+  dep1_bar:
+    default: baaaaa
+    type: string
+  dep2a_bar:
+    type: string
+    default: barrr
+  dep3_foo:
+    default: fo
+    type: string
+  dep3_bar:
+    default: ba
+    type: string
+
+resources:
+
+  the_sg:
+    type: OS::Neutron::SecurityGroup
+    properties:
+      name: the_sg
+      description: Ping and SSH
+      rules:
+      - protocol: icmp
+      - protocol: tcp
+        port_range_min: 22
+        port_range_max: 22
+
+  cfg1:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: script
+      inputs:
+      - name: foo
+      - name: bar
+      outputs:
+      - name: result
+      config: {get_file: cfg1.sh}
+
+  cfg2a:
+    type: OS::Heat::StructuredConfig
+    properties:
+      group: cfn-init
+      inputs:
+      - name: bar
+      config:
+        config:
+          files:
+            /tmp/cfn-init-foo:
+              content:
+                get_input: bar
+              mode: '000644'
+
+  cfg2b:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: script
+      outputs:
+      - name: result
+      config: |
+        #!/bin/sh
+        echo -n "The file /tmp/cfn-init-foo contains `cat /tmp/cfn-init-foo` for server $deploy_server_id during $deploy_action" > $heat_outputs_path.result
+
+  cfg3:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: puppet
+      inputs:
+      - name: foo
+      - name: bar
+      outputs:
+      - name: result
+      config: {get_file: cfg3.pp}
+
+  dep1:
+    type: OS::Heat::SoftwareDeployment
+    properties:
+      config:
+        get_resource: cfg1
+      server:
+        get_resource: server
+      input_values:
+        foo: {get_param: dep1_foo}
+        bar: {get_param: dep1_bar}
+      signal_transport: {get_param: signal_transport}
+
+  dep2a:
+    type: OS::Heat::StructuredDeployment
+    properties:
+      name: 10_dep2a
+      signal_transport: NO_SIGNAL
+      config:
+        get_resource: cfg2a
+      server:
+        get_resource: server
+      input_values:
+        bar: {get_param: dep2a_bar}
+
+  dep2b:
+    type: OS::Heat::SoftwareDeployment
+    properties:
+      name: 20_dep2b
+      config:
+        get_resource: cfg2b
+      server:
+        get_resource: server
+      signal_transport: {get_param: signal_transport}
+
+  dep3:
+    type: OS::Heat::SoftwareDeployment
+    properties:
+      config:
+        get_resource: cfg3
+      server:
+        get_resource: server
+      input_values:
+        foo: {get_param: dep3_foo}
+        bar: {get_param: dep3_bar}
+      signal_transport: {get_param: signal_transport}
+
+  cfg_user_data:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      config: |
+        #!/bin/sh
+        echo "user data script"
+
+  server:
+    type: OS::Nova::Server
+    properties:
+      image: {get_param: image}
+      flavor: {get_param: flavor}
+      key_name: {get_param: key_name}
+      security_groups:
+      - {get_resource: the_sg}
+      networks:
+      - network: {get_param: network}
+      user_data_format: SOFTWARE_CONFIG
+      software_config_transport: POLL_TEMP_URL
+      user_data: {get_resource: cfg_user_data}
+
+outputs:
+  res1:
+    value:
+      result: {get_attr: [dep1, result]}
+      stdout: {get_attr: [dep1, deploy_stdout]}
+      stderr: {get_attr: [dep1, deploy_stderr]}
+      status_code: {get_attr: [dep1, deploy_status_code]}
+  res2:
+    value:
+      result: {get_attr: [dep2b, result]}
+      stdout: {get_attr: [dep2b, deploy_stdout]}
+      stderr: {get_attr: [dep2b, deploy_stderr]}
+      status_code: {get_attr: [dep2b, deploy_status_code]}
+  res3:
+    value:
+      result: {get_attr: [dep3, result]}
+      stdout: {get_attr: [dep3, deploy_stdout]}
+      stderr: {get_attr: [dep3, deploy_stderr]}
+      status_code: {get_attr: [dep3, deploy_status_code]}