##
## Copyright (c) 2010-2017 Intel Corporation
##
## Licensed under the Apache License, Version 2.0 (the "License");
## you may not use this file except in compliance with the License.
## You may obtain a copy of the License at
##
##     http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
##

heat_template_version: 2016-04-08
description: RAPID stack (Rapid Automated Performance Indication for Dataplane)
parameters:
  image:
    type: string
    label: Image name or ID
    description: Image to be used for compute instance
    default: RapidVM
  flavor:
    type: string
    label: Flavor
    description: Type of instance (flavor) to be used
    default: prox_flavor
  key:
    type: string
    label: Key name
    description: Name of key-pair to be used for compute instance
    default: prox
  dataplane_network:
    type: string
    label: Private network name or ID
    description: Network to attach instance to.
    default: dataplane-network
  internal_network:
    type: string
    label: Private network name or ID
    description: Network to attach instance to.
    default: admin_internal_net
  floating_network:
    type: string
    label: Floating network name or ID
    description: Public Network to attach instance to.
    default: admin_floating_net
  availability_zone:
    type: string
    description: The Availability Zone to launch the instance.
    default: nova

resources:
  vm1_admin_port:
     type: OS::Neutron::Port
     properties:
       network: {get_param: internal_network}
       security_groups:
         - default
  vm1_dataplane_port:
     type: OS::Neutron::Port
     properties:
       network: {get_param: dataplane_network}
       security_groups:
         - default
  vm1_floating_ip:
     type: OS::Neutron::FloatingIP
     properties:
       floating_network: {get_param: floating_network}
       port_id: {get_resource: vm1_admin_port}
  vm1:
    type: OS::Nova::Server
    properties:
      availability_zone: { get_param: availability_zone }
      user_data:
        get_file: prox_user_data.sh
      key_name: { get_param: key }
      image: { get_param: image }
      flavor: { get_param: flavor }
      networks:
        - port: {get_resource: vm1_admin_port}
        - port: {get_resource: vm1_dataplane_port}
  vm2_admin_port:
     type: OS::Neutron::Port
     properties:
       network: {get_param: internal_network}
       security_groups:
         - default
  vm2_dataplane_port:
     type: OS::Neutron::Port
     properties:
       network: {get_param: dataplane_network}
       security_groups:
         - default
  vm2_floating_ip:
     type: OS::Neutron::FloatingIP
     properties:
       floating_network: {get_param: floating_network}
       port_id: {get_resource: vm2_admin_port}
  vm2:
    type: OS::Nova::Server
    properties:
      availability_zone: { get_param: availability_zone }
      user_data:
        get_file: prox_user_data.sh
      key_name: { get_param: key }
      image: { get_param: image }
      flavor: { get_param: flavor }
      networks:
        - port: {get_resource: vm2_admin_port}
        - port: {get_resource: vm2_dataplane_port}
  vm3_admin_port:
     type: OS::Neutron::Port
     properties:
       network: {get_param: internal_network}
       security_groups:
         - default
  vm3_dataplane_port:
     type: OS::Neutron::Port
     properties:
       network: {get_param: dataplane_network}
       security_groups:
         - default
  vm3_floating_ip:
     type: OS::Neutron::FloatingIP
     properties:
       floating_network: {get_param: floating_network}
       port_id: {get_resource: vm3_admin_port}
  vm3:
    type: OS::Nova::Server
    properties:
      availability_zone: { get_param: availability_zone }
      user_data:
        get_file: prox_user_data.sh
      key_name: { get_param: key }
      image: { get_param: image }
      flavor: { get_param: flavor }
      networks:
        - port: {get_resource: vm3_admin_port}
        - port: {get_resource: vm3_dataplane_port}

outputs:
  total_number_of_VMs:
    description: Number of VMs created by this stack
    value: 3
  vm1_private_ip:
    description: IP address ofVM1 admin port
    value: { get_attr: [vm1_admin_port, fixed_ips, 0, ip_address] }
  vm1_public_ip:
    description: Floating IP address of VM1 in public network
    value: { get_attr: [ vm1_floating_ip, floating_ip_address ] }
  vm1_dataplane_ip:
    description: IP address of VM1 dataplane port
    value: { get_attr: [vm1_dataplane_port, fixed_ips, 0, ip_address] }
  vm1_dataplane_mac:
    description: The MAC address of VM1 dataplane port
    value: { get_attr: [vm1_dataplane_port, mac_address] }
  vm2_private_ip:
    description: IP address of the VM2 admin port
    value: { get_attr: [vm2_admin_port, fixed_ips, 0, ip_address] }
  vm2_public_ip:
    description: Floating IP address of VM2 in public network
    value: { get_attr: [ vm2_floating_ip, floating_ip_address ] }
  vm2_dataplane_ip:
    description: IP address of VM2 dataplane port
    value: { get_attr: [vm2_dataplane_port, fixed_ips, 0, ip_address] }
  vm2_dataplane_mac:
    description: The MAC address of VM2 dataplane port
    value: { get_attr: [vm2_dataplane_port, mac_address] }
  vm3_private_ip:
    description: IP address of the VM3 admin port
    value: { get_attr: [vm3_admin_port, fixed_ips, 0, ip_address] }
  vm3_public_ip:
    description: Floating IP address of VM3 in public network
    value: { get_attr: [ vm3_floating_ip, floating_ip_address ] }
  vm3_dataplane_ip:
    description: IP address of VM3 dataplane port
    value: { get_attr: [vm3_dataplane_port, fixed_ips, 0, ip_address] }
  vm3_dataplane_mac:
    description: The MAC address of VM3 dataplane port
    value: { get_attr: [vm3_dataplane_port, mac_address] }