Merge "Add mitaka models with trusty"
diff --git a/.kitchen-verify.sh b/.kitchen-verify.sh
new file mode 100755
index 0000000..8db3819
--- /dev/null
+++ b/.kitchen-verify.sh
@@ -0,0 +1,82 @@
+#!/bin/bash
+
+## -----------------------------------------------------------------------------
+# PREREQ
+if [ -e /tmp/kitchen ]; then
+  rsync -avh --force --exclude "**/.kitchen" /tmp/kitchen/ /srv/salt/reclass
+fi
+source /srv/salt/bootstrap.sh
+source_local_envs
+
+# FULL BOOTSTRAP
+# make sure everything is set-up and exactly as in the model
+if [[ $BOOTSTRAP =~ ^(True|true|1|yes)$ ]]; then
+  cd /srv/salt/reclass
+  if [[ -e .gitmodules ]] && [[ ! -e classes/system/linux ]]; then
+    git submodule update --init --recursive --remote || true
+  fi
+  /srv/salt/bootstrap.sh &&\
+  if [[ -e /tmp/kitchen ]]; then sed -i '/BOOTSTRAP=/d' /kitchen.env; fi || exit 1
+else
+# JUST CONFIGURE AND START SALT-MASTER
+# minimal setup to speed up, good-enough for model validation
+	mkdir -p /srv/salt/reclass/nodes/_generated;
+	cat <<-EOF > /srv/salt/reclass/nodes/_generated/cfg01.$CLUSTER_NAME.local.yml
+	classes:
+	- cluster.$CLUSTER_NAME.infra.config
+	parameters:
+	  _param:
+	    linux_system_codename: xenial
+	    reclass_data_revision:
+	    reclass_data_repository:
+	    cluster_name: $CLUSTER_NAME
+	    cluster_domain: local
+	  linux:
+	    system:
+	      name: cfg01
+	      domain: $CLUSTER_NAME.local
+	  reclass:
+	    storage:
+	      data_source:
+	        engine: local
+	EOF
+# RECLASS PREREQUISITES
+# remove lock if you need (re)configure salt-master, reclass 2nd time
+  if [ ! -e /tmp/.reclass-prerequisite-once.lock ]; then
+    # link services (subject of future changes)
+    if [ ! -e /srv/salt/reclass/classes/service -a -e /usr/share/salt-formulas/reclass/service ]; then
+      rm -rf /srv/salt/reclass/classes/service || true;
+      ln -sf /usr/share/salt-formulas/reclass/service /srv/salt/reclass/classes
+    fi &&\
+    # reload
+    service salt-master force-reload &&\
+    service salt-minion force-reload &&\
+    retry salt-call saltutil.sync_all &&\
+    # generate static nodes
+    PILLAR='{"reclass":{"storage":{"data_source":{"engine":"local"}}} }' &&\
+    salt-call state.apply reclass.storage.node pillar="$PILLAR" &&\
+    # generate/mockup dynamic nodes (uses fn from bootstrap.sh)
+    mockup_node_registration &&\
+    touch /tmp/.salt-services-reload-once.lock || exit 1
+  fi
+fi
+
+
+
+## -----------------------------------------------------------------------------
+## VERIFY MASTER AND MINIONS
+
+if [[ ! -e /tmp/.verify-prerequisite-once.lock && ! $RECLASS_IGNORE_CLASS_NOTFOUND =~ ^(True|true|1|yes)$ ]]; then
+  sed -i 's/ignore_class_notfound:\s*True.*/ignore_class_notfound: False/' /etc/salt/master.d/reclass.conf
+  sed -i 's/ignore_class_notfound:\s*True.*/ignore_class_notfound: False/' /etc/reclass/reclass-config.yml
+  service salt-master force-reload
+  retry salt-call test.ping
+fi
+
+cd /srv/salt/reclass &&\
+if [[ -z "$1" ]] ; then
+  verify_salt_master &&\
+  verify_salt_minions
+else
+  verify_salt_minion "$1"
+fi
diff --git a/.kitchen.yml b/.kitchen.yml
index a8c4051..9fee5b8 100644
--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -7,35 +7,41 @@
 
 provisioner:
   name: shell
-  script: verify.sh
+  script: .kitchen-verify.sh
+
+verifier:
+  name: inspec
+
+# Use: find classes/cluster/$cluster -name '*.env' | xargs -n1 source
+# TODO, Load and set ENV from **/*.env
+<%- saltver = ENV['SALT_VERSION'] || '2017.7' %>
+<%- btstrap = ENV['SALT_BOOTSTRAP'] || '0' %>
+<%- extrafo = ENV['EXTRA_FORMULAS'] || 'ntp' %>
+<%- formula = ENV['FORMULA_VERSION'] || 'master' %>
+<%- reclass = ENV['RECLASS_VERSION'] || 'develop' %>
 
 platforms:
   <% `find classes/cluster -maxdepth 1 -mindepth 1 -type d | tr '_' '-' |sort -u`.split().each do |cluster| %>
   <% cluster=cluster.split('/')[2] %>
   - name: <%= cluster %>
     driver_config:
-      #image: ubuntu:16.04
-      image: tcpcloud/salt-models-testing # With preinstalled dependencies (faster)
+      # image: epcim/salt:saltstack-ubuntu-xenial-salt-stable
+      # FIXME, USE ONCE RECLASS@DEVELOP IS IN MASTER, AND REQUIREDE FEATURES FROM FORMULA NIGHTLY REPO ARE IN STABLE
+      image: epcim/salt:saltmaster-reclass-ubuntu-xenial-salt-<%= saltver %>-formula-<%= formula %>
       platform: ubuntu
       hostname: cfg01.<%= cluster %>.local
       provision_command:
-        - apt-get update
-        - apt-get install -y git curl python-pip
-        - pip install --upgrade pip
-        - git clone https://github.com/salt-formulas/salt-formulas-scripts /srv/salt/scripts
-        - cd /srv/salt/scripts; git pull -r; cd -
-        # NOTE: Configure ENV options as needed, example:
+        - test -e /srv/salt/bootstrap.sh || curl -qsSL https://raw.githubusercontent.com/salt-formulas/salt-formulas-scripts/develop/bootstrap.sh -o /srv/salt/bootstrap.sh
+        # Configure ENV options as needed, example:
         - echo "
