heat_template_version: 2013-05-23

description: >
  HOT template to create a new neutron network plus a router to the public
  network, and for deploying nine servers into the new network. The template also
  assigns floating IP addresses to rubbos_control server so it is routable from the
  public network.
parameters:
  key_name:
    type: string
    description: Name of keypair to assign to servers
    default: bottlenecks-key
  image:
    type: string
    description: Name of image to use for servers
    default: bottlenecks-trusty-server
  flavor:
    type: string
    description: Flavor to use for servers
    default: bottlenecks-flavor
  public_net:
    type: string
    description: >
      ID or name of public network for which floating IP addresses will be allocated
    default: net04_ext
  private_net_name:
    type: string
    description: Name of private network to be created
    default: bottlenecks-private
  private_net_cidr:
    type: string
    description: Private network address (CIDR notation)
    default: "10.0.10.0/24"
  private_net_gateway:
    type: string
    description: Private network gateway address
    default: "10.0.10.1"
  private_net_pool_start:
    type: string
    description: Start of private network IP address allocation pool
    default: "10.0.10.2"
  private_net_pool_end:
    type: string
    description: End of private network IP address allocation pool
    default: "10.0.10.199"

resources:
  private_net:
    type: OS::Neutron::Net
    properties:
      name: { get_param: private_net_name }

  private_subnet:
    type: OS::Neutron::Subnet
    properties:
      network_id: { get_resource: private_net }
      cidr: { get_param: private_net_cidr }
      gateway_ip: { get_param: private_net_gateway }
      allocation_pools:
        - start: { get_param: private_net_pool_start }
          end: { get_param: private_net_pool_end }

  router:
    type: OS::Neutron::Router
    properties:
      external_gateway_info:
        network: { get_param: public_net }

  router_interface:
    type: OS::Neutron::RouterInterface
    properties:
      router_id: { get_resource: router }
      subnet_id: { get_resource: private_subnet }

  rubbos_control:
    type: OS::Nova::Server
    properties:
      name: rubbos_control
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_control_port }

  rubbos_control_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_control_floating_ip:
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: { get_param: public_net }
      port_id: { get_resource: rubbos_control_port }

  rubbos_httpd:
    type: OS::Nova::Server
    properties:
      name: rubbos_httpd
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_httpd_port }

  rubbos_httpd_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_mysql1:
    type: OS::Nova::Server
    properties:
      name: rubbos_mysql1
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_mysql1_port }

  rubbos_mysql1_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_tomcat1:
    type: OS::Nova::Server
    properties:
      name: rubbos_tomcat1
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_tomcat1_port }

  rubbos_tomcat1_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_client1:
    type: OS::Nova::Server
    properties:
      name: rubbos_client1
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_client1_port }

  rubbos_client1_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_client2:
    type: OS::Nova::Server
    properties:
      name: rubbos_client2
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_client2_port }

  rubbos_client2_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_client3:
    type: OS::Nova::Server
    properties:
      name: rubbos_client3
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_client3_port }

  rubbos_client3_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_client4:
    type: OS::Nova::Server
    properties:
      name: rubbos_client4
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_client4_port }

  rubbos_client4_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  rubbos_benchmark:
    type: OS::Nova::Server
    properties:
      name: rubbos_benchmark
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - port: { get_resource: rubbos_benchmark_port }

  rubbos_benchmark_port:
    type: OS::Neutron::Port
    properties:
      network_id: { get_resource: private_net }
      fixed_ips:
        - subnet_id: { get_resource: private_subnet }
      security_groups: [{ get_resource: server_security_group }]

  server_security_group:
    type: OS::Neutron::SecurityGroup
    properties:
      description: Rubbos group for servers access.
      name: rubbos-security-group
      rules: [
        {remote_ip_prefix: 0.0.0.0/0,
        protocol: tcp,
        port_range_min: 1,
        port_range_max: 65535},
        {remote_ip_prefix: 0.0.0.0/0,
        protocol: udp,
        port_range_min: 1,
        port_range_max: 65535},
        {remote_ip_prefix: 0.0.0.0/0,
        protocol: icmp}]

outputs:
  rubbos_control_private_ip:
    description: IP address of rubbos_control in private network
    value: { get_attr: [ rubbos_control, first_address ] }
  rubbos_control_public_ip:
    description: Floating IP address of rubbos_control in public network
    value: { get_attr: [ rubbos_control_floating_ip, floating_ip_address ] }
  rubbos_httpd_private_ip:
    description: IP address of rubbos_httpd in private network
    value: { get_attr: [ rubbos_httpd, first_address ] }
  rubbos_mysql1_private_ip:
    description: IP address of rubbos_mysql1 in private network
    value: { get_attr: [ rubbos_mysql1, first_address ] }
  rubbos_tomcat1_private_ip:
    description: IP address of rubbos_tomcat1 in private network
    value: { get_attr: [ rubbos_tomcat1, first_address ] }
  rubbos_client1_private_ip:
    description: IP address of rubbos_client1 in private network
    value: { get_attr: [ rubbos_client1, first_address ] }
  rubbos_client2_private_ip:
    description: IP address of rubbos_client2 in private network
    value: { get_attr: [ rubbos_client2, first_address ] }
  rubbos_client3_private_ip:
    description: IP address of rubbos_client3 in private network
    value: { get_attr: [ rubbos_client3, first_address ] }
  rubbos_client4_private_ip:
    description: IP address of rubbos_client4 in private network
    value: { get_attr: [ rubbos_client4, first_address ] }
  rubbos_benchmark_private_ip:
    description: IP address of rubbos_benchmark in private network
    value: { get_attr: [ rubbos_benchmark, first_address ] }