Add ability to create QOS policy with het template

Related-PRODX: PRODX-13966

Change-Id: Ieff299130164a268c62d097ed077aebd200d7546
diff --git a/de/heat-templates/env/main-wrkr5-rack1-cmp1-rack2-cmp1.yaml b/de/heat-templates/env/main-wrkr5-rack1-cmp1-rack2-cmp1.yaml
index 622591f..9b0177f 100644
--- a/de/heat-templates/env/main-wrkr5-rack1-cmp1-rack2-cmp1.yaml
+++ b/de/heat-templates/env/main-wrkr5-rack1-cmp1-rack2-cmp1.yaml
@@ -22,7 +22,13 @@
   docker_ee_url: https://storebits.docker.com/ubuntu
   docker_ee_release: stable-19.03
   private_floating_interface: 'ens4'
+  default_interface: 'ens3'
   rack_private_floating_interface: 'veth-phy'
+  lmas_size: 0
+  lmas_metadata: {"labels": {"role": "stacklight", "stacklight": "enabled", "local-volume-provisioner": "enabled"}}
+  lmas_flavor: system.compact.stacklight.server
+  # qos_max_burst_kbps_egress: 1536
+  # qos_max_kbps_egress: 1433
   main_worker_hardware_metadata: |
     '00:00:00:00:00:00':
       write_files:
diff --git a/de/heat-templates/env/main-wrkr5-rack1-cmp2-rack2-cmp2.yaml b/de/heat-templates/env/main-wrkr5-rack1-cmp2-rack2-cmp2.yaml
index 07ce799..8654005 100644
--- a/de/heat-templates/env/main-wrkr5-rack1-cmp2-rack2-cmp2.yaml
+++ b/de/heat-templates/env/main-wrkr5-rack1-cmp2-rack2-cmp2.yaml
@@ -22,7 +22,11 @@
   docker_ee_url: https://storebits.docker.com/ubuntu
   docker_ee_release: stable-19.03
   private_floating_interface: 'ens4'
+  default_interface: 'ens3'
   rack_private_floating_interface: 'veth-phy'
+  lmas_size: 0
+  lmas_metadata: {"labels": {"role": "stacklight", "stacklight": "enabled", "local-volume-provisioner": "enabled"}}
+  lmas_flavor: system.compact.stacklight.server
   main_worker_hardware_metadata: |
     '00:00:00:00:00:00':
       write_files:
diff --git a/de/heat-templates/fragments/multirack/CentralSite.yaml b/de/heat-templates/fragments/multirack/CentralSite.yaml
index 53b72b3..d421a1f 100644
--- a/de/heat-templates/fragments/multirack/CentralSite.yaml
+++ b/de/heat-templates/fragments/multirack/CentralSite.yaml
@@ -68,6 +68,18 @@
   dns_nameservers:
     type: json
     default: []
+  lmas_size:
+    type: number
+  lmas_metadata:
+    type: json
+  lmas_flavor:
+    type: string
+  lmas_hardware_metadata:
+    description: The content of lab metadata.
+    default: ''
+    type: string
+  default_interface:
+    type: string
 
 resources:
   router:
@@ -206,6 +218,45 @@
           storage_frontend_subnet_id: { get_resource: storage_frontend_subnet }
           storage_frontend_interface: { get_param: storage_frontend_interface }
           storage_frontend_network_cidr: { get_param: storage_frontend_network_cidr }
