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
  software_config_transport:
    type: string
    default: POLL_SERVER_CFN
  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: Heat::InstallConfigAgent

  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: {get_param: software_config_transport}
      user_data: {get_attr: [cfg_user_data, config]}

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]}
