Remove LMA form offline-dpdk, add telemetry

Change-Id: I8b500f044bdd830dde25fbd1571fd7965cb92122
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml
index 56dbe98..6f58513 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/infra/config.yml
@@ -7,25 +7,29 @@
 #- system.openssh.client.lab
 - system.salt.master.pkg
 - system.salt.master.api
+- system.salt.master.formula.pkg.gnocchi
+- system.salt.master.formula.pkg.panko
 - system.reclass.storage.salt
 - system.salt.minion.ca.salt_master
 - system.salt.minion.cert.proxy
 - system.keystone.client.single
-- system.keystone.client.service.aodh
-- system.keystone.client.service.ceilometer
 - system.keystone.client.service.nova21
 - system.keystone.client.service.nova-placement
-- system.keystone.client.service.glare
 - system.keystone.client.service.cinder3
 - system.keystone.client.service.designate
-- system.mysql.client.single
+- system.keystone.client.service.aodh
+- system.keystone.client.service.ceilometer
+- system.keystone.client.service.panko
+- system.keystone.client.service.gnocchi
+- system.gnocchi.client
+- system.gnocchi.client.v1.archive_policy.default
+- system.reclass.storage.system.openstack_dns_cluster
 - system.reclass.storage.system.openstack_control_cluster
 - system.reclass.storage.system.openstack_compute_multi
 - system.reclass.storage.system.openstack_gateway_single
 - system.reclass.storage.system.openstack_dashboard_single
-- system.reclass.storage.system.stacklightv2_server_cluster
+- system.reclass.storage.system.openstack_telemetry_cluster
 - cluster.virtual-offline-pike-ovs-dpdk.infra.backup.client_common
-- cluster.virtual-offline-pike-ovs-dpdk.stacklight.proxy
 - cluster.virtual-offline-pike-ovs-dpdk
 parameters:
   _param:
@@ -125,20 +129,15 @@
           cluster_param:
             openstack_gateway_node01_address:
               value_template: <<node_control_ip>>
-        stacklight_monitor_node01:
-          expression: <<node_hostname>>__equals__mon01
+        openstack_dns01:
+          expression: <<node_hostname>>__equals__dns01
           cluster_param:
-            stacklight_monitor_node01_address:
+            openstack_dns_node01_address:
               value_template: <<node_control_ip>>
-        stacklight_monitor_node02:
-          expression: <<node_hostname>>__equals__mon02
+        openstack_dns02:
+          expression: <<node_hostname>>__equals__dns02
           cluster_param:
-            stacklight_monitor_node02_address:
-              value_template: <<node_control_ip>>
-        stacklight_monitor_node03:
-          expression: <<node_hostname>>__equals__mon03
-          cluster_param:
-            stacklight_monitor_node03_address:
+            openstack_dns_node02_address:
               value_template: <<node_control_ip>>
         openstack_dashboard:
           expression: <<node_hostname>>__startswith__prx
@@ -149,6 +148,21 @@
           cluster_param:
             openstack_proxy_node01_address:
               value_template: <<node_control_ip>>
+        openstack_telemetry01:
+          expression: <<node_hostname>>__equals__mdb01
+          cluster_param:
+            openstack_telemetry_node01_address:
+              value_template: <<node_control_ip>>
+        openstack_telemetry02:
+          expression: <<node_hostname>>__equals__mdb02
+          cluster_param:
+            openstack_telemetry_node02_address:
+              value_template: <<node_control_ip>>
+        openstack_telemetry03:
+          expression: <<node_hostname>>__equals__mdb03
+          cluster_param:
+            openstack_telemetry_node03_address:
+              value_template: <<node_control_ip>>
       node:
         openstack_control_node01:
           classes:
@@ -170,10 +184,6 @@
           params:
             mysql_cluster_role: slave
             linux_system_codename: xenial
-        stacklight_server_node01:
-          classes:
-          - system.influxdb.server.single
-          - system.influxdb.database.stacklight
         openstack_compute_node01:
           params:
             dpdk0_name: ens5
@@ -197,3 +207,15 @@
           - cluster.virtual-offline-pike-ovs-dpdk.openstack.proxy
           params:
             linux_system_codename: xenial
+        openstack_telemetry_node01:
+          params:
+            # create resources only from 1 controller
+            # to prevent race conditions
+            ceilometer_create_gnocchi_resources: true
+            redis_cluster_role: 'master'
+        openstack_telemetry_node02:
+          params:
+            redis_cluster_role: 'slave'
+        openstack_telemetry_node03:
+          params:
+            redis_cluster_role: 'slave'
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/init.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/init.yml
index 45efcbd..84fdfce 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/init.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/init.yml
@@ -1,8 +1,5 @@
 classes:
 - system.linux.network.dynamic_hosts
