# Project Clearwater - IMS in the Cloud
# Copyright (C) 2015  Metaswitch Networks Ltd
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version, along with the "Special Exception" for use of
# the program along with SSL, set forth below. This program is distributed
# in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details. You should have received a copy of the GNU General Public
# License along with this program.  If not, see
# <http://www.gnu.org/licenses/>.
#
# The author can be reached by email at clearwater@metaswitch.com or by
# post at Metaswitch Networks Ltd, 100 Church St, Enfield EN2 6BQ, UK
#
# Special Exception
# Metaswitch Networks Ltd  grants you permission to copy, modify,
# propagate, and distribute a work formed by combining OpenSSL with The
# Software, or a work derivative of such a combination, even if such
# copying, modification, propagation, or distribution would otherwise
# violate the terms of the GPL. You must comply with the GPL in all
# respects for all of the code used other than OpenSSL.
# "OpenSSL" means OpenSSL toolkit software distributed by the OpenSSL
# Project and licensed under the OpenSSL Licenses, or a work based on such
# software and licensed under the OpenSSL Licenses.
# "OpenSSL Licenses" means the OpenSSL License and Original SSLeay License
# under which the OpenSSL Project distributes the OpenSSL toolkit software,
# as those licenses appear in the file LICENSE-OPENSSL.

heat_template_version: 2013-05-23

description: >
  Base Project Clearwater deployment on ONAP (Open Network Automation Platform)

parameters:
  vnf_id:
    type: string
    label: VNF ID
    description: The VNF ID provided by ONAP
  vf_module_id:
    type: string
    label: VNF module ID
    description: The VNF module ID provided by ONAP
  public_net_id:
    type: string
    description: ID of public network
    constraints:
      - custom_constraint: neutron.network
        description: Must be a valid network ID
  bono_flavor_name:
    type: string
    description: VM flavor for bono VMs
    constraints:
      - custom_constraint: nova.flavor
        description: Must be a valid flavor name
  sprout_flavor_name:
    type: string
    description: VM flavor for sprout VMs
    constraints:
      - custom_constraint: nova.flavor
        description: Must be a valid flavor name
  homestead_flavor_name:
    type: string
    description: VM flavor for homestead VMs
    constraints:
      - custom_constraint: nova.flavor
        description: Must be a valid flavor name
  homer_flavor_name:
    type: string
    description: VM flavor for homer VMs
    constraints:
      - custom_constraint: nova.flavor
        description: Must be a valid flavor name
  ralf_flavor_name:
    type: string
    description: VM flavor for ralf VMs
    constraints:
      - custom_constraint: nova.flavor
        description: Must be a valid flavor name
  ellis_flavor_name:
    type: string
    description: VM flavor for ellis VM
    constraints:
      - custom_constraint: nova.flavor
        description: Must be a valid flavor name
  dns_flavor_name:
    type: string
    description: VM flavor for dns VM
    constraints:
      - custom_constraint: nova.flavor
        description: Must be a valid flavor name
  bono_image_name:
    type: string
    description: Name of image for bono VMs
  sprout_image_name:
    type: string
    description: Name of image for sprout VMs
  homestead_image_name:
    type: string
    description: Name of image for homestead VMs
  homer_image_name:
    type: string
    description: Name of image for homer VMs
  ralf_image_name:
    type: string
    description: Name of image for ralf VMs
  ellis_image_name:
    type: string
    description: Name of image for ellis VM
  dns_image_name:
    type: string
    description: Name of image for dns VMs
  key_name:
    type: string
    description: Name of keypair to create
  pub_key:
    type: string
    label: Public key
    description: Public key to be installed on all compute instances
  repo_url:
    type: string
    description: URL for Clearwater repository
    default: http://repo.cw-ngv.com/stable
  zone:
    type: string
    description: DNS zone
    default: example.com
  dn_range_start:
    type: string
    description: First directory number in pool
    default: "6505550000"
    constraints:
      - allowed_pattern: "[0-9]+"
        description: Must be numeric
  dn_range_length:
    type: string
    description: Number of directory numbers to add to pool
    default: "1000"
    constraints:
      - allowed_pattern: "[0-9]+"
        description: Must be numeric
  dnssec_key:
    type: string
    description: DNSSEC private key (Base64-encoded)
    constraints:
      - allowed_pattern: "[0-9A-Za-z+/=]+"
        description: Must be Base64-encoded

resources:
  cw_keypair:
    type: OS::Nova::KeyPair
    properties:
      name: { get_param: key_name }
      public_key: { get_param: pub_key }
      save_private_key: false

# security_groups:
#   type: security-groups.yaml
#   properties:
#     name_prefix: { get_param: "OS::stack_name" }

  dns:
    type: dns.yaml
    properties:
      vnf_id: { get_param: vnf_id }
      vf_module_id: { get_param: vf_module_id }
      public_net_id: { get_param: public_net_id }
      dns_flavor_name: { get_param: dns_flavor_name }
      dns_image_name: { get_param: dns_image_name }
      key_name: { get_resource: cw_keypair }
#     dns_security_group: { get_attr: [ security_groups, dns ] }
      zone: { get_param: zone }
      dnssec_key: { get_param: dnssec_key }


  ellis:
    type: ellis.yaml
    properties:
      vnf_id: { get_param: vnf_id }
      vf_module_id: { get_param: vf_module_id }
      public_net_id: { get_param: public_net_id }
      ellis_flavor_name: { get_param: ellis_flavor_name }
      ellis_image_name: { get_param: ellis_image_name }
      key_name: { get_resource: cw_keypair }