+          default_interface: { get_param: default_interface }
+
+  lmas:
+    type: OS::Heat::ResourceGroup
+    depends_on:
+     - ucp
+    properties:
+      count: { get_param: lmas_size }
+      resource_def:
+        type: ./SrvInstancesVMCeph.yaml
+        properties:
+          metadata: { get_param: lmas_metadata}
+          ucp_master_host: { get_attr: [ucp, server_control_ip] }
+          docker_ee_url: { get_param: docker_ee_url }
+          docker_ee_release: { get_param: docker_ee_release }
+          docker_ucp_image: { get_param: docker_ucp_image}
+          docker_default_address_pool: { get_param: docker_default_address_pool }
+          node_type: "worker"
+          key_name: { get_param: key_name }
+          image: { get_param: image }
+          flavor: { get_param: lmas_flavor }
+          control_network: { get_resource: control_network }
+          control_subnet_id: { get_resource: control_subnet }
+          control_network_cidr: { get_param: control_network_cidr }
+          private_floating_network: { get_resource: private_floating_network }
+          private_floating_subnet_id: { get_resource: private_floating_subnet }
+          private_floating_interface: { get_param: private_floating_interface }
+          private_floating_network_cidr: { get_param: private_floating_network_cidr }
+          public_net_id: { get_param: public_net_id }
+          hardware_metadata: { get_param: lmas_hardware_metadata }
+          boot_timeout: { get_param: boot_timeout }
+          storage_backend_network: { get_resource: storage_backend_network }
+          storage_backend_subnet_id: { get_resource: storage_backend_subnet }
+          storage_backend_interface: { get_param: storage_backend_interface }
+          storage_backend_network_cidr: { get_param: storage_backend_network_cidr }
+          storage_frontend_network: { get_resource: storage_frontend_network }
+          storage_frontend_subnet_id: { get_resource: storage_frontend_subnet }
+          storage_frontend_interface: { get_param: storage_frontend_interface }
+          storage_frontend_network_cidr: { get_param: storage_frontend_network_cidr }
 
 outputs:
   worker_public_ip:
diff --git a/de/heat-templates/fragments/multirack/Rack.yaml b/de/heat-templates/fragments/multirack/Rack.yaml
index 0801a63..23036b3 100644
--- a/de/heat-templates/fragments/multirack/Rack.yaml
+++ b/de/heat-templates/fragments/multirack/Rack.yaml
@@ -42,11 +42,15 @@
     type: string
   functions_override:
     type: string
+  qos_policy_name:
+    type: string
 
 resources:
 
   control_network:
     type: OS::Neutron::Net
+    properties:
+      qos_policy: { get_param: qos_policy_name }
   control_subnet:
     type: OS::Neutron::Subnet
     properties:
diff --git a/de/heat-templates/fragments/multirack/SrvInstancesVMCeph.yaml b/de/heat-templates/fragments/multirack/SrvInstancesVMCeph.yaml
index c0d94b2..6a0997b 100644
--- a/de/heat-templates/fragments/multirack/SrvInstancesVMCeph.yaml
+++ b/de/heat-templates/fragments/multirack/SrvInstancesVMCeph.yaml
@@ -71,6 +71,9 @@
   storage_frontend_network_cidr:
     description: The CIDR for control network
     type: string
+  default_interface:
+    type: string
+    default: ''
   user_data_config:
     description: This is part of clout-config which denies to mount drive with label ephemeral0 to /mnt
     type: string
@@ -111,6 +114,7 @@
             $storage_backend_interface: { get_param: storage_backend_interface }
             $storage_backend_network_interface_ip: { get_attr: [storage_backend_server_port, fixed_ips, 0, ip_address] }
             $storage_backend_network_cidr: { get_param: storage_backend_network_cidr }
+            $default_interface: { get_param: default_interface }
 
   inject_files:
     type: "OS::Heat::CloudConfig"
diff --git a/de/heat-templates/multirack.yaml b/de/heat-templates/multirack.yaml
index 8e37448..abcae03 100644
--- a/de/heat-templates/multirack.yaml
+++ b/de/heat-templates/multirack.yaml
@@ -163,6 +163,28 @@
   rack_functions_override:
     type: string
     default: ''
+  lmas_size:
+    type: number
+  lmas_metadata:
+    type: json
+  lmas_flavor:
+    type: string
+  default_interface:
+    type: string
+    default: ''
+  qos_max_burst_kbps_ingress:
+    type: number
+    default: 0
+  qos_max_kbps_ingress:
+    type: number
+    default: 0
+  qos_max_burst_kbps_egress:
+    type: number
+    default: 0
+  qos_max_kbps_egress:
+    type: number
+    default: 0
+
 
 resources:
   keypair_name:
@@ -178,6 +200,42 @@
       public_key: { get_param: cluster_public_key }
       save_private_key: false
 
