Add heat template for k8s-contrail deploy

Change-Id: I375c9ffae7ef50e7c75a6c56290c08475fbf56ea
diff --git a/tcp_tests/templates/_heat_environments/microcloud-8133.env b/tcp_tests/templates/_heat_environments/microcloud-8133.env
index 6e1cb3b..cd77154 100644
--- a/tcp_tests/templates/_heat_environments/microcloud-8133.env
+++ b/tcp_tests/templates/_heat_environments/microcloud-8133.env
@@ -22,6 +22,9 @@
   mtr_flavor: system.golden.stacklight.telemetry
   cmp_flavor: system.virtual.openstack.compute
   kvm_fake_flavor: system.virtual.fake_kvm
+  osd_flavor: system.virtual.ceph.osd
+  cmn_flavor: system.golden.ceph.mon
+  rgw_flavor: system.golden.ceph.rgw
   foundation_flavor: system.virtual.foundation
 
   key_pair: system_key_8133
diff --git a/tcp_tests/templates/cookied-model-generator/salt_heat-cicd-k8s-contrail41-sl.yaml b/tcp_tests/templates/cookied-model-generator/salt_heat-cicd-k8s-contrail41-sl.yaml
new file mode 100644
index 0000000..84b9aac
--- /dev/null
+++ b/tcp_tests/templates/cookied-model-generator/salt_heat-cicd-k8s-contrail41-sl.yaml
@@ -0,0 +1,25 @@
+{% from 'cookied-model-generator/underlay.yaml' import HOSTNAME_CFG01 with context %}
+{% from 'cookied-model-generator/underlay.yaml' import DOMAIN_NAME with context %}
+
+{% set LAB_CONFIG_NAME = 'heat-cicd-k8s-contrail41-sl' %}
+# Name of the context file (without extension, that is fixed .yaml) used to render the Environment model
+{% set ENVIRONMENT_MODEL_INVENTORY_NAME = os_env('ENVIRONMENT_MODEL_INVENTORY_NAME','heat-cicd-k8s-contrail41-sl') %}
+# Path to the context files used to render Cluster and Environment models
+{%- set CLUSTER_CONTEXT_NAME = 'salt-context-cookiecutter-k8s-contrail.yaml' %}
+{%- set ENVIRONMENT_CONTEXT_NAMES = ['salt-context-environment.yaml', 'salt-context-cookiecutter-k8s-contrail.yaml'] %}
+{%- set CONTROL_VLAN = os_env('CONTROL_VLAN', '10') %}
+{%- set TENANT_VLAN = os_env('TENANT_VLAN', '20') %}
+
+{%- set IPMI_USER = os_env('IPMI_USER', 'mcp-qa') %}
+{%- set IPMI_PASS = os_env('IPMI_PASS', 'password') %}
+
+{% import 'shared-salt.yaml' as SHARED with context %}
+
+{{ SHARED.MACRO_INSTALL_PACKAGES_ON_NODES(HOSTNAME_CFG01) }}
+
+{{ SHARED.MACRO_INSTALL_FORMULAS('\*') }}
+
+{{ SHARED.MACRO_GENERATE_COOKIECUTTER_MODEL(CONTROL_VLAN=CONTROL_VLAN, TENANT_VLAN=TENANT_VLAN) }}
+
+{{ SHARED.MACRO_GENERATE_AND_ENABLE_ENVIRONMENT_MODEL() }}
+{{ SHARED.MACRO_GENERATE_INVENTORY(RERUN_SALTMASTER_STATE=true) }}
diff --git a/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt-context-cookiecutter-k8s-contrail.yaml b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt-context-cookiecutter-k8s-contrail.yaml
new file mode 100644
index 0000000..db98f7a
--- /dev/null
+++ b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt-context-cookiecutter-k8s-contrail.yaml
@@ -0,0 +1,375 @@
+default_context:
+  alertmanager_notification_email_enabled: 'False'
+  auditd_enabled: 'False'
+  backend_network_netmask: 255.255.255.0
+  backend_network_subnet: ==IPV4_NET_TENANT_PREFIX==.0/24
+  backend_vlan: '30'
+  backup_private_key: '-----BEGIN RSA PRIVATE KEY-----
+
+    MIIEpAIBAAKCAQEAwMkoTAEV2WkPsAqltD9lc3rp2UUNpCqIvnkziuVDsxE0f6YG
+
+    MTlM3ADK7BKryPaNQNHtbrW5J6iQq98FcZYj6n5qGKmisxjSOFodlTFgnLz/JTHt
+
+    Orctn/Ds/IS8PgzQUPp9hhrwGCmufmrOG+FhlIRcQOBdfHYesSO4998rXHBYTN5j
+
+    oinmeEN6QSmxT7JjragZ/pyDhnMZfw1piOteu8WJp3PMgrkTsmzpaNUgCOlaO1Ho
+
+    21pNRb0l47SwoAq6B2VQYGB1KyP4LGDUOmOxm9yvHDZ4GpT8CjUaSQdz4ilcdnyu
+
+    NcN3mc0VJAim4MCWxx/Xa+rXa4ilL1/72KKrpwIDAQABAoIBAQCUyOq7tb66GvZL
+
+    g/wc3yyZ8kuWLk/32gfNENcxo/0arvWYanau+K0TwdzaUxKXN4kOdLXM0p0COXrl
+
+    2mpmHly7tjKFtC3oEQj1Cr94DDKm5Mn5V83hmcuxe4w62uo47US8qoXDwPh5fXm5
+
+    AQ7uv4PCzmAwhbhAvRy004AGdQsO/CKQzrdwFpi+4k462cuFgJA1MqLTtW/4vXWY
+
+    voOpC8zzqpw0I87wq+uo/tg6/5cjPRXOxc2xXTDj+Ns6YSkbqfkh1oywTEXsDV7S
+
+    4VDVGns1u3LB6MDA/ORcJIiNpj05uz2sK1Vly4FDv4OXx9pVegU5MABriYOZ6TAL
+
+    9dgsoi2RAoGBAN7bA9H+FOLHe/b4jPYgzu99WawE4oVOXadGGen+JojSXXMpKHWI
+
+    WenbsfKZiAO6EehRKi/SujtcL0z9jgmBxloMhezWcM6PeCI/HDEwHT6Yotq3r9Q4
+
+    hDhM3UJ23eRqzWvxPvArehuduDOpgW1CsIVsVNZDPjtCc46pBNwK5xpPAoGBAN11
+
+    RM+wgz9LzJ/PEBamrQufIZ75GkcIBMWy7M4U9SloOM9h0FUZChW5qk+c1cMoVA5f
+
+    gBjrvZJPDnTF/8OA3hsDsjvG/eryAHpW+C5VHxXTh3LaU8J9l/kJLvvnFQWdSW2Q
+
+    qN5sG8f9B3dj8nXLscfbb+qsaEkducaTClQe7PspAoGBAKah5sJelGlZNYTeJjBn
+
+    KbQC60jnQiThCr/nd7rxsQh/GybfsIPpVym4ft7iE8SNnZQzFDM8AsodzLRpponP
+
+    QmvUj1MeqKyas/4PaFoTGtrSMHsP++XX+G1Mc+idjp6biUvbz+6u45fAn5npdYAn
+
+    7GtnLCwljWOr9VHHaX3KnTCbAoGATsfy7LdsWU4LwyYUIRq2IJZBjZ4sPOybVgEq
+
+    wL0v4cUTwKKZTEyWC9h6v8uZN83W6S4MEdF7JNs+10fAjrn/STjtZNqLZdMlXGAn
+
+    9cOORWN0oeUNOvkW4R7lOfOgxNiJUJLPoCBxWZmn2E8T59fIrMJhc+hVSP1sIzoX
+
+    yIkf4NECgYBNoO9aXYWROcyj7RtGc86e7Zvf0PxVP+n669uJ4G6V5ZEy/rn76Bvs
+
+    d9UY7sJPxy6iNdYJAF0TK7pzKY3cD/g/uopvMaJSkSULTxtQd194ZpeV333XlLTS
+
+    B9Loynqu/foofBhVAeUpot+Xo6lvqJW0LwIS0cqAcsEoY6OnGEYYuw==
+
+    -----END RSA PRIVATE KEY-----'
+  backup_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAyShMARXZaQ+wCqW0P2VzeunZRQ2kKoi+eTOK5UOzETR/pgYxOUzcAMrsEqvI9o1A0e1utbknqJCr3wVxliPqfmoYqaKzGNI4Wh2VMWCcvP8lMe06ty2f8Oz8hLw+DNBQ+n2GGvAYKa5+as4b4WGUhFxA4F18dh6xI7j33ytccFhM3mOiKeZ4Q3pBKbFPsmOtqBn+nIOGcxl/DWmI6167xYmnc8yCuROybOlo1SAI6Vo7UejbWk1FvSXjtLCgCroHZVBgYHUrI/gsYNQ6Y7Gb3K8cNngalPwKNRpJB3PiKVx2fK41w3eZzRUkCKbgwJbHH9dr6tdriKUvX/vYoqun
+  bmk_enabled: 'False'
+  cc_opencontrail_tls_xmpp_enabled: 'True'
+  ceph_cluster_network: ==IPV4_NET_TENANT_PREFIX==.0/24
+  ceph_enabled: 'True'
+  ceph_hyper_converged: 'False'
+  ceph_mon_node01_address: ==IPV4_NET_CONTROL_PREFIX==.66
+  ceph_mon_node01_hostname: cmn01
+  ceph_mon_node02_address: ==IPV4_NET_CONTROL_PREFIX==.67
+  ceph_mon_node02_hostname: cmn02
+  ceph_mon_node03_address: ==IPV4_NET_CONTROL_PREFIX==.68
+  ceph_mon_node03_hostname: cmn03
+  ceph_osd_backend: bluestore
+  ceph_osd_backend_address_ranges: ==IPV4_NET_TENANT_PREFIX==.200-==IPV4_NET_TENANT_PREFIX==.202
+  ceph_osd_block_db_size: '3'
+  ceph_osd_bond_mode: active-backup
+  ceph_osd_data_disks: /dev/vdb
+  ceph_osd_journal_or_block_db_disks: /dev/vdb
+  ceph_osd_node_count: '3'
+  ceph_osd_primary_first_nic: eth1
+  ceph_osd_primary_second_nic: eth2
+  ceph_osd_rack01_hostname: osd
+  ceph_osd_single_address_ranges: ==IPV4_NET_CONTROL_PREFIX==.200-==IPV4_NET_CONTROL_PREFIX==.202
+  ceph_public_network: ==IPV4_NET_CONTROL_PREFIX==.0/24
+  ceph_rgw_address: ==IPV4_NET_CONTROL_PREFIX==.75
+  ceph_rgw_hostname: rgw
+  ceph_rgw_node01_address: ==IPV4_NET_CONTROL_PREFIX==.76
+  ceph_rgw_node01_hostname: rgw01
+  ceph_rgw_node02_address: ==IPV4_NET_CONTROL_PREFIX==.77
+  ceph_rgw_node02_hostname: rgw02
+  ceph_rgw_node03_address: ==IPV4_NET_CONTROL_PREFIX==.78
+  ceph_rgw_node03_hostname: rgw03
+  ceph_version: luminous
+  cfg_failsafe_ssh_public_key: ''
+  cicd_control_node01_address: ==IPV4_NET_CONTROL_PREFIX==.91
+  cicd_control_node01_hostname: cid01
+  cicd_control_node02_address: ==IPV4_NET_CONTROL_PREFIX==.92
+  cicd_control_node02_hostname: cid02
+  cicd_control_node03_address: ==IPV4_NET_CONTROL_PREFIX==.93
+  cicd_control_node03_hostname: cid03
+  cicd_control_vip_address: ==IPV4_NET_CONTROL_PREFIX==.90
+  cicd_control_vip_hostname: cid
+  cicd_enabled: 'True'
+  cicd_private_key: '-----BEGIN RSA PRIVATE KEY-----
+
+    MIIEowIBAAKCAQEAu3t9TSN9QQcWPJOtVZuxIu3t5ahXsffcN+QFO5Aa6NA5n9Ei
+
+    ZWVtIf1+RIIMPm7A7ghp6VmwTZsHNbI1fFmjrNBhaULBMyggIaAzAt0v61VD9bEW
+
+    xctg8akrLkrnKLuLZNLA36DAgucMzt+WjJ7stc+SS2cnntS83YRI0GOb9fRmRZiN
+
+    XpckceyyXo3ZPmlGHO0nNfXTWXbiblAp/5+caQCSCnzZmuZv3VRdjuz+biWIQRCJ
+
+    TixS3aCdu6qCULW2+CcKw3R0V33SJCz6SJJc7/RJ6AuP5QMdYRBNNbgH1Keka8nz
+
+    S2qXaONJ/GwNUvfZxiqKgHmOmctpMxZLBLSxTwIDAQABAoIBAFmvpm5bVtTfxgRu
+
+    hNHaK+/QsChX0rPBJWjbPKGUuzq6OYa5beHhlkZXVKsDJ0ZKhyKXhcrqa8uEKPvH
+
+    54w3+XN3L9JB69hEDrLnRt/M3dqPLHaBI6q1MwgH7C82B8TVisZNh5Sy+sTkMJ1a
+
+    GlPkxsnmpU5K54o0rLCvUoHV1MrgMM4+zq/0pdn1UkvI8G11gjoTeVIPTdIrP0vA
+
+    SL4Y3OsCCyJqnxil7bNt90aa5emOITV0yJVpA8wGoGGoiyrVcz0YSO2coMX8FaXz
+
+    NzPwQOJZl7pSXKY5kI7YP9qFIcHDd/rZL5YMl5aN5BOXlTbr7dVK35GxRV+YuaIS
+
+    jNcZjykCgYEA4GNtJU5eRwV3cOrcx1abwChaKd2oadFj40QOvTM5EdE9bZNn87kX
+
+    eNw7vx6+eKgRiINV1nhF9evMeCCweerRFCzS8KRsuoAdlwkfzp/R2KvzAPVyyTWh
+
+    0Px0bpZG7YIAkBJuv4lkeOfRBPZOdu43xVDxa2rMSGG+pF5DVCx4/30CgYEA1eUM
+
+    COc+jtU4rEYHFbDqBADK2OnuUQfl6R4wsqLCWOGzwdyXHnFqtGT9ILD7ilnXtteK
+
+    dLGVHynPA/w4tqQPnnyM9X/SHZZe4vUn7ZEPUwvtijU4INIIfbOnTc7A4wBwgK35
+
+    oLWvKIvzxBOqRCMjcv9c9h8RkFKrQNgWvVAJJbsCgYBR1VDv4xXU9vRpdO4RsM9a
+
+    lBzV2eXauaehMafibnTov5OUi8bEhwM9a6xKdk7mt/y0+Zjrf6+cEWPfh6R0wiOA
+
+    JRzE8GJK3gBsncJA295vE76q4dj78phSHE/mKN4zLk9AO8iyB8xhn8GF+sIA873Z
+
+    MzzofOmFmEgrr8kEQLfcDQKBgDYH7PlWyMO18uH5spJ1JTgrpxISTcQkVZyEptKJ
+
+    MMTZBtqCyZ3EEqtNE3AtpOz28vnaCrydm0jK++NK1Fy2psdnOQhO6JnWwVNdkF9/
+
+    lDprOe7+sJYB2GlAd5O9FZaCJukqiXNiUcPRTpuKSCl8ItlKzoXRpVMqvt3beCsM
+
+    S7M/AoGBAMKTqbPWbX3a3zv+5CAG5PXg4u9vQYs+qpl0X7AjpgMMon4E1ilnaQ3T
+
+    cxwLk/N/4Pq0o96rQAcTy4sdo7FrlRhzczohVj/OYH++/sxcSUD+BnmrJpxog8/2
+
+    lqe3dnOSd58WuGNjVCsGbnO+5sI6YnKXjuAHdPbIkCxU5R5gUw7n
+
+    -----END RSA PRIVATE KEY-----'
+  cicd_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7e31NI31BBxY8k61Vm7Ei7e3lqFex99w35AU7kBro0Dmf0SJlZW0h/X5Eggw+bsDuCGnpWbBNmwc1sjV8WaOs0GFpQsEzKCAhoDMC3S/rVUP1sRbFy2DxqSsuSucou4tk0sDfoMCC5wzO35aMnuy1z5JLZyee1LzdhEjQY5v19GZFmI1elyRx7LJejdk+aUYc7Sc19dNZduJuUCn/n5xpAJIKfNma5m/dVF2O7P5uJYhBEIlOLFLdoJ27qoJQtbb4JwrDdHRXfdIkLPpIklzv9EnoC4/lAx1hEE01uAfUp6RryfNLapdo40n8bA1S99nGKoqAeY6Zy2kzFksEtLFP
+  cluster_domain: heat-cicd-k8s-contrail41-sl.local
+  cluster_name: heat-cicd-k8s-contrail41-sl
+  context_seed: Z1hp7dK6uV7w6GnkL8D5gMAZ2WuAgGzX0bK6D7V0l377qPfYq822m4U46Dz2E7q0n1gFfNZi3AP5PZIAIiI3VKAA
+  control_network_netmask: 255.255.255.0
+  control_network_subnet: ==IPV4_NET_CONTROL_PREFIX==.0/24
+  control_vlan: '10'
+  cookiecutter_template_branch: ''
+  cookiecutter_template_credentials: gerrit
+  cookiecutter_template_url: ssh://gerrit.mcp.mirantis.net:29418/mk/cookiecutter-templates.git
+  deploy_network_gateway: ==IPV4_NET_ADMIN_PREFIX==.1
+  deploy_network_netmask: 255.255.255.0
+  deploy_network_subnet: ==IPV4_NET_ADMIN_PREFIX==.0/24
+  deployment_type: physical
+  dns_server01: 8.8.8.8
+  dns_server02: 1.1.1.1
+  email_address: sgudz@mirantis.com
+  etcd_ssl: 'True'
+  gainsight_service_enabled: 'False'
+  infra_bond_mode: active-backup
+  infra_deploy_nic: eth0
+  infra_kvm01_control_address: ==IPV4_NET_CONTROL_PREFIX==.240
+  infra_kvm01_hostname: kvm01
+  infra_kvm02_control_address: ==IPV4_NET_CONTROL_PREFIX==.241
+  infra_kvm02_hostname: kvm02
+  infra_kvm03_control_address: ==IPV4_NET_CONTROL_PREFIX==.242
+  infra_kvm03_hostname: kvm03
+  infra_kvm_vip_address: ==IPV4_NET_CONTROL_PREFIX==.239
+  infra_primary_first_nic: eth1
+  infra_primary_second_nic: eth2
+  internal_proxy_enabled: 'False'
+  keycloak_enabled: 'False'
+  kubernetes_cloudprovider_enabled: 'False'
+  kubernetes_cmp_deploy_nic: eth0
+  kubernetes_cmp_network_scheme: physical
+  kubernetes_cmp_primary_first_nic: eth1
+  kubernetes_cmp_primary_second_nic: eth2
+  kubernetes_compute_control_address_ranges: ==IPV4_NET_CONTROL_PREFIX==.101-==IPV4_NET_CONTROL_PREFIX==.200
+  kubernetes_compute_count: '2'
+  kubernetes_compute_rack01_hostname: cmp
+  kubernetes_compute_tenant_address_ranges: ==IPV4_NET_TENANT_PREFIX==.101-==IPV4_NET_TENANT_PREFIX==.200
+  kubernetes_control_address: ==IPV4_NET_CONTROL_PREFIX==.10
+  kubernetes_control_node01_address: ==IPV4_NET_CONTROL_PREFIX==.11
+  kubernetes_control_node01_hostname: ctl01
+  kubernetes_control_node01_tenant_address: ==IPV4_NET_TENANT_PREFIX==.11
+  kubernetes_control_node02_address: ==IPV4_NET_CONTROL_PREFIX==.12
+  kubernetes_control_node02_hostname: ctl02
+  kubernetes_control_node02_tenant_address: ==IPV4_NET_TENANT_PREFIX==.12
+  kubernetes_control_node03_address: ==IPV4_NET_CONTROL_PREFIX==.13
+  kubernetes_control_node03_hostname: ctl03
+  kubernetes_control_node03_tenant_address: ==IPV4_NET_TENANT_PREFIX==.13
+  kubernetes_coredns_enabled: 'True'
+  kubernetes_ctl_deploy_nic: ens3
+  kubernetes_ctl_network_scheme: physical
+  kubernetes_ctl_on_kvm: 'False'
+  kubernetes_ctl_primary_first_nic: ens4
+  kubernetes_ctl_primary_second_nic: ens5
+  kubernetes_enabled: 'True'
+  kubernetes_externaldns_enabled: 'False'
+  kubernetes_externaldns_provider: coredns
+  kubernetes_helm_enabled: 'False'
+  kubernetes_ingressnginx_enabled: 'False'
+  kubernetes_keepalived_vip_interface: ens4
+  kubernetes_kubedns_enabled: 'False'
+  kubernetes_metallb_enabled: 'False'
+  kubernetes_metrics_server_enabled: 'False'
+  kubernetes_network_calico_enabled: 'False'
+  kubernetes_network_flannel_enabled: 'False'
+  kubernetes_network_genie_enabled: 'False'
+  kubernetes_network_opencontrail_enabled: 'True'
+  kubernetes_network_sriov_enabled: 'False'
+  kubernetes_rbd_enabled: 'False'
+  kubernetes_virtlet_enabled: 'True'
+  kubernetes_proxy_hostname: prx
+  kubernetes_proxy_node01_hostname: prx01
+  kubernetes_proxy_node02_hostname: prx02
+  kubernetes_proxy_address: ==IPV4_NET_CONTROL_PREFIX==.220
+  kubernetes_proxy_node01_address: ==IPV4_NET_CONTROL_PREFIX==.221
+  kubernetes_proxy_node02_address: ==IPV4_NET_CONTROL_PREFIX==.222
+  local_repositories: 'False'
+  maas_enabled: 'False'
+  mcp_common_scripts_branch: ''
+  mcp_docker_registry: default
+  mcp_version: 2019.2.0
+  motd_company_name: MirantisTestDeployment
+  no_platform: 'False'
+  octavia_private_key: '-----BEGIN RSA PRIVATE KEY-----
+
+    MIIEpAIBAAKCAQEAr7sXg16gk5mcYzszCAJMh7bnBiniELeuKn7C8chbSf0Gkipt
+
+    LAb+LEpDQOOSsqBx0uidtfsF4BwVXIPLtzShL4qK3IFkoqNf0ADShdmi2X84vot1
+
+    a1OmvDzvAnZVlAaZH8lYHMHY9E2dYcB0c0aH7OLrDlx+6WCWNfqswdK7XUrJ4VN/
+
+    ZAYI2BkYk/jnmjgQvhtzJd0Hy8YqRbamBpkmrcrz4cIRfujQo51LSlXCqWr7te2q
+
+    wYMKSAMAMMfKnIMxJI8iviCaiFB6E0xbyFtYUSc4OrPv9u5Lftw+vu6kdnpg/lHK
+
+    1P+ocgSuiWTzZvcPH3jBCLLghJ+uoYBCy5rUjwIDAQABAoIBAFwMC8zsDABEPf5c
+
+    S+auDZgo3eoElj1beQcZTtOGtwqSVpbJUlX1c72PSJr8mSKnl/d5kOJ5kiJJk4ba
+
+    IiLclnFoiEPoIuZt3Qn+5EboMLzsPrTQJ7kIIBYJdMg9Y6YdrqdPt6+YeiO9Y+qH
+
+    /HdFQn16ftUO7gsgZI3xt/vufeXnH33kGo7R19A90m4SXQ0+/I4PMgZBMCeOs8jY
+
+    8Uo5yi9EErxtE8+ElU+cDQ62gWPVvbGQP9roksJm7o21kZ8/LGbhCulJ7oBWN9Jo
+
+    ONquRoqPmLrML5otgVN/sg+J/BBtrlYOdnUluHjlLuyAiFHjvRjCD20KqWqee6fW
+
+    fPmZLQECgYEA6itDCIFgWayeInE2WycJ3dSB05Z0Wy8PpUMCT2QKSaTLUOiD98Px
+
+    Sz4LBE4lqO/0lI1W4CNw2n+AfAjSxnuMN6zRWZt32Vlprtkv+7LrAMptN6/ige3p
+
+    kqSnrSiRlqEoHqs1r0zYRoB6zTehhs8XhsvyCwVzlTOEZ4SCDBtRWp8CgYEAwB0h
+
+    KnB8Ox23b8DDTQjWL/OYT2WA97fd3r4ANa3e1ZHe/OCLejm9rL2tvuFvCm8iCF1I
+
+    r6/3POLd6GjWDsWepp1n3L79xXY4Kye8PTiGd3AhIRk/uQosbemHwKoj7srO5cO2
+
+    LM5m4Nmh7KRlbJM/xXGpIh9zY3/SJdXsGdAKMBECgYEA4NNMdrwQj8hlw1fDAl1G
+
+    4c6IH2fSq0FR2i+t5h98qRwpgLLdEWL1JnKZDTcifUJ1JrNU97nPPlkwOOYXyC0S
+
+    gNnR3iCgPvPTveYUZapwar/vgInEBU8w9HRV8LCEp4RvCpMC5h33gCkWvjVtRgtK
+
+    4UaqSt6fDF77/o+AdLM9tq0CgYB1SlORYZO3U/FGnV2fjqGWLRb0gng2xV8EOuRN
+
+    4ZWGtsR5h24gdVhEOpn1TBVLPYZ9rNZPzRMZbTkmR7tI0YaHGtrqfwDYqdCpKF1Y
+
+    00XlbeQMHSo2guuVP1rOWhIOHGwtA0waFvnglX6yx7vUiiIJHdexKZp9SPC4gN7g
+
+    848EwQKBgQCaecIjkTyDKeGmtA7FFHqgH2Aq8V6wZ0vuoHJKAe2ilEPLZ7/wQnqC
+
+    OJDpEB4CF82ZctNlKXYEfswUMj7WVzVfcogrvlrVQ2Q7QwMazBqtz37BJuhtB4J7
+
+    Iayq1c0TNY8F/LnKJ7Qc0IglUZ2gV0fE/ip2DWqW5EFEFkS4ZEwUnQ==
+
+    -----END RSA PRIVATE KEY-----'
+  octavia_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvuxeDXqCTmZxjOzMIAkyHtucGKeIQt64qfsLxyFtJ/QaSKm0sBv4sSkNA45KyoHHS6J21+wXgHBVcg8u3NKEviorcgWSio1/QANKF2aLZfzi+i3VrU6a8PO8CdlWUBpkfyVgcwdj0TZ1hwHRzRofs4usOXH7pYJY1+qzB0rtdSsnhU39kBgjYGRiT+OeaOBC+G3Ml3QfLxipFtqYGmSatyvPhwhF+6NCjnUtKVcKpavu17arBgwpIAwAwx8qcgzEkjyK+IJqIUHoTTFvIW1hRJzg6s+/27kt+3D6+7qR2emD+UcrU/6hyBK6JZPNm9w8feMEIsuCEn66hgELLmtSP
+  offline_deployment: 'False'
+  opencontrail_analytics_address: ==IPV4_NET_CONTROL_PREFIX==.30
+  opencontrail_analytics_hostname: nal
+  opencontrail_analytics_node01_address: ==IPV4_NET_CONTROL_PREFIX==.31
+  opencontrail_analytics_node01_hostname: nal01
+  opencontrail_analytics_node02_address: ==IPV4_NET_CONTROL_PREFIX==.32
+  opencontrail_analytics_node02_hostname: nal02
+  opencontrail_analytics_node03_address: ==IPV4_NET_CONTROL_PREFIX==.33
+  opencontrail_analytics_node03_hostname: nal03
+  opencontrail_compute_iface_mask: '24'
+  opencontrail_control_address: ==IPV4_NET_CONTROL_PREFIX==.20
+  opencontrail_control_hostname: ntw
+  opencontrail_control_node01_address: ==IPV4_NET_CONTROL_PREFIX==.21
+  opencontrail_control_node01_hostname: ntw01
+  opencontrail_control_node02_address: ==IPV4_NET_CONTROL_PREFIX==.22
+  opencontrail_control_node02_hostname: ntw02
+  opencontrail_control_node03_address: ==IPV4_NET_CONTROL_PREFIX==.23
+  opencontrail_control_node03_hostname: ntw03
+  opencontrail_enabled: 'True'
+  opencontrail_private_ip_range: 10.150.0.0/16
+  opencontrail_public_ip_range: 10.151.0.0/16
+  opencontrail_router01_address: ==IPV4_NET_CONTROL_PREFIX==.100
+  opencontrail_router01_hostname: rtr01
+  opencontrail_router02_address: ==IPV4_NET_CONTROL_PREFIX==.101
+  opencontrail_router02_hostname: rtr02
+  opencontrail_version: '4.0'
+  openldap_domain: heat-cicd-k8s-contrail41-sl.local
+  openldap_enabled: 'True'
+  openldap_organisation: ${_param:cluster_name}
+  openscap_enabled: 'False'
+  openssh_groups: ''
+  openstack_enabled: 'False'
+  osd_padding_with_zeros: 'True'
+  platform: kubernetes_enabled
+  publication_method: email
+  reclass_repository: https://github.com/Mirantis/mk-lab-salt-model.git
+  salt_api_password: D6p4ybYA34qzDDYnTu2HMxqb8Vyx1CT0z3MlEGkZwh0A
+  salt_api_password_hash: $6$IiHKYaKTcYQF$KezBFPSJ7BWRmM0zldR9J/FhLYqlxjClibJrAFvDI1RPK/8eX2d27S9dFpMGW6Ic/5f/xec84mimfV7AodT6v/
+  salt_master_address: ==IPV4_NET_CONTROL_PREFIX==.15
+  salt_master_hostname: cfg01
+  salt_master_management_address: ==IPV4_NET_ADMIN_PREFIX==.15
+  secrets_encryption_enabled: 'False'
+  sf_notifications_enabled: 'False'
+  shared_reclass_branch: ''
+  shared_reclass_url: https://github.com/Mirantis/reclass-system-salt-model.git
+  sriov_network_subnet: 10.55.0.0/16
+  stacklight_enabled: 'True'
+  stacklight_log_address: ==IPV4_NET_CONTROL_PREFIX==.60
+  stacklight_log_hostname: log
+  stacklight_log_node01_address: ==IPV4_NET_CONTROL_PREFIX==.61
+  stacklight_log_node01_hostname: log01
+  stacklight_log_node02_address: ==IPV4_NET_CONTROL_PREFIX==.62
+  stacklight_log_node02_hostname: log02
+  stacklight_log_node03_address: ==IPV4_NET_CONTROL_PREFIX==.63
+  stacklight_log_node03_hostname: log03
+  stacklight_long_term_storage_type: prometheus
+  stacklight_monitor_address: ==IPV4_NET_CONTROL_PREFIX==.70
+  stacklight_monitor_hostname: mon
+  stacklight_monitor_node01_address: ==IPV4_NET_CONTROL_PREFIX==.71
+  stacklight_monitor_node01_hostname: mon01
+  stacklight_monitor_node02_address: ==IPV4_NET_CONTROL_PREFIX==.72
+  stacklight_monitor_node02_hostname: mon02
+  stacklight_monitor_node03_address: ==IPV4_NET_CONTROL_PREFIX==.73
+  stacklight_monitor_node03_hostname: mon03
+  stacklight_telemetry_address: ==IPV4_NET_CONTROL_PREFIX==.85
+  stacklight_telemetry_hostname: mtr
+  stacklight_telemetry_node01_address: ==IPV4_NET_CONTROL_PREFIX==.86
+  stacklight_telemetry_node01_hostname: mtr01
+  stacklight_telemetry_node02_address: ==IPV4_NET_CONTROL_PREFIX==.87
+  stacklight_telemetry_node02_hostname: mtr02
+  stacklight_telemetry_node03_address: ==IPV4_NET_CONTROL_PREFIX==.88
+  stacklight_telemetry_node03_hostname: mtr03
+  static_ips_on_deploy_network_enabled: 'False'
+  tenant_network_gateway: ==IPV4_NET_TENANT_PREFIX==.1
+  tenant_network_netmask: 255.255.255.0
+  tenant_network_subnet: ==IPV4_NET_TENANT_PREFIX==.0/24
+  tenant_vlan: '20'
+  upstream_proxy_enabled: 'False'
+  use_default_network_scheme: 'True'
+  vnf_onboarding_enabled: 'False'
diff --git a/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt-context-environment.yaml b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt-context-environment.yaml
new file mode 100644
index 0000000..609c1ec
--- /dev/null
+++ b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt-context-environment.yaml
@@ -0,0 +1,324 @@
+nodes:
+    cfg01:
+      reclass_storage_name: infra_config_node01
+      roles:
+      - infra_config
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_static_mgm
+        ens4:
+          role: single_static_ctl
+
+    cid01:
+      reclass_storage_name: cicd_control_node01
+      roles:
+      - cicd_control_leader
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    cid02:
+      reclass_storage_name: cicd_control_node02
+      roles:
+      - cicd_control_manager
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    cid03:
+      reclass_storage_name: cicd_control_node03
+      roles:
+      - cicd_control_manager
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    ctl01:
+      reclass_storage_name: kubernetes_control_node01
+      roles:
+      - kubernetes_control_contrail
+      - linux_system_codename_xenial
+      classes:
+      - system.linux.system.repo.mcp.apt_mirantis.docker
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    ctl02:
+      reclass_storage_name: kubernetes_control_node02
+      roles:
+      - kubernetes_control_contrail
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    ctl03:
+      reclass_storage_name: kubernetes_control_node03
+      roles:
+      - kubernetes_control_contrail
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    prx01:
+      reclass_storage_name: kubernetes_proxy_node01
+      roles:
+      - kubernetes_proxy
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    prx02:
+      reclass_storage_name: kubernetes_proxy_node02
+      roles:
+      - kubernetes_proxy
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    mon01:

+      reclass_storage_name: stacklight_server_node01

+      roles:

+      - stacklightv2_server_leader

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    mon02:

+      reclass_storage_name: stacklight_server_node02

+      roles:

+      - stacklightv2_server

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    mon03:

+      reclass_storage_name: stacklight_server_node03

+      roles:

+      - stacklightv2_server

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    mtr01:

+      reclass_storage_name: stacklight_telemetry_node01

+      roles:

+      - stacklight_telemetry

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    mtr02:

+      reclass_storage_name: stacklight_telemetry_node02

+      roles:

+      - stacklight_telemetry

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    mtr03:

+      reclass_storage_name: stacklight_telemetry_node03

+      roles:

+      - stacklight_telemetry

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    log01:

+      reclass_storage_name: stacklight_log_node01

+      roles:

+      - stacklight_log_leader_v2

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    log02:

+      reclass_storage_name: stacklight_log_node02

+      roles:

+      - stacklight_log

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+

+    log03:

+      reclass_storage_name: stacklight_log_node03

+      roles:

+      - stacklight_log

+      - linux_system_codename_xenial

+      interfaces:

+        ens3:
+          role: single_dhcp
+        ens4:

+          role: single_ctl

+
+    kvm01:
+      reclass_storage_name: infra_kvm_node01
+      roles:
+      - infra_kvm
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    kvm02:
+      reclass_storage_name: infra_kvm_node02
+      roles:
+      - infra_kvm
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    kvm03:
+      reclass_storage_name: infra_kvm_node03
+      roles:
+      - infra_kvm
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    cmn01:
+      reclass_storage_name: ceph_mon_node01
+      roles:
+      - ceph_mon
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    cmn02:
+      reclass_storage_name: ceph_mon_node02
+      roles:
+      - ceph_mon
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    cmn03:
+      reclass_storage_name: ceph_mon_node03
+      roles:
+      - ceph_mon
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    rgw01:
+      reclass_storage_name: ceph_rgw_node01
+      roles:
+      - ceph_rgw
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    rgw02:
+      reclass_storage_name: ceph_rgw_node02
+      roles:
+      - ceph_rgw
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    rgw03:
+      reclass_storage_name: ceph_rgw_node03
+      roles:
+      - ceph_rgw
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    osd<<count>>:
+      reclass_storage_name: ceph_osd_rack01
+      roles:
+      - ceph_osd
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens4:
+          role: single_ctl
+
+    cmp<<count>>:
+      reclass_storage_name: kubernetes_compute_rack01
+      roles:
+      - salt_master_host
+      - kubernetes_compute
+      - linux_system_codename_xenial
+      interfaces:
+        ens3:
+          role: single_dhcp
+        ens5:
+          role: bond0_ab_contrail_single
+        ens4:
+          role: single_ctl
diff --git a/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt.yaml b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt.yaml
new file mode 100644
index 0000000..51204e8
--- /dev/null
+++ b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/salt.yaml
@@ -0,0 +1,14 @@
+{% set HOSTNAME_CFG01='cfg01.heat-cicd-k8s-contrail41-sl.local' %}
+{% set LAB_CONFIG_NAME='heat-cicd-k8s-contrail41-sl' %}
+{% set DOMAIN_NAME='heat-cicd-k8s-contrail41-sl.local' %}
+
+# Other salt model repository parameters see in shared-salt.yaml
+
+{% import 'shared-salt.yaml' as SHARED with context %}
+
+{{ SHARED.MACRO_INSTALL_SALT_MINIONS() }}
+
+{{SHARED.MACRO_CHECK_SALT_VERSION_SERVICES_ON_CFG()}}
+
+{{SHARED.MACRO_CHECK_SALT_VERSION_ON_NODES()}}
+
diff --git a/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay--user-data-foundation.yaml b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay--user-data-foundation.yaml
new file mode 100644
index 0000000..1677dcd
--- /dev/null
+++ b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay--user-data-foundation.yaml
@@ -0,0 +1,64 @@
+#cloud-config, see http://cloudinit.readthedocs.io/en/latest/topics/examples.html
+
+ssh_pwauth: True
+users:
+  - name: root
+    sudo: ALL=(ALL) NOPASSWD:ALL
+    shell: /bin/bash
+  - name: jenkins
+    sudo: ALL=(ALL) NOPASSWD:ALL
+    shell: /bin/bash
+    ssh_authorized_keys:
+      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFSxeuXh2sO4VYL8N2dlNFVyNcr2RvoH4MeDD/cV2HThfU4/BcH6IOOWXSDibIU279bWVKCL7QUp3mf0Vf7HPuyFuC12QM+l7MwT0jCYh5um3hmAvM6Ga0nkhJygHexe9/rLEYzZJkIjP9/IS/YXSv8rhHg484wQ6qkEuq15nyMqil8tbDQCq0XQ+AWEpNpIa4pUoKmFMsOP8lq10KZXIXsJyZxizadr6Bh4Lm9LWrk8YCw7qP3rmgWxK/s8qXQh1ISZe6ONfcmk6p03qbh4H3CwKyWzxmnIHQvE6PgN/O+PuAZj3PbR2mkkJjYX4jNPlxvj8uTStaVPhAwfR9Spdx jenkins@cz8133
+
+disable_root: false
+chpasswd:
+  list: |
+    root:r00tme
+    jenkins:qalab
+  expire: False
+
+packages:
+  - openjdk-8-jre-headless
+  - libyaml-dev
+  - libffi-dev
+  - libvirt-dev
+  - python-dev
+  - python-pip
+  - python-virtualenv
+  #- python-psycopg2
+  - pkg-config
+  - vlan
+  - bridge-utils
+  - ebtables
+
+bootcmd:
+  # Enable root access
+  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin yes/' /etc/ssh/sshd_config
+  - service sshd restart
+output:
+  all: '| tee -a /var/log/cloud-init-output.log /dev/tty0'
+
+runcmd:
+  # Create swap
+  - fallocate -l 16G /swapfile
+  - chmod 600 /swapfile
+  - mkswap /swapfile
+  - swapon /swapfile
+  - echo "/swapfile   none    swap    defaults   0   0" >> /etc/fstab
+
+write_files:
+  - path: /etc/default/grub.d/97-enable-grub-menu.cfg
+    content: |
+      GRUB_RECORDFAIL_TIMEOUT=30
+      GRUB_TIMEOUT=3
+      GRUB_TIMEOUT_STYLE=menu
+
+  - path: /etc/network/interfaces
+    content: |
+      auto ens3
+      iface ens3 inet dhcp
+
+  - path: /etc/bash_completion.d/fuel_devops30_activate
+    content: |
+      source /home/jenkins/fuel-devops30/bin/activate
diff --git a/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay-userdata.yaml b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay-userdata.yaml
new file mode 100644
index 0000000..567a445
--- /dev/null
+++ b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay-userdata.yaml
@@ -0,0 +1,78 @@
+#cloud-config, see http://cloudinit.readthedocs.io/en/latest/topics/examples.html
+
+ssh_pwauth: True
+users:
+   - name: root
+     sudo: ALL=(ALL) NOPASSWD:ALL
+     shell: /bin/bash
+
+disable_root: false
+chpasswd:
+   list: |
+    root:r00tme
+   expire: False
+
+bootcmd:
+   # Enable root access
+   - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin yes/' /etc/ssh/sshd_config
+   - service sshd restart
+output:
+    all: '| tee -a /var/log/cloud-init-output.log /dev/tty0'
+
+runcmd:
+   - if lvs vg0; then pvresize /dev/vda3; fi
+   - if lvs vg0; then /usr/bin/growlvm.py --image-layout-file /usr/share/growlvm/image-layout.yml; fi
+
+   - export TERM=linux
+   - export LANG=C
+   # Configure dhclient
+   - sudo resolvconf -u
+   #- sudo echo "nameserver {gateway}" >> /etc/resolvconf/resolv.conf.d/base
+   # Enable grub menu using updated config below
+   - update-grub
+
+   # Prepare network connection
+   - sudo ifup ens3
+   #- sudo route add default gw {gateway} {interface_name}
+
+   # Create swap
+   - fallocate -l 16G /swapfile
+   - chmod 600 /swapfile
+   - mkswap /swapfile
+   - swapon /swapfile
+   - echo "/swapfile   none    swap    defaults   0   0" >> /etc/fstab
+
+write_files:
+   - path: /etc/default/grub.d/97-enable-grub-menu.cfg
+     content: |
+         GRUB_RECORDFAIL_TIMEOUT=30
+         GRUB_TIMEOUT=3
+         GRUB_TIMEOUT_STYLE=menu
+
+   - path: /etc/network/interfaces
+     content: |
+          auto ens3
+          iface ens3 inet dhcp
+
+   - path: /usr/share/growlvm/image-layout.yml
+     content: |
+       root:
+         size: '65%VG'
+       home:
+         size: '1%VG'
+       var_log:
+         size: '10%VG'
+       var_log_audit:
+         size: '5%VG'
+       var_tmp:
+         size: '10%VG'
+       tmp:
+         size: '5%VG'
+     owner: root:root
+
+growpart:
+    mode: auto
+    devices:
+      - '/'
+      - '/dev/vda3'
+    ignore_growroot_disabled: false
diff --git a/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay.hot b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay.hot
new file mode 100644
index 0000000..4f550a7
--- /dev/null
+++ b/tcp_tests/templates/heat-cicd-k8s-contrail41-sl/underlay.hot
@@ -0,0 +1,427 @@
+---
+
+heat_template_version: queens
+
+description: MCP environment for heat-cicd-k8s-contrail41-sl
+
+parameters:
+  instance_domain:
+    type: string
+    default: heat-cicd-k8s-contrail41-sl.local
+  mcp_version:
+    type: string
+  env_name:
+    type: string
+  control_subnet_cidr:
+    type: string
+  management_subnet_cidr:
+    type: string
+  management_subnet_pool_start:
+    type: string
+  management_subnet_pool_end:
+    type: string
+  management_subnet_cfg01_ip:
+    type: string
+  management_subnet_gateway_ip:
+    type: string
+
+  key_pair:
+    type: string
+
+  ctl_flavor:
+    type: string
+  cfg_flavor:
+    type: string
+  cid_flavor:
+    type: string
+  kvm_fake_flavor:
+    type: string
+  mon_flavor:
+    type: string
+  log_flavor:
+    type: string
+  mtr_flavor:
+    type: string
+  cmp_flavor:
+    type: string
+  cmn_flavor:
+    type: string
+  rgw_flavor:
+    type: string
+  osd_flavor:
+    type: string
+  foundation_flavor:
+    type: string
+
+  net_public:
+    type: string
+
+resources:
+  networks:
+    type: MCP::Networks
+    properties:
+      stack_name: { get_param: "OS::stack_name" }
+      env_name: { get_param: env_name }
+
+  #flavors:
+  #  type: MCP::Flavors
+
+  cfg01_node:
+    type: MCP::MasterNode
+    depends_on: [networks]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      cfg01_flavor: { get_param: cfg_flavor }
+      instance_name: cfg01
+      instance_domain: {get_param: instance_domain}
+      network: { get_attr: [networks, network] }
+
+  control_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: ctl01
+      instance02_name: ctl02
+      instance03_name: ctl03
+      instance_flavor: {get_param: ctl_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '11' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '12' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '13' ]
+
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  fake_kvm_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: kvm01
+      instance02_name: kvm02
+      instance03_name: kvm03
+      instance_flavor: {get_param: kvm_fake_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '241' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '242' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '243' ]
+
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  cicd_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: cid01
+      instance02_name: cid02
+      instance03_name: cid03
+      instance_flavor: {get_param: cid_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '91' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '92' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '93' ]
+
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  stacklight_monitor_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [openstack_message_queue_cluster]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: mon01
+      instance02_name: mon02
+      instance03_name: mon03
+      instance_flavor: {get_param: mon_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '71' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '72' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '73' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  stacklight_log_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [stacklight_monitor_cluster]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: log01
+      instance02_name: log02
+      instance03_name: log03
+      instance_flavor: {get_param: log_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '61' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '62' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '63' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  stacklight_mtr_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [stacklight_log_cluster]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: mtr01
+      instance02_name: mtr02
+      instance03_name: mtr03
+      instance_flavor: {get_param: mtr_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '86' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '87' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '88' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  ceph_cmn_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: cmn01
+      instance02_name: cmn02
+      instance03_name: cmn03
+      instance_flavor: {get_param: cmn_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '66' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '67' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '68' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  ceph_rgw_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: rgw01
+      instance02_name: rgw02
+      instance03_name: rgw03
+      instance_flavor: {get_param: rgw_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '76' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '77' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '78' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  ceph_osd_cluster:
+    type: MCP::MultipleInstance
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance01_name: osd001
+      instance02_name: osd002
+      instance03_name: osd003
+      instance_flavor: {get_param: osd_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      instance01_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '201' ]
+      instance02_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '202' ]
+      instance03_control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '203' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  prx01_virtual:
+    type: MCP::SingleInstance
+    depends_on: [control_cluster]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance_name: prx01
+      instance_flavor: {get_param: cid_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '221' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  prx02_virtual:
+    type: MCP::SingleInstance
+    depends_on: [control_cluster]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance_name: prx02
+      instance_flavor: {get_param: cid_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '222' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  cmp001_virtual:
+    type: MCP::Compute
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance_name: cmp001
+      instance_flavor: {get_param: cmp_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '101' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  cmp002_virtual:
+    type: MCP::Compute
+    depends_on: [cfg01_node]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance_name: cmp002
+      instance_flavor: {get_param: cmp_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay-userdata.yaml }
+      control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '102' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+  foundation_node:
+    type: MCP::FoundationNode
+    depends_on: [networks]
+    properties:
+      env_name: { get_param: env_name }
+      mcp_version: { get_param: mcp_version }
+      instance_domain: {get_param: instance_domain}
+      instance_name: foundation
+      instance_flavor: {get_param: foundation_flavor}
+      network: { get_attr: [networks, network] }
+      underlay_userdata: { get_file: ./underlay--user-data-foundation.yaml }
+      control_net_static_ip:
+        list_join:
+        - '.'
+        - [ { get_attr: [networks, control_net_prefix] }, '5' ]
+      instance_config_host: { get_attr: [cfg01_node, instance_address] }
+
+outputs:
+
+  control_subnet_cidr:
+    description: Control network CIDR
+    value: { get_param: control_subnet_cidr }
+
+  management_subnet_cidr:
+    description: Admin network CIDR
+    value: { get_param: management_subnet_cidr }
+
+  foundation_floating:
+    description: foundation node IP address (floating) from external network
+    value:
+      get_attr:
+      - foundation_node
+      - instance_floating_address
+...