#     base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
#     ellis_mgmt_security_group: { get_attr: [ security_groups, ellis_mgmt ] }
      repo_url: { get_param: repo_url }
      zone: { get_param: zone }
      dn_range_start: { get_param: dn_range_start }
      dn_range_length: { get_param: dn_range_length }
      dns_ip: { get_attr: [ dns, dns_ip ] }
      dnssec_key: { get_param: dnssec_key }

  bono:
    type: OS::Heat::ResourceGroup
    properties:
      count: 2
      index_var: "__index__"
      resource_def:
        type: bono.yaml
        properties:
          vnf_id: { get_param: vnf_id }
          vf_module_id: { get_param: vf_module_id }
          public_net_id: { get_param: public_net_id }
          bono_flavor_name: { get_param: bono_flavor_name }
          bono_image_name: { get_param: bono_image_name }
          key_name: { get_resource: cw_keypair }
#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
#         bono_sig_security_group: { get_attr: [ security_groups, bono_sig ] }
          repo_url: { get_param: repo_url }
          zone: { get_param: zone }
          dns_ip: { get_attr: [ dns, dns_ip ] }
          dnssec_key: { get_param: dnssec_key }
          etcd_ip: { get_attr: [ ellis, public_ip ] }
          index: __index__

  sprout:
    type: OS::Heat::ResourceGroup
    properties:
      count: 2
      index_var: __index__
      resource_def:
        type: sprout.yaml
        properties:
          vnf_id: { get_param: vnf_id }
          vf_module_id: { get_param: vf_module_id }
          public_net_id: { get_param: public_net_id }
          sprout_flavor_name: { get_param: sprout_flavor_name }
          sprout_image_name: { get_param: sprout_image_name }
          key_name: { get_resource: cw_keypair }
#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
#         sprout_sig_security_group: { get_attr: [ security_groups, sprout_sig ] }
#         sprout_sig2_security_group: { get_attr: [ security_groups, sprout_sig2 ] }
          repo_url: { get_param: repo_url }
          zone: { get_param: zone }
          dns_ip: { get_attr: [ dns, dns_ip ] }
          dnssec_key: { get_param: dnssec_key }
          etcd_ip: { get_attr: [ ellis, public_ip ] }
          index: __index__

  homer:
    type: OS::Heat::ResourceGroup
    properties:
      count: 2
      index_var: __index__
      resource_def:
        type: homer.yaml
        properties:
          vnf_id: { get_param: vnf_id }
          vf_module_id: { get_param: vf_module_id }
          public_net_id: { get_param: public_net_id }
          homer_flavor_name: { get_param: homer_flavor_name }
          homer_image_name: { get_param: homer_image_name }
          key_name: { get_resource: cw_keypair }
#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
#         homer_mgmt_security_group: { get_attr: [ security_groups, homer_mgmt ] }
#         homer_sig_security_group: { get_attr: [ security_groups, homer_sig ] }
          repo_url: { get_param: repo_url }
          zone: { get_param: zone }
          dns_ip: { get_attr: [ dns, dns_ip ] }
          dnssec_key: { get_param: dnssec_key }
          etcd_ip: { get_attr: [ ellis, public_ip ] }
          index: __index__

  homestead:
    type: OS::Heat::ResourceGroup
    properties:
      count: 2
      index_var: __index__
      resource_def:
        type: homestead.yaml
        properties:
          vnf_id: { get_param: vnf_id }
          vf_module_id: { get_param: vf_module_id }
          public_net_id: { get_param: public_net_id }
          homestead_flavor_name: { get_param: homestead_flavor_name }
          homestead_image_name: { get_param: homestead_image_name }
          key_name: { get_resource: cw_keypair }
#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
#         homestead_mgmt_security_group: { get_attr: [ security_groups, homestead_mgmt ] }
#         homestead_sig_security_group: { get_attr: [ security_groups, homestead_sig ] }
          repo_url: { get_param: repo_url }
          zone: { get_param: zone }
          dns_ip: { get_attr: [ dns, dns_ip ] }
          dnssec_key: { get_param: dnssec_key }
          etcd_ip: { get_attr: [ ellis, public_ip ] }
          index: __index__

  ralf:
    type: OS::Heat::ResourceGroup
    properties:
      count: 2
      index_var: __index__
      resource_def:
        type: ralf.yaml
        properties:
          vnf_id: { get_param: vnf_id }
          vf_module_id: { get_param: vf_module_id }
          public_net_id: { get_param: public_net_id }
          ralf_flavor_name: { get_param: ralf_flavor_name }
          ralf_image_name: { get_param: ralf_image_name }
          key_name: { get_resource: cw_keypair }
#         base_mgmt_security_group: { get_attr: [ security_groups, base_mgmt ] }
#         ralf_sig_security_group: { get_attr: [ security_groups, ralf_sig ] }
          repo_url: { get_param: repo_url }
          zone: { get_param: zone }
          dns_ip: { get_attr: [ dns, dns_ip ] }
          dnssec_key: { get_param: dnssec_key }
          etcd_ip: { get_attr: [ ellis, public_ip ] }
          index: __index__

outputs:
  zone:
    description: DNS zone
    value: { get_param: zone }
  dns_ip:
    description: IP address of DNS
    value: { get_attr: [ dns, dns_ip ] }