-            export BOOTSTRAP=1;\n
+            export BOOTSTRAP=<%= btstrap %>;\n
             export CLUSTER_NAME=<%= cluster %>;\n
-            export FORMULAS_SOURCE=pkg;\n
-            export RECLASS_VERSION=master;\n
+            export EXTRA_FORMULAS='<%= extrafo %>';\n
+            export RECLASS_VERSION=<%= reclass %>;\n
             export RECLASS_IGNORE_CLASS_NOTFOUND=True;\n
             export RECLASS_IGNORE_CLASS_REGEXP='service.*';\n
-            export EXTRA_FORMULAS="";\n
           " > /kitchen.env
-          #export RECLASS_SOURCE_PATH=/usr/lib/python2.7/site-packages/reclass;\n
-          #export PYTHONPATH=$RECLASS_SOURCE_PATH:$PYTHONPATH;\n
+          #export FORMULAS_SOURCE=pkg;\n
   <% end %>
 
 suites:
diff --git a/README.rst b/README.rst
index cc8cc13..51ba437 100755
--- a/README.rst
+++ b/README.rst
@@ -74,7 +74,7 @@
 * virtual-mcp-ocata-dvr
 * virtual-mcp-ocata-ovs
 
-MCP Kunbernetes
+MCP Kubernetes
 ---------------
 
 Deployment:
@@ -88,6 +88,7 @@
 * k8s-ha-calico
 * k8s-ha-calico-syndic
 * k8s-ha-contrail
+* k8s-ha-calico-flannel-virtlet
 
 Stacklight
 ----------
@@ -159,8 +160,12 @@
   cluster-virtual-mcp-ocata-dvr             Docker  Shell        Busser    Ssh        <Not Created>  <None>
   cluster-virtual-mcp-ocata-ovs             Docker  Shell        Busser    Ssh        <Not Created>  <None>
 
+
+Example usage
+
 .. code-block:: shell
 
-  ➜  kitchen converge aaa-ha-freeipa
+  ➜  kitchen converge cluster-k8s-ha-calico
+  ➜  kitchen verify   cluster-os-ha-contrail
 
 
diff --git a/classes/cluster/drivetrain-ha-clusters/cicd/control/master.yml b/classes/cluster/drivetrain-ha-clusters/cicd/control/master.yml
index 7b74e37..3d76431 100644
--- a/classes/cluster/drivetrain-ha-clusters/cicd/control/master.yml
+++ b/classes/cluster/drivetrain-ha-clusters/cicd/control/master.yml
@@ -27,6 +27,7 @@
   - system.openldap.client.people.admin
   # PostgreSQL
   - system.postgresql.client.pushkin
+  - system.postgresql.client.pushkin.security_monkey
   - system.postgresql.client.rundeck
   - system.postgresql.client.security_monkey
 
diff --git a/classes/cluster/drivetrain-ha-oss/oss/client.yml b/classes/cluster/drivetrain-ha-oss/oss/client.yml
index dc99d6e..9239169 100644
--- a/classes/cluster/drivetrain-ha-oss/oss/client.yml
+++ b/classes/cluster/drivetrain-ha-oss/oss/client.yml
@@ -29,11 +29,12 @@
 
   # PostgreSQL
   - system.postgresql.client.pushkin
-  - system.postgresql.client.rundeck
+  - system.postgresql.client.pushkin.security_monkey
+  - system.postgresql.client.pushkin.janitor_monkey
+  - system.postgresql.client.pushkin.sfdc
+  - system.postgresql.client.pushkin.alertmanager
   - system.postgresql.client.security_monkey
-  - system.postgresql.client.janitor_monkey
-  - system.postgresql.client.sfdc
-  - system.postgresql.client.alertmanager
+  - system.postgresql.client.rundeck
 
   # Elasticsearch
   - system.elasticsearch.client
diff --git a/classes/cluster/drivetrain-ha/cicd/control/master.yml b/classes/cluster/drivetrain-ha/cicd/control/master.yml
index 40d881e..3798bf5 100644
--- a/classes/cluster/drivetrain-ha/cicd/control/master.yml
+++ b/classes/cluster/drivetrain-ha/cicd/control/master.yml
@@ -27,6 +27,7 @@
   - system.openldap.client.people.admin
   # PostgreSQL
   - system.postgresql.client.pushkin
+  - system.postgresql.client.pushkin.security_monkey
   - system.postgresql.client.rundeck
   - system.postgresql.client.security_monkey
 
diff --git a/classes/cluster/k8s-aio-calico/kubernetes/compute.yml b/classes/cluster/k8s-aio-calico/kubernetes/compute.yml
index ede1437..be4d1c7 100644
--- a/classes/cluster/k8s-aio-calico/kubernetes/compute.yml
+++ b/classes/cluster/k8s-aio-calico/kubernetes/compute.yml
@@ -43,9 +43,9 @@
     network:
       resolv:
         dns:
-          - 10.254.0.10
+          - 172.18.208.44
           - 172.18.176.4
-          - 172.18.176.7
+          - 10.254.0.10
       interface:
         ens3:
           enabled: true
diff --git a/classes/cluster/k8s-compact/kubernetes/compute.yml b/classes/cluster/k8s-compact/kubernetes/compute.yml
index edb70a4..4537d07 100644
--- a/classes/cluster/k8s-compact/kubernetes/compute.yml
+++ b/classes/cluster/k8s-compact/kubernetes/compute.yml
@@ -45,9 +45,9 @@
     network:
       resolv:
         dns:
-          - ${_param:kubernetes_internal_dns_address}
+          - 172.18.208.44
           - 172.18.176.4
-          - 172.18.176.7
+          - ${_param:kubernetes_internal_dns_address}
       interface:
         ens3:
           enabled: true
@@ -57,8 +57,5 @@
           address: ${_param:single_address}
           netmask: 255.255.255.0
           gateway: 192.168.122.1