-- service.grafana.collector
-- system.heka.log_collector.single
-- system.heka.log_collector.output.telegraf
 - system.linux.system.repo_local.mcp.extra
 - system.linux.system.repo.mcp.apt_mirantis.saltstack
 - system.linux.system.repo.mcp.apt_mirantis.ubuntu
@@ -10,15 +7,12 @@
 - system.linux.system.single.debian
 - system.watchdog.server
 - system.rsyslog.client.single
-- system.prometheus.collector
-- system.telegraf.agent
 - system.openssh.server.team.lab
 - system.openssh.server.team.tcpcloud
 - system.openssh.server.team.mcp_qa
 - system.auditd.server.ciscat
 - cluster.virtual-offline-pike-ovs-dpdk.infra
 - cluster.virtual-offline-pike-ovs-dpdk.openstack
-- cluster.virtual-offline-pike-ovs-dpdk.stacklight
 
 parameters:
   _param:
@@ -48,15 +42,8 @@
     openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
     openstack_message_queue_node03_address: ${_param:openstack_control_node03_address}
     # stacklight service addresses
-    stacklight_monitor_address: 172.16.10.253
-    stacklight_monitor_node01_address: 172.16.10.107
-    stacklight_monitor_node02_address: 172.16.10.108
-    stacklight_monitor_node03_address: 172.16.10.109
-    stacklight_telemetry_node01_address: ${_param:stacklight_monitor_node01_address}
-    stacklight_log_address: ${_param:stacklight_monitor_address}
     openstack_gateway_address: 172.16.10.110
     openstack_gateway_node01_address: ${_param:openstack_gateway_address}
-    stacklight_telemetry_address: ${_param:stacklight_monitor_address}
     remote_rsyslog_host: 127.0.0.3
     remote_rsyslog_port: 10514
   rsyslog:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml
index 3afa5eb..85e9a29 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/compute.yml
@@ -6,8 +6,12 @@
 - system.linux.network.hosts
 - system.nova.compute.cluster
 - system.neutron.compute.cluster
-- system.ceilometer.agent.cluster
-- system.prometheus.exporters.libvirt
+- system.cinder.volume.single
+- system.cinder.volume.backend.lvm
+- system.linux.storage.loopback
+- system.ceilometer.client.nova_compute
+- system.ceilometer.agent.telemetry.cluster
+- system.ceilometer.agent.polling.default
 - cluster.virtual-offline-pike-ovs-dpdk
 - system.nova.compute.nfv.hugepages
 - system.nova.compute.nfv.cpu_pinning
@@ -30,20 +34,37 @@
     compute_hugepages_size: 2M
     compute_hugepages_count: 2048
     compute_hugepages_mount: /mnt/hugepages_2M
+    loopback_device_size: 20
 
   nova:
     compute:
       vncproxy_url: http://${_param:cluster_vip_address}:6080
-      notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
-        notify_on:
-          state_change: vm_and_task_state
       message_queue:
         members:
           - host: ${_param:openstack_control_node01_address}
           - host: ${_param:openstack_control_node02_address}
           - host: ${_param:openstack_control_node03_address}
+      # Compute nodes on devcloud can have different CPUs, we need this
+      # to make sure live migration always work even when cmp VMs are on different computes
+      cpu_mode: custom
+      libvirt:
+        cpu_model: kvm64
+        logging:
+          level: 3
+          filters: '3:remote 4:event'
+          outputs: '3:syslog:libvirtd'
+          buffer_size: 64
+      qemu:
+        logging:
+          handler: logd
+      virtlog:
+        enabled: true
+        level: 3
+        filters: '3:remote 4:event'
+        outputs: '3:syslog:virtlogd'
+        max_clients: 1024
+        max_size: 2097152
+        max_backups: 3
   neutron:
     compute:
       bgp_vpn:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml
index 90f5f24..757102c 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/control.yml
@@ -21,24 +21,22 @@
 - system.nova.control.cluster
 - system.neutron.control.openvswitch.cluster
 - system.cinder.control.cluster
+- system.cinder.control.backend.lvm
 - system.heat.server.cluster
-- system.ceilometer.server.cluster
-- system.ceilometer.server.backend.influxdb
-- system.aodh.server.cluster
-- system.heka.ceilometer_collector.single
 - system.designate.server.cluster
-- system.designate.server.backend.bind
-- system.bind.server.single
 - system.galera.server.cluster
-- system.galera.server.database.aodh
-- system.galera.server.database.ceilometer
 - system.galera.server.database.cinder
 - system.galera.server.database.glance
-- system.galera.server.database.grafana
 - system.galera.server.database.heat
 - system.galera.server.database.keystone
 - system.galera.server.database.nova
 - system.galera.server.database.designate