+  qos_policy_gen_name:
+    type: OS::Heat::RandomString
+    properties:
+      character_classes: [{"class": "hexdigits", "min": 1}]
+      length: 8
+      salt: constant
+
+  rack_qos_policy:
+    type: OS::Neutron::QoSPolicy
+    properties:
+      description: String
+      name:
+        list_join:
+        - '-'
+        - [ { get_param: "OS::stack_name" }, { get_attr: [qos_policy_gen_name, value] } ]
+      shared: True
+
+  rack_bandwith_rule_egress:
+    type: OS::Neutron::QoSBandwidthLimitRule
+    properties:
+      max_burst_kbps: { get_param: qos_max_burst_kbps_egress }
+      max_kbps: { get_param: qos_max_kbps_egress }
+      policy: { get_resource: rack_qos_policy }
+# NOTE (ohryhorov): section below with "direction" should be uncommented once cloud is
+# upgraded to OpenStack Train version.
+#
+#      direction: 'egress'
+#
+#  rack_bandwith_rule_ingress:
+#    type: OS::Neutron::QoSBandwidthLimitRule
+#    properties:
+#      max_burst_kbps: { get_param: qos_max_burst_kbps_ingress }
+#      max_kbps: { get_param: qos_max_kbps_ingress }
+#      policy: { get_resource: rack_qos_policy }
+#      direction: 'ingress'
+
   central_site:
     type: MCP2::CentralSite
     properties:
@@ -206,6 +264,11 @@
       worker_hardware_metadata: { get_param: main_worker_hardware_metadata }
       dns_nameservers: { get_param: dns_nameservers }
       boot_timeout: { get_param: central_boot_timeout }
+      lmas_size: { get_param: lmas_size }
+      lmas_metadata: { get_param: lmas_metadata }
+      lmas_flavor: { get_param: lmas_flavor }
+      lmas_hardware_metadata: { get_param: main_worker_hardware_metadata }
+      default_interface: { get_param: default_interface }
 
   rack01_router_routes:
     type: MCP2::RackRouterRoutes
@@ -237,6 +300,7 @@
       boot_timeout: { get_param: rack_boot_timeout }
       private_floating_interface: { get_param: rack_private_floating_interface }
       functions_override: { get_param: rack_functions_override }
+      qos_policy_name: { get_resource: rack_qos_policy }
 
   rack02_router_routes:
     depends_on:
@@ -270,6 +334,7 @@
       boot_timeout: { get_param: rack_boot_timeout }
       private_floating_interface: { get_param: rack_private_floating_interface }
       functions_override: { get_param: rack_functions_override }
+      qos_policy_name: { get_resource: rack_qos_policy }
 
 outputs:
   central_site_worker_public_ip:
diff --git a/de/heat-templates/scripts/instance_boot.sh b/de/heat-templates/scripts/instance_boot.sh
index 1464109..dfeafab 100644
--- a/de/heat-templates/scripts/instance_boot.sh
+++ b/de/heat-templates/scripts/instance_boot.sh
@@ -16,6 +16,8 @@
 PUBLIC_INTERFACE_CIDR=${PUBLIC_INTERFACE_CIDR:-$private_floating_network_cidr}
 PUBLIC_INTERFACE_NETMASK=$(echo ${PUBLIC_INTERFACE_CIDR} | cut -d'/' -f2)
 
+DEFAULT_INTERFACE=${DEFAULT_INTERFACE:-$default_interface}
+
 STORAGE_BACKEND_INTERFACE=${STORAGE_BACKEND_INTERFACE:-$storage_backend_interface}
 STORAGE_BACKEND_INTERFACE_IP=${STORAGE_BACKEND_INTERFACE_IP:-$storage_backend_network_interface_ip}
 STORAGE_BACKEND_NETWORK=${STORAGE_BACKEND_NETWORK:-$storage_backend_network_cidr}
@@ -87,7 +89,7 @@
 }
 ### END COMMON FUNCTIONS ###
 
-DEFAULT_INTERFACE=$(ip route show |awk '/default/ {print $5}')
+DEFAULT_INTERFACE=${DEFAULT_INTERFACE:-$(ip route show |awk '/default/ {print $5}')}
 
 if [[ -n ${CONTROL_NETWORK_CIDR} ]]; then
     CONTROL_IP_ADDRESS=$(ip route get ${CONTROL_NETWORK_CIDR%/*} | head -n1 | fgrep -v ' via ' | awk '/ src / {print $6}')