-          route:
-            kubernetes_services:
-              address: 10.201.0.0
-              netmask: 255.255.0.0
-              gateway: ${_param:single_address}
+          post_up_cmds:
+            - ip r rep 10.254.0.0/16 via ${_param:deploy_address}
diff --git a/classes/cluster/k8s-ha-calico-cloudprovider/kubernetes/compute.yml b/classes/cluster/k8s-ha-calico-cloudprovider/kubernetes/compute.yml
index 4fa8ad2..bb04c5e 100644
--- a/classes/cluster/k8s-ha-calico-cloudprovider/kubernetes/compute.yml
+++ b/classes/cluster/k8s-ha-calico-cloudprovider/kubernetes/compute.yml
@@ -47,9 +47,9 @@
     network:
       resolv:
         dns:
-          - 10.254.0.10
+          - 172.18.208.44
           - 172.18.176.4
-          - 172.18.176.7
+          - 10.254.0.10
       interface:
         primary_interface:
           route:
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/.env b/classes/cluster/k8s-ha-calico-flannel-virtlet/.env
new file mode 100644
index 0000000..407e2d1
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/.env
@@ -0,0 +1 @@
+EXTRA_FORMULAS="ntp"
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/MAINTAINERS b/classes/cluster/k8s-ha-calico-flannel-virtlet/MAINTAINERS
new file mode 100644
index 0000000..458882c
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/MAINTAINERS
@@ -0,0 +1 @@
+Andrey Shestakov <ashestakov@mirantis.com>
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/infra/config.yml b/classes/cluster/k8s-ha-calico-flannel-virtlet/infra/config.yml
new file mode 100644
index 0000000..ef9ae97
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/infra/config.yml
@@ -0,0 +1,81 @@
+classes:
+- system.linux.system.repo.ubuntu
+- system.linux.system.repo.mcp.salt
+- system.openssh.client.lab
+- system.salt.master.pkg
+- system.salt.minion.ca.salt_master
+- system.salt.master.api
+- system.salt.minion.cert.k8s_server
+- system.reclass.storage.salt
+- system.reclass.storage.system.kubernetes_control_cluster
+- cluster.k8s-ha-calico-flannel-virtlet
+parameters:
+  _param:
+    salt_master_base_environment: prd
+    reclass_data_repository: "https://gerrit.mcp.mirantis.net/salt-models/mcp-virtual-lab.git"
+    reclass_data_revision: master
+    reclass_config_master: ${_param:infra_config_deploy_address}
+    single_address: ${_param:infra_config_address}
+    deploy_address: ${_param:infra_config_deploy_address}
+    linux_system_codename: xenial
+    salt_api_password_hash: "$6$WV0P1shnoDh2gI/Z$22/Bcd7ffMv0jDlFpT63cAU4PiXHz9pjXwngToKwqAsgoeK4HNR3PiKaushjxp3JsQ8hNoJmAC6TxzVqfV8WH/"
+    salt_master_host: 127.0.0.1
+    salt_master_environment_revision: master
+    salt_master_environment_repository: 'https://github.com/salt-formulas'
+  salt:
+    master:
+      reactor:
+        reclass/minion/classify:
+        - salt://reclass/reactor/node_register.sls
+  reclass:
+    storage:
+      class_mapping:
+        common_node:
+          expression: all
+          node_param:
+            single_address:
+              value_template: <<node_control_ip>>
+            linux_system_codename:
+              value_template: <<node_os>>
+            salt_master_host:
+              value_template: <<node_master_ip>>
+            deploy_address:
+              value_template: <<node_deploy_ip>>
+        infra_config:
+          expression: <<node_hostname>>__startswith__cfg
+          cluster_param:
+            infra_config_address:
+              value_template: <<node_control_ip>>
+            infra_config_deploy_address:
+              value_template: <<node_deploy_ip>>
+            cluster_domain:
+              value_template: <<node_domain>>
+        kubernetes_control01:
+          expression: <<node_hostname>>__equals__ctl01
+          cluster_param:
+            kubernetes_control_node01_address:
+              value_template: <<node_control_ip>>
+            kubernetes_control_node01_deploy_address:
+              value_template: <<node_deploy_ip>>
+        kubernetes_control02:
+          expression: <<node_hostname>>__equals__ctl02
+          cluster_param:
+            kubernetes_control_node02_address:
+              value_template: <<node_control_ip>>
+            kubernetes_control_node02_deploy_address:
+              value_template: <<node_deploy_ip>>
+        kubernetes_control03:
+          expression: <<node_hostname>>__equals__ctl03
+          cluster_param:
+            kubernetes_control_node03_address:
+              value_template: <<node_control_ip>>
+            kubernetes_control_node03_deploy_address:
+              value_template: <<node_deploy_ip>>
+        kubernetes_compute:
+          expression: <<node_hostname>>__startswith__cmp
+          node_class:
+            value_template:
+              - cluster.<<node_cluster>>.kubernetes.compute
+          node_param:
+            deploy_address:
+              value_template: <<node_deploy_ip>>
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/infra/init.yml b/classes/cluster/k8s-ha-calico-flannel-virtlet/infra/init.yml
new file mode 100644
index 0000000..e7a02fa
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/infra/init.yml
@@ -0,0 +1,28 @@
+classes:
+- system.linux.system.single
+- system.linux.system.repo.mcp.extra
+- system.linux.system.repo.mcp.salt
+- system.linux.system.repo.ubuntu
+- system.openssh.server.team.all
+parameters:
+  _param:
+    # infra service addresses
+    infra_config_hostname: cfg01
+    infra_config_address: 172.16.10.100
+    infra_config_deploy_address: 192.168.10.90
+
+    cluster_domain: k8s-ha-calico-flannel-virtlet.local
+    cluster_name: k8s-ha-calico-flannel-virtlet
+    apt_mk_version: nightly
+    primary_interface: ens3
+  linux:
+    network:
+      host:
+        cfg01:
+          address: ${_param:infra_config_address}
+          names:
+          - ${_param:infra_config_hostname}
+          - ${_param:infra_config_hostname}.${_param:cluster_domain}
+    system:
+      name: ${_param:infra_config_hostname}
+      domain: ${_param:cluster_domain}
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/init.yml b/classes/cluster/k8s-ha-calico-flannel-virtlet/init.yml
new file mode 100644
index 0000000..bbe3cbe
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/init.yml
@@ -0,0 +1,5 @@
+classes:
+- system.linux.network.dynamic_hosts
+- cluster.k8s-ha-calico-flannel-virtlet.kubernetes
+- cluster.k8s-ha-calico-flannel-virtlet.infra
+- cluster.overrides
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/compute.yml b/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/compute.yml
new file mode 100644
index 0000000..29a179b
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/compute.yml
@@ -0,0 +1,74 @@
+classes:
+- system.linux.system.repo.docker_legacy
+- system.kubernetes.pool.cluster
+- system.linux.network.hosts
+- system.salt.minion.cert.k8s_client
+- system.salt.minion.cert.etcd_client
+- cluster.k8s-ha-calico-flannel-virtlet
+parameters:
+  docker:
+    host:
+      pkgs:
+        - ${_param:kubernetes_docker_package}
+        - python-docker
+      options:
+        bip: 172.31.255.1/24
+        storage-driver: overlay2
+  kubernetes:
+    pool:
+      kubelet:
+        address: ${_param:single_address}
+        fail_on_swap: ${_param:kubelet_fail_on_swap}
+      network:
+        genie:
+          enabled: true
+          default_plugin: calico
+          image: ${_param:kubernetes_genie_image}
+        flannel:
+          enabled: true
+        calico:
+          enabled: true
+          image: ${_param:kubernetes_calico_image}
+          calicoctl_image: ${_param:kubernetes_calico_calicoctl_image}
+          cni_image: ${_param:kubernetes_calico_cni_image}
+          etcd:
+            ssl:
+              enabled: true
+    common:
+      addons:
+        virtlet:
+          enabled: ${_param:kubernetes_virtlet_enabled}
+          namespace: ${_param:kubernetes_addon_namespace}
+          image: ${_param:kubernetes_virtlet_image}
+          criproxy_version: ${_param:kubernetes_criproxy_version}
+          criproxy_source: ${_param:kubernetes_criproxy_checksum}
+          hosts:
+          - ${_param:kubernetes_compute01_hostname}
+      hyperkube:
+        image: ${_param:kubernetes_hyperkube_image}
+  linux:
+    network:
+      resolv:
+        dns:
+          - 172.18.208.44
+          - 172.18.176.4
+          - 10.254.0.10
+      interface:
+        ens3:
+          enabled: true
+          type: eth
+          proto: static
+          name: ${_param:primary_interface}
+          address: ${_param:deploy_address}
+          netmask: 255.255.255.0
+          gateway: 192.168.10.1
+          post_up_cmds:
+            - ip r rep 10.254.0.0/16 via ${_param:deploy_address}
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: '255.255.255.0'
+          ipflush_onchange: true
+          restart_on_ipflush: true
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/control.yml b/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/control.yml
new file mode 100644
index 0000000..6f6229c
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/control.yml
@@ -0,0 +1,80 @@
+classes:
+- service.etcd.server.cluster
+- service.kubernetes.control.cluster
+- service.kubernetes.control.cluster-admin
+- system.haproxy.proxy.listen.kubernetes.apiserver
+- system.linux.system.repo.docker_legacy
+- system.salt.minion.cert.etcd_server
+- system.kubernetes.master.cluster
+- cluster.k8s-ha-calico-flannel-virtlet.kubernetes.compute
+- cluster.k8s-ha-calico-flannel-virtlet
+parameters:
+  _param:
+    keepalived_vip_interface: ${_param:primary_interface}
+    keepalived_vip_virtual_router_id: 60
+  etcd:
+    server:
+      bind:
+        host: ${_param:deploy_address}
+      source:
+        engine: docker_hybrid
+      ssl:
+        enabled: true
+      setup:
+        calico:
+          key: /calico/v1/ipam/v4/pool/${_param:calico_private_network}-${_param:calico_private_netmask}
+          value: '{"masquerade":true,"cidr":"${_param:calico_private_network}/${_param:calico_private_netmask}"}'
+  kubernetes:
+    common:
+      addons:
+        dashboard:
+          enabled: ${_param:kubernetes_dashboard}
+          image: ${_param:kubernetes_dashboard_image}
+        helm:
+          enabled: ${_param:kubernetes_helm_enabled}
+        calico_policy:
+          enabled: ${_param:kubernetes_calico_policy_enabled}
+          image: ${_param:kubernetes_calico_policy_image}
+        netchecker:
+          enabled: ${_param:kubernetes_netchecker_enabled}
+          agent_image: ${_param:kubernetes_netchecker_agent_image}
+          server_image: ${_param:kubernetes_netchecker_server_image}
+          agent_probeurls: ${_param:kubernetes_netchecker_agent_probeurls}
+        dns:
+          enabled: ${_param:kubernetes_dns}
+          kubedns_image: ${_param:kubernetes_kubedns_image}
+          dnsmasq_image: ${_param:kubernetes_dnsmasq_image}
+          sidecar_image: ${_param:kubernetes_sidecar_image}
+          autoscaler:
+            image: ${_param:kubernetes_dns_autoscaler_image}
+        coredns:
+          enabled: ${_param:kubernetes_coredns_enabled}
+        externaldns:
+          enabled: ${_param:kubernetes_externaldns_enabled}
+          image: ${_param:kubernetes_externaldns_image}
+          provider: ${_param:kubernetes_externaldns_provider}
+    master:
+      kubelet:
+        address: ${_param:single_address}
+        fail_on_swap: ${_param:kubelet_fail_on_swap}
+      etcd:
+        ssl:
+          enabled: true
+      network:
+        genie:
+          enabled: true
+          default_plugin: calico
+          image: ${_param:kubernetes_genie_image}
+        flannel:
+          enabled: true
+          private_ip_range: 10.20.0.0/16
+        calico:
+          enabled: true
+          etcd:
+            ssl:
+              enabled: true
+      namespace:
+        netchecker:
+          enabled: true
+      auth:
+        mode: Node,RBAC
diff --git a/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/init.yml b/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/init.yml
new file mode 100644
index 0000000..cd92306
--- /dev/null
+++ b/classes/cluster/k8s-ha-calico-flannel-virtlet/kubernetes/init.yml
@@ -0,0 +1,115 @@
+parameters:
+  _param:
+    salt_minion_ca_host: ${_param:infra_config_hostname}.${_param:cluster_domain}
+    salt_minion_ca_authority: salt_master_ca
+
+    # kubelet
+    kubelet_fail_on_swap: True
+
+    # kubernetes settings
+    kubernetes_admin_user: admin
+    kubernetes_admin_password: sbPfel23ZigJF3Bm
+    kubernetes_admin_token: PpP6Mm3pAoPVqcKOKUu0x1dh7b1959Fi
+    kubernetes_kubelet_token: JJ2PKHxjiU6EYvIt18BqwdSK1HvWh8pt
+    kubernetes_kube-proxy_token: jT0hJk9L6cIw5UpYDNhsRwcj3Z2n62B6
+    kubernetes_scheduler_token: VgkUHfrW07zNxrb0ucFyX7NBnSJN9Xp6
+    kubernetes_controller-manager_token: uXrdZ1YKF6qlYm3sHje2iEXMGAGDWOIU
+    kubernetes_dns_token: 0S1I4iJeFjq5fopPwwCwTp3xFpEZfeUl
+    etcd_initial_token: IN7KaRMSo3xkGxkjAAPtkRkAgqN4ZNRq
+
+    # docker package version
+    kubernetes_docker_package: docker-engine=1.12.6-0~ubuntu-xenial
+
+    # component docker images
+    kubernetes_calico_calicoctl_image: docker-prod-virtual.docker.mirantis.net/mirantis/projectcalico/calico/ctl:latest
+    kubernetes_calico_image: docker-prod-virtual.docker.mirantis.net/mirantis/projectcalico/calico/node:latest
+    kubernetes_calico_cni_image: docker-prod-virtual.docker.mirantis.net/mirantis/projectcalico/calico/cni:latest
+    kubernetes_calico_policy_image: calico/kube-policy-controller:v0.5.4
+
+    kubernetes_hyperkube_image: docker-prod-virtual.docker.mirantis.net/mirantis/kubernetes/hyperkube-amd64:v1.8.11-9
+    kubernetes_virtlet_image: mirantis/virtlet:v1.0.0
+    kubernetes_criproxy_version: v0.10.0
+    kubernetes_criproxy_checksum: md5=52717b1f70f15558ef4bdb0e4d4948da
+    kubernetes_dashboard_image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1
+    kubernetes_kubedns_image: gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.5
+    kubernetes_dnsmasq_image: gcr.io/google_containers/k8s-dns-dnsmasq-amd64:1.14.5
+    kubernetes_sidecar_image: gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.5
+    kubernetes_dns_autoscaler_image: gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.0.0
+    kubernetes_netchecker_agent_image: mirantis/k8s-netchecker-agent:stable
+    kubernetes_netchecker_server_image: mirantis/k8s-netchecker-server:stable
+    kubernetes_netchecker_agent_probeurls: "http://ipinfo.io"
+    kubernetes_genie_image: mirantis/cnigenie:latest
+
+    # switches of addons
+    kubernetes_addon_namespace: kube-system
+    kubernetes_dns: true
+    kubernetes_dashboard: true
+    kubernetes_helm_enabled: false
+    kubernetes_netchecker_enabled: true
+    kubernetes_calico_policy_enabled: false
+    kubernetes_virtlet_enabled: true
+
+    # addresses and hostnames
+    kubernetes_internal_api_address: 10.254.0.1
+    kubernetes_control_hostname: ctl
+    kubernetes_control_address: 192.168.10.253
+    kubernetes_control_node01_hostname: ctl01
+    kubernetes_control_node02_hostname: ctl02
+    kubernetes_control_node03_hostname: ctl03
+    kubernetes_compute01_hostname: cmp0
+    kubernetes_control_node01_address: 172.16.10.101
+    kubernetes_control_node02_address: 172.16.10.102
+    kubernetes_control_node03_address: 172.16.10.103
+    kubernetes_control_node01_deploy_address: 192.168.10.101
+    kubernetes_control_node02_deploy_address: 192.168.10.102
+    kubernetes_control_node03_deploy_address: 192.168.10.103
+
+    cluster_vip_address: ${_param:kubernetes_control_address}
+    cluster_local_address: ${_param:deploy_address}
+
+    # etcd stuff
+    cluster_node01_hostname: ${_param:kubernetes_control_node01_hostname}
+    cluster_node01_address: ${_param:kubernetes_control_node01_deploy_address}
+    cluster_node01_port: 4001
+    cluster_node02_hostname: ${_param:kubernetes_control_node02_hostname}
+    cluster_node02_address: ${_param:kubernetes_control_node02_deploy_address}
+    cluster_node02_port: 4001
+    cluster_node03_hostname: ${_param:kubernetes_control_node03_hostname}
+    cluster_node03_address: ${_param:kubernetes_control_node03_deploy_address}
+    cluster_node03_port: 4001
+
+    # calico
+    calico_private_network: 192.168.0.0
+    calico_private_netmask: 16
+
+    # component docker images
+    kubernetes_externaldns_image: mirantis/external-dns:latest
+    kubernetes_externaldns_provider: coredns
+
+    # switches of addons
+    kubernetes_coredns_enabled: false
+    kubernetes_externaldns_enabled: false
+
+  linux:
+    network:
+      host:
+        ctl:
+          address: ${_param:kubernetes_control_address}
+          names:
+          - ${_param:kubernetes_control_hostname}
+          - ${_param:kubernetes_control_hostname}.${_param:cluster_domain}
+        ctl01:
+          address: ${_param:kubernetes_control_node01_address}
+          names:
+          - ${_param:kubernetes_control_node01_hostname}
+          - ${_param:kubernetes_control_node01_hostname}.${_param:cluster_domain}
+        ctl02:
+          address: ${_param:kubernetes_control_node02_address}
+          names:
+          - ${_param:kubernetes_control_node02_hostname}
+          - ${_param:kubernetes_control_node02_hostname}.${_param:cluster_domain}
+        ctl03:
+          address: ${_param:kubernetes_control_node03_address}
+          names:
+          - ${_param:kubernetes_control_node03_hostname}
+          - ${_param:kubernetes_control_node03_hostname}.${_param:cluster_domain}
diff --git a/classes/cluster/k8s-ha-calico-syndic/kubernetes/compute.yml b/classes/cluster/k8s-ha-calico-syndic/kubernetes/compute.yml
index 9871b70..7afc253 100644
--- a/classes/cluster/k8s-ha-calico-syndic/kubernetes/compute.yml
+++ b/classes/cluster/k8s-ha-calico-syndic/kubernetes/compute.yml
@@ -34,9 +34,9 @@
     network:
       resolv:
         dns:
-          - 10.254.0.10
+          - 172.18.208.44
           - 172.18.176.4
-          - 172.18.176.7
+          - 10.254.0.10
       interface:
         primary_interface:
           route:
diff --git a/classes/cluster/k8s-ha-calico/kubernetes/compute.yml b/classes/cluster/k8s-ha-calico/kubernetes/compute.yml
index 476f176..646db96 100644
--- a/classes/cluster/k8s-ha-calico/kubernetes/compute.yml
+++ b/classes/cluster/k8s-ha-calico/kubernetes/compute.yml
@@ -44,9 +44,9 @@
     network:
       resolv:
         dns:
-          - 10.254.0.10
+          - 172.18.208.44
           - 172.18.176.4
-          - 172.18.176.7
+          - 10.254.0.10
       interface:
         ens3:
           enabled: true
@@ -56,14 +56,13 @@
           address: ${_param:deploy_address}
           netmask: 255.255.255.0
           gateway: 192.168.10.1
-          route:
-            kubernetes_services:
-              address: 10.254.0.0
-              netmask: 255.255.0.0
-              gateway: ${_param:deploy_address}
+          post_up_cmds:
+            - ip r rep 10.254.0.0/16 via ${_param:deploy_address}
         ens4:
           enabled: true
           type: eth
           proto: static
           address: ${_param:single_address}
           netmask: '255.255.255.0'