+- system.galera.server.database.aodh
+- system.galera.server.database.panko
+- system.galera.server.database.gnocchi
+- system.ceilometer.client
+- system.ceilometer.client.cinder_volume
+- system.ceilometer.client.neutron
 - system.haproxy.proxy.listen.openstack.nova-placement
 - cluster.virtual-offline-pike-ovs-dpdk
 parameters:
@@ -62,28 +60,25 @@
       instance:
         VIP:
           virtual_router_id: 150
-  bind:
-    server:
-      control:
-        mgmt:
-          enabled: true
-          bind:
-            address: ${_param:single_address}
-            port: 953
-          allow:
-            - ${_param:openstack_control_node01_address}
-            - ${_param:openstack_control_node02_address}
-            - ${_param:openstack_control_node03_address}
-          keys:
-            - designate
   keystone:
     server:
       admin_email: ${_param:admin_email}
-      notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
+
   designate:
+    pool_manager:
+      enabled: ${_param:designate_pool_manager_enabled}
+      periodic_sync_interval: ${_param:designate_pool_manager_periodic_sync_interval}
     server:
+      enabled: ${_param:designate_server_enabled}
+      domain_id: ${_param:designate_domain_id}
+      version: ${_param:designate_version}
+      backend:
+        pdns4:
+          api_token: ${_param:designate_pdns_api_key}
+          api_endpoint: ${_param:designate_pdns_api_endpoint}
+      mdns:
+        address: ${_param:designate_mdns_address}
+        port: ${_param:designate_mdns_port}
       pools:
         default:
           description: 'test pool'
@@ -95,44 +90,22 @@
               description: 'test target2'
               masters: ${_param:designate_pool_target_masters}
               options:
-                host: ${_param:openstack_control_node02_address}
+                host: ${_param:openstack_dns_node02_address}
                 port: 53
-                rndc_host: ${_param:openstack_control_node02_address}
-                rndc_port: 953
-                rndc_key_file: /etc/designate/rndc.key
-            default2:
-              type: ${_param:designate_pool_target_type}
-              description: 'test target3'
-              masters: ${_param:designate_pool_target_masters}
-              options:
-                host: ${_param:openstack_control_node03_address}
-                port: 53
-                rndc_host: ${_param:openstack_control_node03_address}
-                rndc_port: 953
-                rndc_key_file: /etc/designate/rndc.key
+                api_endpoint: "http://${_param:openstack_dns_node02_address}:${_param:powerdns_webserver_port}"
+                api_token: ${_param:designate_pdns_api_key}
       quota:
         zones: ${_param:designate_quota_zones}
-    worker:
-      enabled: ${_param:designate_worker_enabled}
+
   glance:
     server:
       storage:
         engine: file
       images: []
       workers: 1
-      notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
-  heat:
-    server:
-      notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
+
   neutron:
     server:
-      notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
       l2gw:
         enabled: true
   nova:
@@ -148,14 +121,5 @@
       vncproxy_url: http://${_param:cluster_vip_address}:6080
       workers: 1
       notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
-  cinder:
-    volume:
-      notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
-    controller:
-      notification:
-        driver: messagingv2
-        topics: "notifications,${_param:stacklight_notification_topic}"
+        notify_on:
+          state_change: vm_and_task_state
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dns.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dns.yml
new file mode 100644
index 0000000..ca49ae6
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/dns.yml
@@ -0,0 +1,35 @@
+classes:
+- system.powerdns.server.single
+- cluster.virtual-offline-pike-ovs-dpdk
+
+parameters:
+  powerdns:
+    server:
+      api:
+          enabled: True
+          key: ${_param:designate_pdns_api_key}
+      axfr_ips:
+          ${_param:powerdns_axfr_ips}
+      bind:
+          address: ${_param:single_address}
+      overwrite_supermasters: True
+      supermasters:
+          ${_param:powerdns_supermasters}
+      webserver:
+          enabled: True
+          address: ${_param:single_address}
+          password: ${_param:powerdns_webserver_password}
+          port: ${_param:powerdns_webserver_port}
+  linux:
+    system:
+      package:
+        python-msgpack:
+          version: latest
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml
index 9e0e96a..2dea160 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/gateway.yml
@@ -13,6 +13,9 @@
     linux_system_codename: xenial
   neutron:
     gateway:
+      notification:
+        driver: messagingv2
+        topics: "notifications"
       l2gw:
         enabled: false
         ovsdb_hosts:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/init.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/init.yml
index 3e5bf97..663be7e 100644
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/init.yml
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/init.yml
@@ -1,14 +1,52 @@
 parameters:
   _param:
+    # openstack service addresses
+    openstack_database_address: 172.16.10.254
+    openstack_proxy_address: 172.16.10.121
+    openstack_proxy_node01_address: 172.16.10.121
+    openstack_control_address: 172.16.10.254
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    openstack_control_node01_address: 172.16.10.101
+    openstack_control_node02_address: 172.16.10.102
+    openstack_control_node03_address: 172.16.10.103
+    openstack_database_address: ${_param:openstack_control_address}
+    openstack_database_node01_address: ${_param:openstack_control_node01_address}
+    openstack_database_node02_address: ${_param:openstack_control_node02_address}
+    openstack_database_node03_address: ${_param:openstack_control_node03_address}
+    openstack_message_queue_address: ${_param:openstack_control_address}
+    openstack_message_queue_node01_address: ${_param:openstack_control_node01_address}
+    openstack_message_queue_node02_address: ${_param:openstack_control_node02_address}
+    openstack_message_queue_node03_address: ${_param:openstack_control_node03_address}
+    openstack_gateway_address: 172.16.10.110
+    openstack_gateway_node01_address: ${_param:openstack_gateway_address}
+    openstack_gateway_node01_external_address: 10.16.0.110
+    openstack_dns_node01_address: 172.16.10.111
+    openstack_dns_node02_address: 172.16.10.112
+    openstack_telemetry_address: 172.16.10.250
+    openstack_telemetry_node01_address: 172.16.10.45
+    openstack_telemetry_node02_address: 172.16.10.46
+    openstack_telemetry_node03_address: 172.16.10.47
+    openstack_telemetry_system_codename: xenial
+    openstack_telemetry_hostname: mdb
+    openstack_telemetry_node01_hostname: mdb01
+    openstack_telemetry_node02_hostname: mdb02
+    openstack_telemetry_node03_hostname: mdb03
+    openstack_telemetry_keepalived_password: hf9GQOjG2uPhkJ2Q
+    openstack_log_appender: true
+    openstack_ossyslog_handler_enabled: true
+
     openstack_version: pike
+    apt_mk_version: nightly
     cinder_version: ${_param:openstack_version}
-    apt_mk_version: testing
-    mcp_version: 2018.1
+    mcp_repo_version: 1.1
     openstack_region: RegionOne
     admin_email: root@localhost
-    cluster_public_protocol: http
     cluster_public_host: 172.16.10.254
+    telemetry_public_host: ${_param:openstack_telemetry_address}
     neutron_public_protocol: http
+    cluster_public_protocol: http
     neutron_control_dvr: False
     neutron_tenant_network_types: "flat,vxlan"
     neutron_l3_ha: False
@@ -19,8 +57,6 @@
     neutron_compute_dvr: False
     neutron_compute_agent_mode: legacy
     neutron_compute_external_access: False
-    neutron_enable_bgp_vpn: True
-    neutron_bgp_vpn_driver: bagpipe
     galera_server_cluster_name: openstack_cluster
     galera_server_maintenance_password: workshop
     galera_server_admin_password: workshop
@@ -32,45 +68,69 @@
     cluster_vip_address: 172.16.10.254
     cluster_local_address: ${_param:single_address}
     cluster_node01_hostname: ctl01
-    cluster_node01_address: 172.16.10.101
+    cluster_node01_address: ${_param:openstack_control_node01_address}
     cluster_node02_hostname: ctl02
-    cluster_node02_address: 172.16.10.102
+    cluster_node02_address: ${_param:openstack_control_node02_address}
     cluster_node03_hostname: ctl03
-    cluster_node03_address: 172.16.10.103
+    cluster_node03_address: ${_param:openstack_control_node03_address}
     rabbitmq_secret_key: workshop
     rabbitmq_admin_password: workshop
     rabbitmq_openstack_password: workshop
     rabbitmq_cold_password: workshop
+    powerdns_axfr_ips:
+      - ${_param:openstack_control_node01_address}
+      - ${_param:openstack_control_node02_address}
+      - ${_param:openstack_control_node03_address}
+      - 127.0.0.1
+    powerdns_supermasters:
+      - ip: ${_param:openstack_control_node01_address}
+        nameserver: ns1.example.org
+        account: master
+      - ip: ${_param:openstack_control_node02_address}
+        nameserver: ns2.example.org
+        account: master
+      - ip: ${_param:openstack_control_node03_address}
+        nameserver: ns3.example.org
+        account: master
+    powerdns_overwrite_supermasters: True
+    powerdns_webserver_password: gJ6n3gVaYP8eS
+    powerdns_webserver_port: 8081
     designate_admin_api_enabled: true
-    designate_bind9_rndc_key: 4pc+X4PDqb2q+5o72dISm72LM1Ds9X2EYZjqg+nmsS7FhdTwzFFY8l/iEDmHxnyjkA33EQC8H+z0fLLBunoitw==
+    designate_server_enabled: true
     designate_domain_id: 5186883b-91fb-4891-bd49-e6769234a8fc