+          ipflush_onchange: true
+          restart_on_ipflush: true
diff --git a/classes/cluster/sl-k8s-calico/kubernetes/compute.yml b/classes/cluster/sl-k8s-calico/kubernetes/compute.yml
index 3522796..c041583 100644
--- a/classes/cluster/sl-k8s-calico/kubernetes/compute.yml
+++ b/classes/cluster/sl-k8s-calico/kubernetes/compute.yml
@@ -44,9 +44,9 @@
     network:
       resolv:
         dns:
-          - 10.254.0.10
+          - 172.18.208.44
           - 172.18.176.4
-          - 172.18.176.7
+          - 10.254.0.10
       interface:
         ens3:
           enabled: true
diff --git a/classes/cluster/sl-os-contrail/openstack/control.yml b/classes/cluster/sl-os-contrail/openstack/control.yml
index dee70ed..8404be4 100755
--- a/classes/cluster/sl-os-contrail/openstack/control.yml
+++ b/classes/cluster/sl-os-contrail/openstack/control.yml
@@ -40,6 +40,7 @@
 - system.galera.server.database.keystone
 - system.galera.server.database.nova
 - system.galera.server.database.designate
+- system.keepalived.cluster.instance.stacklight_control_vip
 - cluster.sl-os-contrail
 parameters:
   _param:
diff --git a/classes/cluster/sl-os-ovs/openstack/control.yml b/classes/cluster/sl-os-ovs/openstack/control.yml
index ea1cdd6..d6a9752 100644
--- a/classes/cluster/sl-os-ovs/openstack/control.yml
+++ b/classes/cluster/sl-os-ovs/openstack/control.yml
@@ -28,6 +28,7 @@
 - system.galera.server.database.keystone
 - system.galera.server.database.nova
 - system.haproxy.proxy.listen.openstack.nova-placement
+- system.keepalived.cluster.instance.stacklight_control_vip
 - cluster.sl-os-ovs
 parameters:
   _param:
diff --git a/classes/cluster/sl-pike-dvr/openstack/control.yml b/classes/cluster/sl-pike-dvr/openstack/control.yml
index 643c144..e7f531e 100644
--- a/classes/cluster/sl-pike-dvr/openstack/control.yml
+++ b/classes/cluster/sl-pike-dvr/openstack/control.yml
@@ -37,6 +37,7 @@
 - system.galera.server.database.nova
 - system.galera.server.database.designate
 - system.haproxy.proxy.listen.openstack.nova-placement
+- system.keepalived.cluster.instance.stacklight_control_vip
 - cluster.sl-pike-dvr
 
 parameters:
diff --git a/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/compute.yml b/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/compute.yml
index 16731e3..52c6ade 100644
--- a/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/compute.yml
@@ -4,14 +4,14 @@
 - system.linux.system.repo.mcp.apt_mirantis.saltstack_2016_3
 - system.linux.network.hosts
 - system.linux.storage.loopback
+- system.cinder.volume.single
+- system.cinder.volume.backend.lvm
 - system.nova.compute.cluster
 - system.neutron.compute.cluster
 - system.ceilometer.client.nova_compute
 - system.ceilometer.agent.cluster
 - system.ceilometer.agent.polling.default
 - system.linux.network.interface.single_ovs_dvr
-- service.cinder.volume.single
-- system.cinder.volume.backend.lvm
 - cluster.virtual-mcp-pike-dvr-ssl-barbican
 parameters:
   _param:
diff --git a/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/control.yml b/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/control.yml
index 88f6f53..98bdc23 100644
--- a/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/control.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/control.yml
@@ -30,6 +30,7 @@
 - system.nova.control.cluster
 - system.neutron.control.openvswitch.cluster
 - system.cinder.control.cluster
+- system.cinder.control.backend.lvm
 - system.heat.server.cluster
 - system.designate.server.cluster
 - system.galera.server.cluster
@@ -306,6 +307,9 @@
         port: ${_param:rabbitmq_port}
         ssl:
           enabled: ${_param:rabbitmq_ssl_enabled}
+      notification:
+        notify_on:
+          state_change: vm_and_task_state
   cinder:
     controller:
       controller:
diff --git a/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/proxy.yml b/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/proxy.yml
index 074dd4f..69159d4 100644
--- a/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/proxy.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr-ssl-barbican/openstack/proxy.yml
@@ -7,6 +7,7 @@
 - cluster.virtual-mcp-pike-dvr-ssl-barbican
 parameters:
   _param:
+    cluster_public_host:  ${_param:openstack_proxy_address}
     nginx_proxy_ssl:
       enabled: true
       authority: ${_param:salt_minion_ca_authority}
diff --git a/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/compute.yml b/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/compute.yml
index 72c1133..bb4d099 100644
--- a/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/compute.yml
@@ -3,6 +3,9 @@
 - system.linux.system.repo.mcp.extra
 - system.linux.system.repo.mcp.apt_mirantis.saltstack_2016_3
 - system.linux.network.hosts
+- system.linux.storage.loopback
+- system.cinder.volume.single
+- system.cinder.volume.backend.lvm
 - system.nova.compute.cluster
 - system.neutron.compute.cluster
 - system.ceilometer.client.nova_compute
@@ -17,6 +20,7 @@
     external_interface: ens6
     interface_mtu: 1500
     linux_system_codename: xenial
+    loopback_device_size: 20
   linux:
    network:
      interface:
diff --git a/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/control.yml b/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/control.yml
index 320923c..0e92dbc 100644
--- a/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/control.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/control.yml
@@ -29,6 +29,7 @@
 - system.nova.control.cluster
 - system.neutron.control.openvswitch.cluster
 - system.cinder.control.cluster
+- system.cinder.control.backend.lvm
 - system.heat.server.cluster
 - system.designate.server.cluster
 - system.galera.server.cluster
@@ -239,6 +240,9 @@
         port: ${_param:rabbitmq_port}
         ssl:
           enabled: ${_param:rabbitmq_ssl_enabled}
+      notification:
+        notify_on:
+          state_change: vm_and_task_state
   cinder:
     controller:
       identity:
diff --git a/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/proxy.yml b/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/proxy.yml
index fd43ed6..0abc6b8 100644
--- a/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/proxy.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr-ssl/openstack/proxy.yml
@@ -7,6 +7,7 @@
 - cluster.virtual-mcp-pike-dvr-ssl
 parameters:
   _param:
+    cluster_public_host:  ${_param:openstack_proxy_address}
     nginx_proxy_ssl:
       enabled: true
       authority: ${_param:salt_minion_ca_authority}
diff --git a/classes/cluster/virtual-mcp-pike-dvr/openstack/compute.yml b/classes/cluster/virtual-mcp-pike-dvr/openstack/compute.yml
index 9a227d1..3de11a6 100644
--- a/classes/cluster/virtual-mcp-pike-dvr/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr/openstack/compute.yml
@@ -5,6 +5,9 @@
 - system.linux.network.hosts
 - system.nova.compute.cluster
 - system.neutron.compute.cluster
+- system.cinder.volume.single
+- system.cinder.volume.backend.lvm
+- system.linux.storage.loopback
 - system.ceilometer.client.nova_compute
 - system.ceilometer.agent.cluster
 - system.ceilometer.agent.polling.default
@@ -17,6 +20,7 @@
     external_interface: ens6
     interface_mtu: 1500
     linux_system_codename: xenial
+    loopback_device_size: 20
   nova:
     compute:
       vncproxy_url: http://${_param:cluster_vip_address}:6080
diff --git a/classes/cluster/virtual-mcp-pike-dvr/openstack/control.yml b/classes/cluster/virtual-mcp-pike-dvr/openstack/control.yml
index b9eff71..3211628 100644
--- a/classes/cluster/virtual-mcp-pike-dvr/openstack/control.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr/openstack/control.yml
@@ -21,6 +21,7 @@
 - system.nova.control.cluster
 - system.neutron.control.openvswitch.cluster
 - system.cinder.control.cluster
+- system.cinder.control.backend.lvm
 - system.heat.server.cluster
 - system.designate.server.cluster
 - system.galera.server.cluster
@@ -116,6 +117,9 @@
         novncproxy_port: 6080
       vncproxy_url: http://${_param:cluster_vip_address}:6080
       workers: 1
+      notification:
+        notify_on:
+          state_change: vm_and_task_state
   manila:
     common:
       default_share_type: default
diff --git a/classes/cluster/virtual-mcp-pike-dvr/openstack/proxy.yml b/classes/cluster/virtual-mcp-pike-dvr/openstack/proxy.yml
index 3420f43..d6ea854 100644
--- a/classes/cluster/virtual-mcp-pike-dvr/openstack/proxy.yml
+++ b/classes/cluster/virtual-mcp-pike-dvr/openstack/proxy.yml
@@ -7,9 +7,10 @@
 - cluster.virtual-mcp-pike-dvr
 parameters:
   _param:
+    cluster_public_host:  ${_param:openstack_proxy_address}
     nginx_proxy_ssl:
       enabled: true
       authority: ${_param:salt_minion_ca_authority}
       engine: salt
       mode: secure
-    salt_minion_ca_host: cfg01.${_param:cluster_domain}
\ No newline at end of file
+    salt_minion_ca_host: cfg01.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml b/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml
index 3fd3bce..650743c 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/openstack/compute.yml
@@ -5,6 +5,9 @@
 - system.linux.network.hosts
 - system.nova.compute.cluster
 - system.neutron.compute.cluster
+- system.cinder.volume.single
+- system.cinder.volume.backend.lvm
+- system.linux.storage.loopback
 - system.ceilometer.agent.cluster
 - system.ceilometer.agent.polling.default
 - cluster.virtual-mcp-pike-ovs
@@ -15,6 +18,7 @@
     external_interface: ens6
     interface_mtu: 1500
     linux_system_codename: xenial
+    loopback_device_size: 20
   neutron:
     compute:
       bgp_vpn:
diff --git a/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml b/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml
index 4ab6709..1d044c0 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/openstack/control.yml
@@ -21,6 +21,7 @@
 - system.nova.control.cluster
 - system.neutron.control.openvswitch.cluster
 - system.cinder.control.cluster
+- system.cinder.control.backend.lvm
 - system.heat.server.cluster
 - system.designate.server.cluster
 - system.designate.server.backend.bind