-    designate_quota_zones: 40
+    designate_mdns_address: 0.0.0.0
+    designate_mdns_port: 53
+    designate_pdns_api_key: VxK9cMlFL5Ae
+    designate_pdns_api_endpoint: "http://${_param:openstack_dns_node01_address}:${_param:powerdns_webserver_port}"
+    designate_pool_manager_enabled: True
+    designate_pool_manager_periodic_sync_interval: '120'
     designate_pool_ns_records:
       - hostname: 'ns1.example.org.'
         priority: 10
+      - hostname: 'ns2.example.org.'
+        priority: 20
+      - hostname: 'ns3.example.org.'
+        priority: 30
     designate_pool_nameservers:
-      - host: ${_param:openstack_control_node01_address}
+      - host: ${_param:openstack_dns_node01_address}
         port: 53
-      - host: ${_param:openstack_control_node02_address}
+      - host: ${_param:openstack_dns_node02_address}
         port: 53
-      - host: ${_param:openstack_control_node03_address}
-        port: 53
-    designate_pool_target_type: bind9
+    designate_pool_target_type: pdns4
     designate_pool_target_masters:
       - host: ${_param:openstack_control_node01_address}
-        port: 5354
+        port: 53
       - host: ${_param:openstack_control_node02_address}
-        port: 5354
+        port: 53
       - host: ${_param:openstack_control_node03_address}
-        port: 5354
+        port: 53
     designate_pool_target_options:
-      host: ${_param:openstack_control_node01_address}
+      host: ${_param:openstack_dns_node01_address}
       port: 53
-      rndc_host: ${_param:openstack_control_node01_address}
-      rndc_port: 953
-      rndc_key_file: /etc/designate/rndc.key
+      api_token: ${_param:designate_pdns_api_key}
+      api_endpoint: ${_param:designate_pdns_api_endpoint}
+    designate_quota_zones: 40
     designate_version: ${_param:openstack_version}
-    designate_worker_enabled: true
     glance_version: ${_param:openstack_version}
     glance_service_host: ${_param:cluster_vip_address}
     keystone_version: ${_param:openstack_version}
@@ -78,14 +138,20 @@
     heat_version: ${_param:openstack_version}
     heat_service_host: ${_param:cluster_vip_address}
     heat_domain_admin_password: workshop
-    ceilometer_version: ${_param:openstack_version}
-    ceilometer_service_host: ${_param:cluster_vip_address}
     cinder_version: ${_param:openstack_version}
     cinder_service_host: ${_param:cluster_vip_address}
+    panko_version: ${_param:openstack_version}
+    panko_service_host: ${_param:openstack_telemetry_address}
+    ceilometer_version: ${_param:openstack_version}
+    ceilometer_service_host: ${_param:openstack_telemetry_address}
     aodh_version: ${_param:openstack_version}
-    aodh_service_host: ${_param:cluster_vip_address}
-    ceilometer_graphite_publisher_host: 172.16.10.107
-    ceilometer_graphite_publisher_port: 2013
+    aodh_service_host: ${_param:openstack_telemetry_address}
+    gnocchi_version: 4.0
+    gnocchi_service_host: ${_param:openstack_telemetry_address}
+    gnocchi_public_host: ${_param:telemetry_public_host}
+    aodh_public_host: ${_param:telemetry_public_host}
+    ceilometer_public_host: ${_param:telemetry_public_host}
+    panko_public_host: ${_param:telemetry_public_host}
     nova_version: ${_param:openstack_version}
     nova_service_host: ${_param:cluster_vip_address}
     nova_vncproxy_url: http://${_param:cluster_vip_address}:8060
@@ -93,22 +159,23 @@
     neutron_service_host: ${_param:cluster_vip_address}
     glusterfs_service_host: ${_param:cluster_vip_address}
     designate_service_host: ${_param:cluster_vip_address}
-    metadata_password: workshop
+    metadata_password: password
     mysql_admin_user: root
     mysql_admin_password: workshop
     mysql_cinder_password: workshop
-    mysql_ceilometer_password: workshop
     mysql_glance_password: workshop
     mysql_grafana_password: workshop
     mysql_heat_password: workshop
     mysql_keystone_password: workshop
     mysql_neutron_password: workshop
     mysql_nova_password: workshop
-    mysql_aodh_password: workshop
     mysql_designate_password: workshop
+    mysql_ceilometer_password: workshop
+    mysql_panko_password: workshop
+    mysql_aodh_password: workshop
+    mysql_gnocchi_password: workshop
     keystone_service_token: workshop
     keystone_admin_password: workshop
-    keystone_ceilometer_password: workshop
     keystone_aodh_password: workshop
     keystone_cinder_password: workshop
     keystone_glance_password: workshop
@@ -117,19 +184,19 @@
     keystone_neutron_password: workshop
     keystone_nova_password: workshop
     keystone_designate_password: workshop
-    ceilometer_secret_key: workshop
+    keystone_aodh_password: workshop
+    keystone_panko_password: workshop
+    keystone_ceilometer_password: workshop
+    keystone_gnocchi_password: workshop
     horizon_version: ${_param:openstack_version}
     horizon_secret_key: opaesee8Que2yahJoh9fo0eefo1Aeyo6ahyei8zeiboh3aeth5loth7ieNa5xi5e
     horizon_identity_host: ${_param:cluster_vip_address}
     horizon_identity_encryption: none
     horizon_identity_version: 2
-    mongodb_server_replica_set: ceilometer
-    mongodb_ceilometer_password: cloudlab
-    mongodb_admin_password: cloudlab
-    mongodb_shared_key: eoTh1AwahlahqueingeejooLughah4tei9feing0eeVaephooDi2li1TaeV1ooth
-    ceilometer_influxdb_password: lmapass
-    openstack_log_appender: true
-    openstack_ossyslog_handler_enabled: true
+    ceilometer_secret_key: workshop
+    ceilometer_agent_default_polling_interval: 15
+    ceilometer_agent_default_polling_meters:
+      - "*"
   linux:
     network:
       purge_hosts: true
@@ -179,6 +246,16 @@
           names:
           - cmp02
           - cmp02.${_param:cluster_domain}