@@ -136,6 +137,9 @@
         novncproxy_port: 6080
       vncproxy_url: http://${_param:cluster_vip_address}:6080
       workers: 1
+      notification:
+        notify_on:
+          state_change: vm_and_task_state
   manila:
     common:
       default_share_type: default
diff --git a/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml b/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml
index 2819d1e..83edc51 100644
--- a/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml
+++ b/classes/cluster/virtual-mcp-pike-ovs/openstack/proxy.yml
@@ -7,6 +7,7 @@
 - cluster.virtual-mcp-pike-ovs
 parameters:
   _param:
+    cluster_public_host:  ${_param:openstack_proxy_address}
     nginx_proxy_ssl:
       enabled: true
       authority: ${_param:salt_minion_ca_authority}
diff --git a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/control.yml b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/control.yml
index 7fcf421..0726fd1 100755
--- a/classes/cluster/virtual-mcp11-contrail-nfv/openstack/control.yml
+++ b/classes/cluster/virtual-mcp11-contrail-nfv/openstack/control.yml
@@ -42,6 +42,7 @@
 - system.galera.server.database.nova
 - system.galera.server.database.designate
 - system.heka.alarm.openstack_control
+- system.keepalived.cluster.instance.stacklight_control_vip
 - cluster.virtual-mcp11-contrail-nfv
 parameters:
   _param:
diff --git a/classes/cluster/virtual-mcp11-contrail/openstack/control.yml b/classes/cluster/virtual-mcp11-contrail/openstack/control.yml
index 485c5ab..15b8093 100755
--- a/classes/cluster/virtual-mcp11-contrail/openstack/control.yml
+++ b/classes/cluster/virtual-mcp11-contrail/openstack/control.yml
@@ -40,6 +40,7 @@
 - system.galera.server.database.keystone
 - system.galera.server.database.nova
 - system.galera.server.database.designate
+- system.keepalived.cluster.instance.stacklight_control_vip
 - cluster.virtual-mcp11-contrail
 parameters:
   _param:
diff --git a/classes/cluster/virtual-mcp11-dvr/openstack/control.yml b/classes/cluster/virtual-mcp11-dvr/openstack/control.yml
index ee9785b..efd9d9f 100644
--- a/classes/cluster/virtual-mcp11-dvr/openstack/control.yml
+++ b/classes/cluster/virtual-mcp11-dvr/openstack/control.yml
@@ -33,6 +33,7 @@
 - system.galera.server.database.heat
 - system.galera.server.database.keystone
 - system.galera.server.database.nova
+- system.keepalived.cluster.instance.stacklight_control_vip
 - cluster.virtual-mcp11-dvr
 
 parameters:
diff --git a/classes/cluster/virtual-offline-ssl/openstack/proxy.yml b/classes/cluster/virtual-offline-ssl/openstack/proxy.yml
index b1c9686..bea4384 100644
--- a/classes/cluster/virtual-offline-ssl/openstack/proxy.yml
+++ b/classes/cluster/virtual-offline-ssl/openstack/proxy.yml
@@ -7,6 +7,7 @@
 - cluster.virtual-offline-ssl
 parameters:
   _param:
+    cluster_public_host:  ${_param:openstack_proxy_address}
     nginx_proxy_ssl:
       enabled: true
       authority: ${_param:salt_minion_ca_authority}
diff --git a/classes/system b/classes/system
index 00b52f8..8b772e1 160000
--- a/classes/system
+++ b/classes/system
@@ -1 +1 @@
-Subproject commit 00b52f8b45f69f9d76c08c550319251b10c08284
+Subproject commit 8b772e123bb9cddf93e8290ca2601bda2fcd6ed9
diff --git a/test/integration/cluster/01_salt_highstate_spec.rb b/test/integration/cluster/01_salt_highstate_spec.rb
new file mode 100644
index 0000000..7666571
--- /dev/null
+++ b/test/integration/cluster/01_salt_highstate_spec.rb
@@ -0,0 +1,11 @@
+
+describe command('salt-call pillar.items') do
+  its('exit_status') { should eq 0 }
+end
+
+# to enforce full highstate
+# once switched fully to new reclass
+#describe command('salt-call state.apply') do
+  #its('exit_status') { should eq 0 }
+  ##its('stdout') { should match (/Failed: 0/) }
+#end
diff --git a/test/integration/cluster/02_verify_minions_spec.rb b/test/integration/cluster/02_verify_minions_spec.rb
new file mode 100644
index 0000000..63becc0
--- /dev/null
+++ b/test/integration/cluster/02_verify_minions_spec.rb
@@ -0,0 +1,6 @@
+
+describe command('bash /srv/salt/bootstrap.sh') do
+  its('exit_status') { should eq 0 }
+  #its('stdout') { should match (/XCVDSGSG/) }
+end
+
diff --git a/verify.sh b/verify.sh
deleted file mode 100755
index 3b94176..0000000
--- a/verify.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-
-#export HOSTNAME=${`hostname -s`}
-#export DOMAIN=${`hostname -d`}
-cd /srv/salt/scripts; git pull -r || true; source bootstrap.sh || exit 1
-
-# BOOTSTRAP
-if [[ $BOOTSTRAP =~ ^(True|true|1|yes)$ ]]; then
-  # workarounds for kitchen
-  test ! -e /tmp/kitchen  || (mkdir -p /srv/salt/reclass; rsync -avh /tmp/kitchen/ /srv/salt/reclass)
-  cd /srv/salt/reclass
-  # clone latest system-level if missing
-  if [[ -e .gitmodules ]] && [[ ! -e classes/system/linux ]]; then
-    git submodule update --init --recursive --remote || true
-  fi
-  source_local_envs
-  /srv/salt/scripts/bootstrap.sh &&\
-  if [[ -e /tmp/kitchen ]]; then sed -i '/BOOTSTRAP=/d' /kitchen.env; fi
-fi
-
-# VERIFY
-export RECLASS_IGNORE_CLASS_NOTFOUND=False
-cd /srv/salt/reclass &&\
-if [[ -z "$1" ]] ; then
-  verify_salt_master &&\
-  verify_salt_minions
-else
-  verify_salt_minion "$1"
-fi