+        dns01:
+          address: ${_param:openstack_dns_node01_address}
+          names:
+          - dns01
+          - dns01.${_param:cluster_domain}
+        dns02:
+          address: ${_param:openstack_dns_node02_address}
+          names:
+          - dns02
+          - dns02.${_param:cluster_domain}
     system:
       user:
         root:
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/share.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/share.yml
new file mode 100644
index 0000000..c804e24
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/share.yml
@@ -0,0 +1,19 @@
+classes:
+- system.linux.system.lowmem
+- system.linux.system.repo.mcp.apt_mirantis.ubuntu
+- system.linux.system.repo_local.mcp.apt_mirantis.openstack
+- system.linux.system.repo_local.mcp.extra
+- system.linux.system.repo.mcp.apt_mirantis.saltstack
+- cluster.virtual-offline-pike-ovs-dpdk
+parameters:
+
+  linux:
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/telemetry.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/telemetry.yml
new file mode 100644
index 0000000..db23a37
--- /dev/null
+++ b/classes/cluster/virtual-offline-pike-ovs-dpdk/openstack/telemetry.yml
@@ -0,0 +1,106 @@
+classes:
+- system.linux.system.repo_local.mcp.apt_mirantis.openstack
+- system.linux.system.repo_local.mcp.extra
+- system.linux.system.repo.mcp.apt_mirantis.saltstack
+- system.linux.system.repo.mcp.apt_mirantis.glusterfs
+- system.linux.system.repo_local.mcp.apt_mirantis.ceph
+- system.memcached.server.single
+- system.apache.server.single
+- system.apache.server.site.gnocchi
+- system.apache.server.site.panko
+- system.glusterfs.server.cluster
+- system.glusterfs.client.cluster
+- system.glusterfs.client.volume.gnocchi
+- system.glusterfs.server.volume.gnocchi
+- service.redis.server.single
+- system.gnocchi.server.cluster
+- system.gnocchi.common.storage.incoming.redis
+- system.gnocchi.common.storage.file
+- system.gnocchi.common.coordination.redis
+- system.ceilometer.server.telemetry.cluster
+- system.ceilometer.server.coordination.redis
+- system.aodh.server.cluster
+- system.aodh.server.coordination.redis
+- system.panko.server.cluster
+- system.ceilometer.server.backend.gnocchi
+- cluster.virtual-offline-pike-ovs-dpdk
+parameters:
+  _param:
+    gnocchi_statsd_resource_id: 07f26121-5777-48ba-8a0b-d70468133dd9
+    keepalived_openstack_telemetry_vip_address: ${_param:openstack_telemetry_address}
+    keepalived_openstack_telemetry_vip_password: ${_param:openstack_telemetry_keepalived_password}
+    keepalived_openstack_telemetry_vip_interface: ens4
+    cluster_vip_address: ${_param:openstack_telemetry_address}
+    cluster_local_address: ${_param:single_address}
+    cluster_node01_hostname: ${_param:openstack_telemetry_node01_hostname}
+    cluster_node01_address: ${_param:openstack_telemetry_node01_address}
+    cluster_node02_hostname: ${_param:openstack_telemetry_node02_hostname}
+    cluster_node02_address: ${_param:openstack_telemetry_node02_address}
+    cluster_node03_hostname: ${_param:openstack_telemetry_node03_hostname}
+    cluster_node03_address: ${_param:openstack_telemetry_node03_address}
+    glusterfs_service_host: ${_param:openstack_telemetry_address}
+    gnocchi_glusterfs_service_host: ${_param:glusterfs_service_host}
+    redis_sentinel_node01_address: ${_param:openstack_telemetry_node01_address}
+    redis_sentinel_node02_address: ${_param:openstack_telemetry_node02_address}
+    redis_sentinel_node03_address: ${_param:openstack_telemetry_node03_address}
+    openstack_telemetry_redis_url: redis://${_param:redis_sentinel_node01_address}:26379?sentinel=master_1&sentinel_fallback=${_param:redis_sentinel_node02_address}:26379&sentinel_fallback=${_param:redis_sentinel_node03_address}:26379
+    gnocchi_coordination_url: ${_param:openstack_telemetry_redis_url}
+    gnocchi_storage_incoming_redis_url: ${_param:openstack_telemetry_redis_url}
+    glusterfs_node01_address: ${_param:cluster_node01_address}
+    glusterfs_node02_address: ${_param:cluster_node02_address}
+    glusterfs_node03_address: ${_param:cluster_node03_address}
+  linux:
+    network:
+      interface:
+        ens4:
+          enabled: true
+          type: eth
+          proto: static
+          address: ${_param:single_address}
+          netmask: 255.255.255.0
+  keepalived:
+    cluster:
+      instance:
+        VIP:
+          virtual_router_id: 160
+  redis:
+    server:
+      version: 3.0
+      bind:
+        address: ${_param:single_address}
+    cluster:
+      enabled: True
+      mode: sentinel
+      role: ${_param:redis_cluster_role}
+      quorum: 2
+      master:
+        host: ${_param:cluster_node01_address}
+        port: 6379
+      sentinel:
+        address: ${_param:single_address}
+  apache:
+    server:
+      modules:
+        - wsgi
+  gnocchi:
+    common:
+      database:
+        host: ${_param:openstack_database_address}
+    server:
+      pkgs:
+      # TODO: move python-memcache installation to formula
+      - gnocchi-api
+      - gnocchi-metricd
+      - python-memcache
+  aodh:
+    server:
+      coordination_backend:
+        url: ${_param:openstack_telemetry_redis_url}
+      identity:
+        host: ${_param:openstack_control_address}
+  ceilometer:
+    server:
+      coordination_backend:
+        url: ${_param:openstack_telemetry_redis_url}
+      identity:
+        host: ${_param:openstack_control_address}
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/client.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/client.yml
deleted file mode 100644
index 4f06868..0000000
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/client.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-classes:
-- system.docker.client
-- system.elasticsearch.client.single
-- system.grafana.client
-- system.grafana.client.datasource.prometheus
-- system.kibana.client.single
-- cluster.virtual-offline-pike-ovs-dpdk
-parameters:
-  _param:
-    # Elasticsearch/Kibana client parameters
-    stacklight_log_address: ${_param:stacklight_monitor_address}
-    # Grafana client parameters
-    grafana_address: ${_param:stacklight_monitor_address}
-    grafana_port: 15013
-    grafana_user: admin
-    grafana_password: ${_param:grafana_admin_password}
-    grafana_prometheus_address: ${_param:stacklight_monitor_address}
-    grafana_prometheus_port: 15016
-
-    cluster_node01_address: ${_param:stacklight_monitor_node01_address}
-    cluster_node02_address: ${_param:stacklight_monitor_node02_address}
-    cluster_node03_address: ${_param:stacklight_monitor_node03_address}
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/init.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/init.yml
deleted file mode 100644
index 883bad0..0000000
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/init.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-parameters:
-  _param:
-    linux_system_codename: xenial
-    prometheus_control_address: ${_param:stacklight_monitor_address}
-    heka_elasticsearch_host: ${_param:stacklight_monitor_address}
-    elasticsearch_port: 9200
-    stacklight_environment: ${_param:cluster_domain}
-    stacklight_notification_topic: stacklight_notifications
-    grafana_admin_password: admin
-    grafana_database_type: mysql
-    grafana_database_host: ${_param:openstack_database_address}
-    grafana_database_password: ${_param:mysql_grafana_password}
-  linux:
-    network:
-      host:
-        mon:
-          address: ${_param:stacklight_monitor_address}
-          names:
-          - mon
-          - mon.${_param:cluster_domain}
-        mon01:
-          address: ${_param:stacklight_monitor_node01_address}
-          names:
-          - mon01
-          - mon01.${_param:cluster_domain}
-        mon02:
-          address: ${_param:stacklight_monitor_node02_address}
-          names:
-          - mon02
-          - mon02.${_param:cluster_domain}
-        mon03:
-          address: ${_param:stacklight_monitor_node03_address}
-          names:
-          - mon03
-          - mon03.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/proxy.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/proxy.yml
deleted file mode 100644
index 18cfdd7..0000000
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/proxy.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-classes:
-- system.nginx.server.single
-- system.nginx.server.proxy.stacklight.grafana
-- system.nginx.server.proxy.stacklight.kibana
-- system.nginx.server.proxy.monitoring.prometheus_server
-- system.nginx.server.proxy.monitoring.prometheus_alertmanager
-- system.salt.minion.cert.proxy
-- cluster.virtual-offline-pike-ovs-dpdk
-parameters:
-  _param:
-    nginx_proxy_grafana_port: 15013
-    nginx_proxy_ssl:
-      enabled: true
-      authority: ${_param:salt_minion_ca_authority}
-      engine: salt
-      mode: secure
-    salt_minion_ca_host: cfg01.${_param:cluster_domain}
diff --git a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/server.yml b/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/server.yml
deleted file mode 100644
index 369c95f..0000000
--- a/classes/cluster/virtual-offline-pike-ovs-dpdk/stacklight/server.yml
+++ /dev/null
@@ -1,75 +0,0 @@
-classes:
-- system.docker.host
-- system.linux.system.repo_local.mcp.apt_mirantis.influxdb
-- system.linux.system.repo_local.mcp.extra
-- system.linux.system.repo_local.mcp.apt_mirantis.elastic.5x
-- system.linux.system.repo_local.mcp.apt_mirantis.kibana.5x
-- system.linux.system.repo_local.mcp.apt_mirantis.docker
-- system.heka.remote_collector.container
-- system.heka.remote_collector.input.amqp
-- system.heka.remote_collector.output.elasticsearch
-- system.heka.remote_collector.output.telegraf
-- system.elasticsearch.server.cluster
-- system.elasticsearch.server.curator
-- system.kibana.server.single
-- system.haproxy.proxy.listen.stacklight.elasticsearch
-- system.haproxy.proxy.listen.stacklight.kibana
-- system.haproxy.proxy.listen.stacklight.influxdb_relay
-- service.haproxy.proxy.single
-- system.influxdb.relay.cluster
-- system.influxdb.server.single
-- system.influxdb.database.stacklight
-- system.influxdb.database.ceilometer
-- system.keepalived.cluster.instance.prometheus_server_vip
-- system.telegraf.agent.remote
-- system.prometheus.server.remote_write.docker
-- system.prometheus.server.alertmanager.dns
-- system.prometheus.server.target.dns
-- system.docker.swarm.stack.monitoring.prometheus_global
-- system.docker.swarm.stack.monitoring.remote_collector
-- system.docker.swarm.stack.dashboard
-- cluster.virtual-offline-pike-ovs-dpdk
-parameters:
-  _param:
-    heka_amqp_host: ${_param:openstack_control_address}
-    kibana_elasticsearch_host: ${_param:stacklight_monitor_address}
-    elasticsearch_version: 5
-    kibana_version: 5
-    keepalived_prometheus_vip_address: ${_param:stacklight_monitor_address}
-    keepalived_prometheus_vip_password: 'password'
-    keepalived_prometheus_vip_interface: ens4
-    cluster_vip_address: ${_param:stacklight_monitor_address}
-    cluster_local_address: ${_param:single_address}
-    cluster_elasticsearch_port: 9200
-    cluster_kibana_port: 5601
-    cluster_node01_hostname: mon01
-    cluster_node01_address: ${_param:stacklight_monitor_node01_address}
-    cluster_node02_hostname: mon02
-    cluster_node02_address: ${_param:stacklight_monitor_node02_address}
-    cluster_node03_hostname: mon03
-    cluster_node03_address: ${_param:stacklight_monitor_node03_address}
-    docker_image_alertmanager: apt:5000/alertmanager:${_param:apt_mk_version}
-    docker_image_pushgateway: apt:5000/pushgateway:${_param:apt_mk_version}
-    docker_image_prometheus: apt:5000/prometheus:${_param:apt_mk_version}
-    docker_image_remote_agent: apt:5000/telegraf:${_param:apt_mk_version}
-    docker_image_remote_storage_adapter: apt:5000/remote_storage_adapter:${_param:apt_mk_version}
-    docker_image_remote_collector: apt:5000/heka:${_param:apt_mk_version}
-    docker_image_prometheus_relay: apt:5000/prometheus_relay:${_param:apt_mk_version}
-    docker_image_grafana: apt:5000/grafana:${_param:apt_mk_version}
-    influxdb_port: 8086
-    influxdb_admin_password: password
-    influxdb_stacklight_password: lmapass
-    prometheus_influxdb_url: "http://${_param:stacklight_monitor_address}:${_param:influxdb_port}/"
-    prometheus_influxdb_db: lma
-    prometheus_influxdb_username: lma
-    prometheus_influxdb_password: ${_param:influxdb_stacklight_password}
-    remote_collector_telegraf_host: monitoring_remote_agent
-  linux:
-    network:
-      interface:
-        ens4:
-          enabled: true
-          type: eth
-          proto: static
-          address: ${_param:single_address}
-          netmask: 255.255.255.0