Merge "Auto Generated INFO.yaml file"
authorYu Yang (Gabriel) <Gabriel.yuyang@huawei.com>
Sun, 8 Jul 2018 02:00:46 +0000 (02:00 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Sun, 8 Jul 2018 02:00:46 +0000 (02:00 +0000)
76 files changed:
config/config.yaml
docker/Dockerfile
docs/release/release-notes/release_notes.rst
docs/release/release-notes/requirements_notes.rst
docs/testing/user/userguide/overview.rst
docs/testing/user/userguide/posca/posca_factor_multistack_storage.rst [new file with mode: 0644]
docs/testing/user/userguide/posca/posca_factor_multistack_storage_parallel.rst [new file with mode: 0644]
docs/testing/user/userguide/posca/posca_factor_soak_throughputs.rst [new file with mode: 0644]
docs/testing/user/userguide/posca/posca_factor_storperf.rst [new file with mode: 0644]
docs/testing/user/userguide/posca/posca_feature_moon_resources.rst [new file with mode: 0644]
docs/testing/user/userguide/posca/posca_feature_moon_tenants.rst [new file with mode: 0644]
docs/testing/user/userguide/posca/posca_feature_vnf_scale_out.rst [new file with mode: 0644]
docs/testing/user/userguide/posca_guide.rst
docs/testing/user/userguide/test_cases.rst
monitor/automate_cadvisor_client.py [deleted file]
monitor/automate_collectd_client.py [deleted file]
monitor/config/barometer_client.conf [new file with mode: 0644]
monitor/config/barometer_server.conf [new file with mode: 0644]
monitor/config/collectd_client.conf [moved from monitor/config/collectd-client.conf with 100% similarity]
monitor/config/collectd_server.conf [moved from monitor/config/collectd.conf with 100% similarity]
monitor/config/grafana.ini [moved from monitor/grafana/config/grafana.ini with 100% similarity]
monitor/config/openstack_exporter.conf [new file with mode: 0644]
monitor/config/prometheus.yaml
monitor/dashboard/__init__.py [moved from monitor/config/__init__.py with 86% similarity]
monitor/dashboard/automated_dashboard_datasource.py [moved from monitor/automated-dashboard-datasource.py with 83% similarity]
monitor/dashboard/custom_dashboard.py [new file with mode: 0644]
monitor/dashboard/custom_query_dashboard.json [new file with mode: 0644]
monitor/dashboard/jump_server_status.json [moved from monitor/grafana/dashboards/prometheus-system_rev1.json with 88% similarity]
monitor/dashboard/openstack_stats.json [new file with mode: 0644]
monitor/dashboard/stats_overview.json [new file with mode: 0644]
monitor/dispatch/__init__.py [new file with mode: 0644]
monitor/dispatch/client_ip_configure.py [new file with mode: 0644]
monitor/dispatch/install_barometer_client.sh [new file with mode: 0644]
monitor/dispatch/install_cadvisor_client.sh [moved from monitor/cadvisor_install.sh with 71% similarity]
monitor/dispatch/install_clients.py [new file with mode: 0644]
monitor/dispatch/install_collectd_client.sh [new file with mode: 0644]
monitor/dispatch/server_ip_configure.py [new file with mode: 0644]
monitor/install-collectd-client.sh [deleted file]
monitor/monitoring.sh
monitor/uninstall.py [new file with mode: 0644]
requirements/requirements.txt
run_tests.sh
testsuites/posca/testcase_cfg/posca_factor_multistack_storage.yaml [new file with mode: 0644]
testsuites/posca/testcase_cfg/posca_factor_multistack_storage_parallel.yaml [new file with mode: 0644]
testsuites/posca/testcase_cfg/posca_factor_ping.yaml
testsuites/posca/testcase_cfg/posca_factor_soak_throughputs.yaml [new file with mode: 0644]
testsuites/posca/testcase_cfg/posca_feature_moon_resources.yaml
testsuites/posca/testcase_cfg/posca_feature_moon_tenants.yaml
testsuites/posca/testcase_dashboard/posca_feature_moon.py [new file with mode: 0644]
testsuites/posca/testcase_dashboard/posca_feature_moon_dashboard.json [new file with mode: 0644]
testsuites/posca/testcase_dashboard/posca_feature_moon_index_pattern.json [new file with mode: 0644]
testsuites/posca/testcase_dashboard/posca_feature_moon_resources_histogram.json [new file with mode: 0644]
testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_discover.json [new file with mode: 0644]
testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_histogram.json [new file with mode: 0644]
testsuites/posca/testcase_dashboard/posca_moon_resources.py [new file with mode: 0644]
testsuites/posca/testcase_dashboard/posca_moon_tenants.py [new file with mode: 0644]
testsuites/posca/testcase_script/posca_factor_multistack_storage.py [new file with mode: 0644]
testsuites/posca/testcase_script/posca_factor_multistack_storage_parallel.py [new file with mode: 0644]
testsuites/posca/testcase_script/posca_factor_ping.py
testsuites/posca/testcase_script/posca_factor_soak_throughputs.py [new file with mode: 0644]
testsuites/posca/testcase_script/posca_factor_system_bandwidth.py
testsuites/posca/testcase_script/posca_feature_moon_resources.py
testsuites/posca/testcase_script/posca_feature_moon_tenants.py
testsuites/posca/testcase_script/posca_feature_testpmd_scale_up.py
testsuites/posca/testcase_script/posca_feature_vnf_scale_out.py
testsuites/run_testsuite.py
utils/env_prepare/config_prepare.sh
utils/env_prepare/moon_prepare.bash [new file with mode: 0644]
utils/env_prepare/moon_prepare.py [new file with mode: 0644]
utils/env_prepare/quota_prepare.py
utils/env_prepare/stack_prepare.py
utils/infra_setup/heat/manager.py
utils/infra_setup/runner/docker_env.py
utils/infra_setup/runner/yardstick.py
utils/parser.py
verify.sh

index 76e42b3..e01c01f 100644 (file)
@@ -13,4 +13,7 @@ common_config:
   pod_info: '/tmp/pod.yaml'
   yardstick_rc_dir: '/etc/yardstick/openstack.creds'
   releng_dir: '/home/opnfv/releng'
-  fetch_os_file: 'utils/fetch_os_creds.sh'
\ No newline at end of file
+  fetch_os_file: 'utils/fetch_os_creds.sh'
+  yardstick_image_dir: '/tmp/yardstick.img'
+  image_url: 'http://artifacts.opnfv.org/yardstick/images/yardstick-nsb-image.img'
+  yardstick_image_name: 'bottlenecks_yardstick'
index 69e1d65..c91a60f 100644 (file)
@@ -7,8 +7,8 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-FROM ubuntu:14.04
-MAINTAINER MatthewLi <matthew.lijun@huawei.com>
+FROM ubuntu:16.04
+MAINTAINER Yang (Gabriel) Yu <gabriel.yuyang@huawei.com>
 
 LABEL image=opnfv/bottlenecks
 
@@ -21,7 +21,6 @@ ARG BRANCH=master
 # Bottlenecks repo
 ENV BOTTLENECKS_REPO_DIR ${REPOS_DIR}/bottlenecks
 ENV RELENG_REPO_DIR ${REPOS_DIR}/releng
-ENV creds ${BOTTLENECKS_REPO_DIR}/config/openstack.creds
 
 #new test suite required packages can be added here
 RUN apt-get update && apt-get install -y \
@@ -32,23 +31,23 @@ RUN apt-get update && apt-get install -y \
     curl \
     wget \
     git \
-    sshpass \
     python \
-    python-dev \
     python-pip \
     vim \
+    iputils-ping \
+    sshpass \
+    sudo \
     python-setuptools && \
-    easy_install -U setuptools==30.0.0
-
-RUN apt-get -y autoremove && \
+    apt-get -y autoremove && \
     apt-get clean
 
+RUN easy_install -U setuptools==30.0.0
+
 RUN mkdir -p ${REPOS_DIR}
 
 RUN git config --global http.sslVerify false
 RUN git clone -b $BRANCH https://gerrit.opnfv.org/gerrit/bottlenecks ${BOTTLENECKS_REPO_DIR}
 RUN git clone https://gerrit.opnfv.org/gerrit/releng ${RELENG_REPO_DIR}
 
-RUN easy_install pytz
-RUN pip install -r ${REPOS_DIR}/bottlenecks/requirements/requirements.txt
-RUN pip install -U /home/opnfv/bottlenecks
+RUN pip install -r ${BOTTLENECKS_REPO_DIR}/requirements/requirements.txt
+RUN pip install -U ${BOTTLENECKS_REPO_DIR}
index b52830e..49e2b7d 100644 (file)
@@ -3,10 +3,9 @@
 .. (c) Huawei Technologies Co.,Ltd and others.
 
 
-==================================================
-Bottlenecks Release Notes for OPNFV Danube Release
-==================================================
-
+===============================
+OPNFV Bottlenecks Release Notes
+===============================
 .. _Bottlenecks: https://wiki.opnfv.org/display/bottlenecks
 
 
@@ -59,6 +58,9 @@ Version History
 | Nov 15th, 2017 |  1.6.1             | Bottlenecks Euphrates release 5.1 |
 |                |                    |                                   |
 +----------------+--------------------+-----------------------------------+
+| Apr 10th, 2018 |  1.7               | Bottlenecks Fraser release 6.0    |
+|                |                    |                                   |
++----------------+--------------------+-----------------------------------+
 
 Summary
 =======
@@ -81,6 +83,33 @@ Bottlenecks_ team.
 Release Data
 ============
 
+Fraser Release Data
+-----------------------
+
++--------------------------------------+--------------------------------+
+| **Project**                          | Bottlenecks                    |
+|                                      |                                |
++--------------------------------------+--------------------------------+
+| **Repo/tag**                         | * Bottlenecks/6.0.0            |
+|                                      |                                |
+|                                      |                                |
++--------------------------------------+--------------------------------+
+| **Bottlenecks Docker image tag**     | * 6.0.0                        |
+|                                      |                                |
+|                                      |                                |
++--------------------------------------+--------------------------------+
+| **Release designation**              | * 6.0.0                        |
+|                                      |                                |
+|                                      |                                |
++--------------------------------------+--------------------------------+
+| **Release date**                     | * Apr 10th 2018                |
+|                                      |                                |
+|                                      |                                |
++--------------------------------------+--------------------------------+
+| **Purpose of the delivery**          | Fraser stable release          |
+|                                      |                                |
++--------------------------------------+--------------------------------+
+
 Euphrates Release Data
 -----------------------
 
@@ -206,8 +235,8 @@ Bramaputra Release Data
 +--------------------------------------+--------------------------------+
 
 
-Danube Deliverables
-===================
+Release Deliverables
+====================
 
 Software Deliverables
 ---------------------
@@ -220,6 +249,12 @@ Software Deliverables
 Documentatiion Deliverables
 ---------------------------
 
+**Bottlenecks documentation <fraser>**
+
+* Release Notes: http://docs.opnfv.org/en/stable-fraser/submodules/bottlenecks/docs/release/release-notes/release_notes.html
+* User Guide: http://docs.opnfv.org/en/stable-fraser/submodules/bottlenecks/docs/testing/user/userguide/index.html
+* Developer Guide: http://docs.opnfv.org/en/stable-fraser/submodules/bottlenecks/docs/testing/developer/devguide/index.html
+
 **Bottlenecks documentation <euphrates>**
 
 * Release Notes: http://docs.opnfv.org/en/stable-euphrates/submodules/bottlenecks/docs/release/release-notes/release_notes.html
@@ -240,6 +275,16 @@ Documentatiion Deliverables
 * http://artifacts.opnfv.org/bottlenecks/colorado/1.0/releasenotes/index.html
 * User Guide: http://artifacts.opnfv.org/bottlenecks/colorado/1.0/docs/userguide/index.html
 
+Reason for Fraser
+=================
+
+* Introduction of data-plane soak tests aiming at benchmarking long duration stability of OPNFV platform
+* Introduction of security tests by cooperating with Moon project to validate the software security based authentication schemes
+* Introduction of multi-stack storage tests and Storperf storage test
+* Testing framework provides local supports for preparing images for openstack resulting in offline running supports for Bottlenecks
+
+These tests cases and refactoring further enhance the capability of Bottlenecks project and let it be adaptable to different usages.
+
 Reason for Euphrates
 ====================
 
index eb5cd74..7476f75 100644 (file)
@@ -11,9 +11,10 @@ Bottlenecks Requirements Notes for OPNFV Euphrates Release
 Installer Requirements
 ======================
 
-Bottlenecks Euphrates release is installer-agnostic which means that
+Bottlenecks releases after  Euphrates are installer-agnostic which means that
 the test cases could be executed over different deployments.
-However, the pod description file and openstack rc file
+However, the pod description file,
+openstack rc file and the admin credentials
 are required to automatically get the SUT informations.
 
 =====================
@@ -30,7 +31,7 @@ Software Requirements
 Operation System
 ----------------
 
-Ubuntu 14.04 is the default system. However, we do not do any linux core operation or call any system related api directly. The software could be runned in higher versions of Ubuntu with high probability. Thorough tests are not performed.
+Ubuntu 14.04 is the default system. However, we do not do any linux core operation or call any system related api directly. The software could be runned in higher versions of Ubuntu with high probability. 
 
 Cloud OS
 --------
index 746f24c..725a4b9 100644 (file)
@@ -55,20 +55,32 @@ Integration Description
 +-------------+----------------------+----------------------+
 | Euphrates   |    Any               | POSCA                |
 +-------------+----------------------+----------------------+
+| Fraser      |    Any               | POSCA                |
++-------------+----------------------+----------------------+
 
 Test suite & Test case Description
 ==================================
-+--------+-------------------------------------+
-|POSCA   | posca_factor_ping                   |
-|        +-------------------------------------+
-|        | posca_factor_system_bandwidth       |
-|        +-------------------------------------+
-|        | posca_facotor_soak_througputs       |
-|        +-------------------------------------+
-|        | posca_feature_vnf_scale_up          |
-|        +-------------------------------------+
-|        | posca_feature_vnf_scale_out         |
-+--------+-------------------------------------+
++--------+----+-------------------------------------------+
+|POSCA   | 1  | posca_factor_ping                         |
+|        +----+-------------------------------------------+
+|        | 2  | posca_factor_system_bandwidth             |
+|        +----+-------------------------------------------+
+|        | 3  | posca_facotor_soak_througputs             |
+|        +----+-------------------------------------------+
+|        | 4  | posca_feature_vnf_scale_up                |
+|        +----+-------------------------------------------+
+|        | 5  | posca_feature_vnf_scale_out               |
+|        +----+-------------------------------------------+
+|        | 6  | posca_factor_storperf                     |
+|        +----+-------------------------------------------+
+|        | 7  | posca_factor_multistack_storage_parallel  |
+|        +----+-------------------------------------------+
+|        | 8  | posca_factor_multistack_storage           |
+|        +----+-------------------------------------------+
+|        | 9  | posca_feature_moon_resources              |
+|        +----+-------------------------------------------+
+|        | 10 | posca_feature_moon_tenants                |
++--------+----+-------------------------------------------+
 
 As for the abandoned test suite in the previous Bottlenecks releases, please
 refer to http://docs.opnfv.org/en/stable-danube/submodules/bottlenecks/docs/testing/user/userguide/deprecated.html.
diff --git a/docs/testing/user/userguide/posca/posca_factor_multistack_storage.rst b/docs/testing/user/userguide/posca/posca_factor_multistack_storage.rst
new file mode 100644 (file)
index 0000000..70f555d
--- /dev/null
@@ -0,0 +1,59 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Tech and others.
+
+***************************************************
+POSCA Stress (Factor) Test of Multistack Storage
+***************************************************
+
+Test Case
+========
+
++--------------------------------------------------------------------------------------+
+|Bottlenecks POSCA Stress Test MultiStack Storage                                      |
+|                                                                                      |
++--------------+-----------------------------------------------------------------------+
+|test case name| posca_factor_multistack_storage                                       |
+|              |                                                                       |
++--------------+-----------------------------------------------------------------------+
+|description   | Stress test regarding multistack storage using                        |
+|              | yardstick as a runner                                                 |
++--------------+-----------------------------------------------------------------------+
+|configuration | config file:                                                          |
+|              |   /testsuite/posca/testcase_cfg/posca_factor_multistack_storage.yaml  |
+|              |                                                                       |
+|              | stack number: 5, 10, 20, 50 ...                                       |
+|              |                                                                       |
++--------------+-----------------------------------------------------------------------+
+|test result   | Read / Write IOPS, Throughput, latency                                |
+|              |                                                                       |
++--------------+-----------------------------------------------------------------------+
+
+Configuration
+============
+::
+
+    load_manager:
+      scenarios:
+        tool: fio
+        test_times: 10
+        rw: write, read, rw, rr, randomrw
+        bs: 4k
+        size: 50g
+        rwmixwrite: 50
+        num_stack: 1, 3
+        volume_num: 1
+        numjobs: 1
+        direct: 1
+
+      contexts:
+        stack_create: yardstick
+        flavor:
+        yardstick_test_ip:
+        yardstick_test_dir: "samples"
+        yardstick_testcase: "storage_bottlenecks"
+
+    dashboard:
+      dashboard: "y"
+      dashboard_ip:
diff --git a/docs/testing/user/userguide/posca/posca_factor_multistack_storage_parallel.rst b/docs/testing/user/userguide/posca/posca_factor_multistack_storage_parallel.rst
new file mode 100644 (file)
index 0000000..f8343bd
--- /dev/null
@@ -0,0 +1,58 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Tech and others.
+
+***************************************************
+POSCA Stress (Factor) Test of Multistack Storage
+***************************************************
+
+Test Case
+========
+
++------------------------------------------------------------------------------------------------+
+|Bottlenecks POSCA Stress Test Storage (Multistack with Yardstick)                               |
+|                                                                                                |
++--------------+---------------------------------------------------------------------------------+
+|test case name| posca_factor_multistack_storage_parallel                                        |
+|              |                                                                                 |
++--------------+---------------------------------------------------------------------------------+
+|description   | Stress test regarding storage while using yardstick                             |
+|              | for multistack as a runner                                                      |
++--------------+---------------------------------------------------------------------------------+
+|configuration | config file:                                                                    |
+|              |   /testsuite/posca/testcase_cfg/posca_factor_multistack_storage_parallel.yaml   |
+|              |                                                                                 |
+|              |                                                                                 |
++--------------+---------------------------------------------------------------------------------+
+|test result   | Read / Write IOPS, Throughput, latency                                          |
+|              |                                                                                 |
++--------------+---------------------------------------------------------------------------------+
+
+Configuration
+============
+::
+
+    load_manager:
+      scenarios:
+        tool: fio
+        test_times: 10
+        rw: write, read, rw, rr, randomrw
+        bs: 4k
+        size: 50g
+        rwmixwrite: 50
+        num_stack: 1, 3
+        volume_num: 1
+        numjobs: 1
+        direct: 1
+
+      contexts:
+        stack_create: yardstick
+        flavor:
+        yardstick_test_ip:
+        yardstick_test_dir: "samples"
+        yardstick_testcase: "storage_bottlenecks"
+
+    dashboard:
+      dashboard: "y"
+      dashboard_ip:
diff --git a/docs/testing/user/userguide/posca/posca_factor_soak_throughputs.rst b/docs/testing/user/userguide/posca/posca_factor_soak_throughputs.rst
new file mode 100644 (file)
index 0000000..9e427b1
--- /dev/null
@@ -0,0 +1,51 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Tech and others.
+
+*************************************
+POSCA Factor Test of Soak Throughputs
+*************************************
+
+Test Case
+========
+
++-----------------------------------------------------------------------------+
+|Bottlenecks POSCA Soak Test Throughputs                                      |
+|                                                                             |
++--------------+--------------------------------------------------------------+
+|test case name| posca_factor_soak_throughputs                                |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|description   | Long duration stability tests of data-plane traffic          |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|configuration | config file:                                                 |
+|              |   /testsuite/posca/testcase_cfg/...                          |
+|              |      posca_factor_soak_throughputs.yaml                      |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test result   | THROUGHPUT,THROUGHPUT_UNITS,MEAN_LATENCY,LOCAL_CPU_UTIL,     |
+|              | REMOTE_CPU_UTIL,LOCAL_BYTES_SENT,REMOTE_BYTES_RECVD          |
++--------------+--------------------------------------------------------------+
+
+Configuration
+============
+::
+
+  load_manager:
+    scenarios:
+      tool: netperf
+      test_duration_hours: 1
+      vim_pair_ttl: 300
+      vim_pair_lazy_cre_delay: 2
+      package_size:
+      threshhold:
+          package_loss: 0%
+          latency: 300
+
+    runners:
+      stack_create: yardstick
+      flavor:
+      yardstick_test_dir: "samples"
+      yardstick_testcase: "netperf_soak"
diff --git a/docs/testing/user/userguide/posca/posca_factor_storperf.rst b/docs/testing/user/userguide/posca/posca_factor_storperf.rst
new file mode 100644 (file)
index 0000000..2dc9ecd
--- /dev/null
@@ -0,0 +1,37 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Tech and others.
+
+***************************************************
+POSCA Stress Test of Storage Usage
+***************************************************
+
+Test Case
+========
+
++-----------------------------------------------------------------------------+
+|Bottlenecks POSCA Stress Test Storage                                        |
+|                                                                             |
++--------------+--------------------------------------------------------------+
+|test case name| posca_factor_storperf                                        |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|description   | Stress test regarding storage using Storperf                 |
++--------------+--------------------------------------------------------------+
+|configuration | config file:                                                 |
+|              |   /testsuite/posca/testcase_cfg/posca_posca_storperf.yaml    |
+|              |                                                              |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test result   | Read / Write IOPS, Throughput, latency                       |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+
+Configuration
+============
+::
+
+    load_manager:
+      scenarios:
+        tool: storperf
diff --git a/docs/testing/user/userguide/posca/posca_feature_moon_resources.rst b/docs/testing/user/userguide/posca/posca_feature_moon_resources.rst
new file mode 100644 (file)
index 0000000..5f89bca
--- /dev/null
@@ -0,0 +1,52 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Tech and others.
+
+************************************************************
+POSCA feature Test of Moon Security for resources per tenant
+************************************************************
+
+Test Case
+=========
+
++-----------------------------------------------------------------------------+
+|Bottlenecks POSCA Soak Test Throughputs                                      |
+|                                                                             |
++--------------+--------------------------------------------------------------+
+|test case name| posca_feature_moon_resources                                 |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|description   | Moon authentication capability test for maximum number of    |
+|              | authentication operations per tenant                         |
++--------------+--------------------------------------------------------------+
+|configuration | config file:                                                 |
+|              |   /testsuite/posca/testcase_cfg/...                          |
+|              |      posca_feature_moon_resources.yaml                       |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test result   | number of tenants, max number of users                       |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+
+Configuration
+============
+::
+
+  load_manager:
+    scenarios:
+      tool: https request
+      # info that the cpus and memes have the same number of data.
+      pdp_name: pdp
+      policy_name: "MLS Policy example"
+      model_name: MLS
+      tenants: 1,5,10,20
+      subject_number: 10
+      object_number: 10
+      timeout: 0.2
+
+    runners:
+      stack_create: yardstick
+      Debug: False
+      yardstick_test_dir: "samples"
+      yardstick_testcase: "moon_resource"
diff --git a/docs/testing/user/userguide/posca/posca_feature_moon_tenants.rst b/docs/testing/user/userguide/posca/posca_feature_moon_tenants.rst
new file mode 100644 (file)
index 0000000..1ac93f8
--- /dev/null
@@ -0,0 +1,55 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Tech and others.
+
+***********************************************
+POSCA feature Test of Moon Security for Tenants
+***********************************************
+
+Test Case
+=========
+
++-----------------------------------------------------------------------------+
+|Bottlenecks POSCA Soak Test Throughputs                                      |
+|                                                                             |
++--------------+--------------------------------------------------------------+
+|test case name| posca_feature_moon_tenants                                   |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|description   | Moon authentication capability test for maximum tenants      |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|configuration | config file:                                                 |
+|              |   /testsuite/posca/testcase_cfg/...                          |
+|              |      posca_feature_moon_tenants.yaml                         |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test result   | Max number of tenants                                        |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+
+Configuration
+============
+::
+
+  load_manager:
+    scenarios:
+      tool: https request
+      # info that the cpus and memes have the same number of data.
+      pdp_name: pdp
+      policy_name: "MLS Policy example"
+      model_name: MLS
+      subject_number: 20
+      object_number: 20
+      timeout: 0.003
+      initial_tenants: 0
+      steps_tenants: 1
+      tolerate_time: 20
+      SLA: 5
+
+    runners:
+      stack_create: yardstick
+      Debug: False
+      yardstick_test_dir: "samples"
+      yardstick_testcase: "moon_tenant"
diff --git a/docs/testing/user/userguide/posca/posca_feature_vnf_scale_out.rst b/docs/testing/user/userguide/posca/posca_feature_vnf_scale_out.rst
new file mode 100644 (file)
index 0000000..baf3057
--- /dev/null
@@ -0,0 +1,46 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Huawei Tech and others.
+
+***********************************
+POSCA feature Test of VNF Scale Out
+***********************************
+
+Test Case
+=========
+
++-----------------------------------------------------------------------------+
+|Bottlenecks POSCA Soak Test Throughputs                                      |
+|                                                                             |
++--------------+--------------------------------------------------------------+
+|test case name| posca_feature_nfv_scale_out                                  |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|description   | SampleVNF Scale Out Test                                     |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|configuration | config file:                                                 |
+|              |   /testsuite/posca/testcase_cfg/...                          |
+|              |      posca_feature_nfv_scale_out.yaml                        |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+|test result   | throughputs, latency, loss rate                              |
+|              |                                                              |
++--------------+--------------------------------------------------------------+
+
+Configuration
+============
+::
+
+  load_manager:
+    scenarios:
+      number_vnfs: 1, 2, 4
+      iterations: 10
+      interval: 35
+
+    runners:
+      stack_create: yardstick
+      flavor:
+      yardstick_test_dir: "samples/vnf_samples/nsut/acl"
+      yardstick_testcase: "tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_traffic_scale_out"
index ec623d0..934415f 100644 (file)
@@ -100,7 +100,7 @@ Edit admin_rc.sh and add the following line
     export OS_CACERT=/tmp/os_cacert
 
 If you have deployed your openstack environment by compass,
-you could use the following command to get the required files. For Fuel, Apex and JOID installer, we only provide limited support now
+you could use the following command to get the required files. As to Fuel, Apex and JOID installers, we only provide limited support now
 for retrieving the configuration/description files. If you find that the following command can not do the magic, you should put the
 required files in /tmp manually.
 
@@ -108,7 +108,7 @@ required files in /tmp manually.
 
     bash ./utils/env_prepare/config_prepare.sh -i <installer> [--debug]
 
-Note that if we execute the command above, then admin_rc.sh and pod.yml gets created automatically in /tmp folder along with the line `export OS_CACERT=/tmp/os_cacert` added in admin_rc.sh file.
+Note that if we execute the command above, then admin_rc.sh and pod.yml will be created automatically in /tmp folder along with the line `export OS_CACERT=/tmp/os_cacert` added in admin_rc.sh file.
 
 
 Executing Specified Testcase
index 57e338e..b6b1d17 100644 (file)
@@ -11,3 +11,10 @@ Bottlenecks - Test Cases
 
   ./posca/posca_factor_system_bandwidth.rst
   ./posca/posca_factor_ping.rst
+  ./posca/posca_factor_storperf.rst
+  ./posca/posca_factor_multistack_storage.rst
+  ./posca/posca_factor_multistack_storage_parallel.rst
+  ./posca/posca_factor_soak_throughputs.rst
+  ./posca/posca_feature_moon_resources.rst
+  ./posca/posca_feature_moon_tenants.rst
+  ./posca/posca_feature_vnf_scale_out.rst
diff --git a/monitor/automate_cadvisor_client.py b/monitor/automate_cadvisor_client.py
deleted file mode 100644 (file)
index 95b98e9..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-##############################################################################
-# Copyright (c) 2017 Huawei Tech and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import logging
-import sys
-import yaml
-sys.path.insert(0, '/home/opnfv/bottlenecks/utils/infra_setup/passwordless_SSH/')
-import ssh
-
-logger = logging.getLogger(__name__)
-with open('/tmp/pod.yaml') as f:
-    dataMap = yaml.safe_load(f)
-    for x in dataMap:
-        for y in dataMap[x]:
-            if (y['role']=='Controller') or (y['role']=='Compute'):
-                ip = str(y['ip'])
-                user = str(y['user'])
-                pwd = str(y['password'])
-                ssh_d = ssh.SSH(user, host= ip, password= pwd)
-                status, stdout, stderr = ssh_d.execute("cd /etc && mkdir cadvisor-config")
-                if status:
-                    raise Exception("Command failed with non-zero status.")
-                    logger.info(stdout.splitlines())
-                with open("/home/opnfv/bottlenecks/monitor/cadvisor_install.sh") as stdin_file:
-                    ssh_d.run("cat > /etc/cadvisor-config/install.sh", stdin=stdin_file)
-                status, stdout, stderr = ssh_d.execute("sudo apt-get install docker.io")
-                if status:
-                    raise Exception("Command for installing docker failed.")
-                    logger.info(stdout.splitlines())
-                ssh_d.run("cd /etc/cadvisor-config/ && bash ./install.sh")
-
diff --git a/monitor/automate_collectd_client.py b/monitor/automate_collectd_client.py
deleted file mode 100644 (file)
index 6dd7067..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-##############################################################################
-# Copyright (c) 2017 Huawei Tech and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import logging
-import sys
-import yaml
-sys.path.insert(0, '/home/opnfv/bottlenecks/utils/infra_setup/passwordless_SSH/')
-import ssh
-
-logger = logging.getLogger(__name__)
-with open('/tmp/pod.yaml') as f:
-    dataMap = yaml.safe_load(f)
-    for x in dataMap:
-        for y in dataMap[x]:
-            if (y['role']=='Controller') or (y['role']=='Compute'):
-                ip = str(y['ip'])
-                user = str(y['user'])
-                pwd = str(y['password'])
-                ssh_d = ssh.SSH(user, host= ip, password= pwd)
-                status, stdout, stderr = ssh_d.execute("cd /etc && mkdir collectd-config")
-                if status:
-                    raise Exception("Command failed with non-zero status.")
-                    logger.info(stdout.splitlines())
-                with open("/home/opnfv/bottlenecks/monitor/install-collectd-client.sh") as stdin_file:
-                    ssh_d.run("cat > /etc/collectd-config/install.sh", stdin=stdin_file)
-                with open("/home/opnfv/bottlenecks/monitor/config/collectd-client.conf") as stdin_file:
-                    ssh_d.run("cat > /etc/collectd-config/collectd.conf", stdin=stdin_file)
-                status, stdout, stderr = ssh_d.execute("sudo apt-get install docker.io")
-                if status:
-                    raise Exception("Command for installing docker failed.")
-                    logger.info(stdout.splitlines())
-                ssh_d.run("cd /etc/collectd-config/ && bash ./install.sh")
diff --git a/monitor/config/barometer_client.conf b/monitor/config/barometer_client.conf
new file mode 100644 (file)
index 0000000..a7481f1
--- /dev/null
@@ -0,0 +1,174 @@
+#
+# Config file for collectd(1).
+# Please read collectd.conf(5) for a list of options.
+# http://collectd.org/
+#
+
+##############################################################################
+# Global                                                                     #
+#----------------------------------------------------------------------------#
+# Global settings for the daemon.                                            #
+##############################################################################
+
+#Hostname    "localhost"
+#FQDNLookup   true
+#BaseDir     "${prefix}/var/lib/collectd"
+#PIDFile     "${prefix}/var/run/collectd.pid"
+#PluginDir   "${exec_prefix}/lib/collectd"
+#TypesDB     "/opt/collectd/share/collectd/types.db"
+
+#----------------------------------------------------------------------------#
+# When enabled, plugins are loaded automatically with the default options    #
+# when an appropriate <Plugin ...> block is encountered.                     #
+# Disabled by default.                                                       #
+#----------------------------------------------------------------------------#
+#AutoLoadPlugin false
+
+#----------------------------------------------------------------------------#
+# When enabled, internal statistics are collected, using "collectd" as the   #
+# plugin name.                                                               #
+# Disabled by default.                                                       #
+#----------------------------------------------------------------------------#
+#CollectInternalStats false
+
+#----------------------------------------------------------------------------#
+# Interval at which to query values. This may be overwritten on a per-plugin #
+# base by using the 'Interval' option of the LoadPlugin block:               #
+#   <LoadPlugin foo>                                                         #
+#       Interval 60                                                          #
+#   </LoadPlugin>                                                            #
+#----------------------------------------------------------------------------#
+#Interval     10
+
+#MaxReadInterval 86400
+#Timeout         2
+#ReadThreads     5
+#WriteThreads    5
+
+# Limit the size of the write queue. Default is no limit. Setting up a limit is
+# recommended for servers handling a high volume of traffic.
+#WriteQueueLimitHigh 1000000
+#WriteQueueLimitLow   800000
+
+##############################################################################
+# Logging                                                                    #
+#----------------------------------------------------------------------------#
+# Plugins which provide logging functions should be loaded first, so log     #
+# messages generated when loading or configuring other plugins can be        #
+# accessed.                                                                  #
+##############################################################################
+
+LoadPlugin syslog
+#LoadPlugin logfile
+#LoadPlugin log_logstash
+
+#<Plugin logfile>
+#   LogLevel info
+#   File STDOUT
+#   Timestamp true
+#   PrintSeverity false
+#</Plugin>
+
+#<Plugin log_logstash>
+#   LogLevel info
+#   File "${prefix}/var/log/collectd.json.log"
+#</Plugin>
+
+#<Plugin syslog>
+#   LogLevel info
+#</Plugin>
+
+##############################################################################
+# LoadPlugin section                                                         #
+#----------------------------------------------------------------------------#
+# Lines beginning with a single `#' belong to plugins which have been built  #
+# but are disabled by default.                                               #
+#                                                                            #
+# Lines beginning with `##' belong to plugins which have not been built due  #
+# to missing dependencies or because they have been deactivated explicitly.  #
+##############################################################################
+
+##LoadPlugin barometer
+LoadPlugin cpu
+LoadPlugin interface
+LoadPlugin load
+LoadPlugin memory
+LoadPlugin network
+LoadPlugin ovs_events
+LoadPlugin ovs_stats
+LoadPlugin rrdtool
+LoadPlugin write_http
+
+##############################################################################
+# Plugin configuration                                                       #
+#----------------------------------------------------------------------------#
+# In this section configuration stubs for each plugin are provided. A desc-  #
+# ription of those options is available in the collectd.conf(5) manual page. #
+##############################################################################
+
+#<Plugin "barometer">
+#   Device            "/dev/i2c-0";
+#   Oversampling      512
+#   PressureOffset    0.0
+#   TemperatureOffset 0.0
+#   Normalization     2
+#   Altitude          238.0
+#   TemperatureSensor "myserver/onewire-F10FCA000800/temperature"
+#</Plugin>
+
+#<Plugin cpu>
+#  ReportByCpu true
+#  ReportByState true
+#  ValuesPercentage false
+#  ReportNumCpu false
+#  ReportGuestState false
+#  SubtractGuestState true
+#</Plugin>
+
+#<Plugin interface>
+#   Interface "eth0"
+#   IgnoreSelected false
+#   ReportInactive true
+#   UniqueName false
+#</Plugin>
+
+#<Plugin memcached>
+#   <Instance "local">
+#       #Host "memcache.example.com"
+#       Address "127.0.0.1"
+#       Port "11211"
+#   </Instance>
+#</Plugin>
+
+#<Plugin memory>
+#   ValuesAbsolute true
+#   ValuesPercentage false
+#</Plugin>
+
+<Plugin network>
+        Server "192.168.114.2" "25826"
+</Plugin>
+
+<Plugin ovs_events>
+  Port "6640"
+  Address "127.0.0.1"
+  Socket "/var/run/openvswitch/db.sock"
+  Interfaces "br0" "veth0"
+  SendNotification true
+  DispatchValues true
+</Plugin>
+
+<Plugin ovs_stats>
+  Port "6640"
+  Address "127.0.0.1"
+  Socket "/var/run/openvswitch/db.sock"
+  Bridges "br0" "br_ext"
+</Plugin>
+
+<Plugin write_http>
+  <Node "collectd_exporter">
+    URL "http://192.168.114.2:9103/collectd-post"
+    Format "JSON"
+    StoreRates false
+  </Node>
+</Plugin>
diff --git a/monitor/config/barometer_server.conf b/monitor/config/barometer_server.conf
new file mode 100644 (file)
index 0000000..0d85db3
--- /dev/null
@@ -0,0 +1,174 @@
+#
+# Config file for collectd(1).
+# Please read collectd.conf(5) for a list of options.
+# http://collectd.org/
+#
+
+##############################################################################
+# Global                                                                     #
+#----------------------------------------------------------------------------#
+# Global settings for the daemon.                                            #
+##############################################################################
+
+#Hostname    "localhost"
+#FQDNLookup   true
+#BaseDir     "${prefix}/var/lib/collectd"
+#PIDFile     "${prefix}/var/run/collectd.pid"
+#PluginDir   "${exec_prefix}/lib/collectd"
+#TypesDB     "/opt/collectd/share/collectd/types.db"
+
+#----------------------------------------------------------------------------#
+# When enabled, plugins are loaded automatically with the default options    #
+# when an appropriate <Plugin ...> block is encountered.                     #
+# Disabled by default.                                                       #
+#----------------------------------------------------------------------------#
+#AutoLoadPlugin false
+
+#----------------------------------------------------------------------------#
+# When enabled, internal statistics are collected, using "collectd" as the   #
+# plugin name.                                                               #
+# Disabled by default.                                                       #
+#----------------------------------------------------------------------------#
+#CollectInternalStats false
+
+#----------------------------------------------------------------------------#
+# Interval at which to query values. This may be overwritten on a per-plugin #
+# base by using the 'Interval' option of the LoadPlugin block:               #
+#   <LoadPlugin foo>                                                         #
+#       Interval 60                                                          #
+#   </LoadPlugin>                                                            #
+#----------------------------------------------------------------------------#
+#Interval     10
+
+#MaxReadInterval 86400
+#Timeout         2
+#ReadThreads     5
+#WriteThreads    5
+
+# Limit the size of the write queue. Default is no limit. Setting up a limit is
+# recommended for servers handling a high volume of traffic.
+#WriteQueueLimitHigh 1000000
+#WriteQueueLimitLow   800000
+
+##############################################################################
+# Logging                                                                    #
+#----------------------------------------------------------------------------#
+# Plugins which provide logging functions should be loaded first, so log     #
+# messages generated when loading or configuring other plugins can be        #
+# accessed.                                                                  #
+##############################################################################
+
+LoadPlugin syslog
+#LoadPlugin logfile
+#LoadPlugin log_logstash
+
+#<Plugin logfile>
+#   LogLevel info
+#   File STDOUT
+#   Timestamp true
+#   PrintSeverity false
+#</Plugin>
+
+#<Plugin log_logstash>
+#   LogLevel info
+#   File "${prefix}/var/log/collectd.json.log"
+#</Plugin>
+
+#<Plugin syslog>
+#   LogLevel info
+#</Plugin>
+
+##############################################################################
+# LoadPlugin section                                                         #
+#----------------------------------------------------------------------------#
+# Lines beginning with a single `#' belong to plugins which have been built  #
+# but are disabled by default.                                               #
+#                                                                            #
+# Lines beginning with `##' belong to plugins which have not been built due  #
+# to missing dependencies or because they have been deactivated explicitly.  #
+##############################################################################
+
+##LoadPlugin barometer
+LoadPlugin cpu
+LoadPlugin interface
+LoadPlugin load
+LoadPlugin memory
+LoadPlugin network
+LoadPlugin ovs_events
+LoadPlugin ovs_stats
+LoadPlugin rrdtool
+LoadPlugin write_http
+
+##############################################################################
+# Plugin configuration                                                       #
+#----------------------------------------------------------------------------#
+# In this section configuration stubs for each plugin are provided. A desc-  #
+# ription of those options is available in the collectd.conf(5) manual page. #
+##############################################################################
+
+#<Plugin "barometer">
+#   Device            "/dev/i2c-0";
+#   Oversampling      512
+#   PressureOffset    0.0
+#   TemperatureOffset 0.0
+#   Normalization     2
+#   Altitude          238.0
+#   TemperatureSensor "myserver/onewire-F10FCA000800/temperature"
+#</Plugin>
+
+#<Plugin cpu>
+#  ReportByCpu true
+#  ReportByState true
+#  ValuesPercentage false
+#  ReportNumCpu false
+#  ReportGuestState false
+#  SubtractGuestState true
+#</Plugin>
+
+#<Plugin interface>
+#   Interface "eth0"
+#   IgnoreSelected false
+#   ReportInactive true
+#   UniqueName false
+#</Plugin>
+
+#<Plugin memcached>
+#   <Instance "local">
+#       #Host "memcache.example.com"
+#       Address "127.0.0.1"
+#       Port "11211"
+#   </Instance>
+#</Plugin>
+
+#<Plugin memory>
+#   ValuesAbsolute true
+#   ValuesPercentage false
+#</Plugin>
+
+<Plugin network>
+        Listen "192.168.114.2" "25826"
+</Plugin>
+
+<Plugin ovs_events>
+  Port "6640"
+  Address "127.0.0.1"
+  Socket "/var/run/openvswitch/db.sock"
+  Interfaces "br0" "veth0"
+  SendNotification true
+  DispatchValues true
+</Plugin>
+
+<Plugin ovs_stats>
+  Port "6640"
+  Address "127.0.0.1"
+  Socket "/var/run/openvswitch/db.sock"
+  Bridges "br0" "br_ext"
+</Plugin>
+
+<Plugin write_http>
+  <Node "collectd_exporter">
+    URL "http://192.168.114.2:9103/collectd-post"
+    Format "JSON"
+    StoreRates false
+  </Node>
+</Plugin>
diff --git a/monitor/config/openstack_exporter.conf b/monitor/config/openstack_exporter.conf
new file mode 100644 (file)
index 0000000..54a9cba
--- /dev/null
@@ -0,0 +1,12 @@
+OS_AUTH_URL=https://192.16.1.222:5000/v3
+OS_PASSWORD=e5748a478dcfe05e9eaf7
+OS_PROJECT_NAME=admin
+OS_USERNAME=admin
+OS_USER_DOMAIN_NAME=Default
+OS_REGION_NAME=RegionOne
+TIMEOUT_SECONDS=20
+OS_POLLING_INTERVAL=60
+OS_RETRIES=0
+LISTEN_PORT=9104
+OS_CPU_OC_RATIO=1.5
+OS_RAM_OC_RATIO=1
index 3736d8e..4ece441 100644 (file)
@@ -25,7 +25,7 @@ scrape_configs:
     scrape_interval: 5s
 
     static_configs:
-      - targets: ['192.168.121.2:9090']
+      - targets: ['192.168.114.2:9090']
 
   - job_name: 'cadvisor'
 
@@ -33,7 +33,7 @@ scrape_configs:
     scrape_interval: 5s
 
     static_configs:
-      - targets: ['192.168.121.2:8080','10.1.0.50:8080','10.1.0.51:8080']
+      - targets: ['192.168.114.2:8080','10.1.0.50:8080','10.1.0.51:8080','10.1.0.52:8080','10.1.0.53:8080','10.1.0.54:8080']
 
   - job_name: 'collectd'
 
@@ -41,7 +41,7 @@ scrape_configs:
     scrape_interval: 5s
 
     static_configs:
-      - targets: ['192.168.121.2:9103']
+      - targets: ['192.168.114.2:9103']
 
   - job_name: 'node'
 
@@ -49,4 +49,12 @@ scrape_configs:
     scrape_interval: 5s
 
     static_configs:
-      - targets: ['192.168.121.2:9100']
+      - targets: ['192.168.114.2:9100']
+
+  - job_name: 'openstack'
+
+    # Override the global default and scrape targets from this job every 5 seconds.
+    scrape_interval: 5s
+
+    static_configs:
+      - targets: ['192.168.114.2:9104']
similarity index 86%
rename from monitor/config/__init__.py
rename to monitor/dashboard/__init__.py
index b124dfa..a90f1d1 100644 (file)
@@ -1,5 +1,5 @@
 ##############################################################################
-# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
@@ -14,6 +14,7 @@ from oslo_serialization import jsonutils
 
 
 logger = logging.getLogger(__name__)
+MONITOR_DASHBOARD = "/home/opnfv/bottlenecks/monitor/dashboard/"
 
 
 def _create_dashboard(ip, port, path):
@@ -23,7 +24,7 @@ def _create_dashboard(ip, port, path):
         data = jsonutils.load(f)
     try:
         post(url, {"dashboard": data})
-        logger.info( "Trying to post dashboard json!")
+        logger.info("Trying to post dashboard json!")
     except Exception:
         logger.info("Create dashboard failed")
         raise
@@ -63,7 +64,8 @@ def post(url, data):
 
 
 ip_address = socket.gethostbyname(socket.gethostname())
-_create_dashboard(ip_address, 3000, '/var/lib/grafana/' +
-                  'dashboards/' +
-                  'prometheus-system_rev1.json')
 _create_data_source(ip_address, 3000)
+_create_dashboard(ip_address, 3000, MONITOR_DASHBOARD + 'stats_overview.json')
+_create_dashboard(ip_address, 3000,
+                  MONITOR_DASHBOARD + 'jump_server_status.json')
+_create_dashboard(ip_address, 3000, MONITOR_DASHBOARD + 'openstack_stats.json')
diff --git a/monitor/dashboard/custom_dashboard.py b/monitor/dashboard/custom_dashboard.py
new file mode 100644 (file)
index 0000000..2a4f79c
--- /dev/null
@@ -0,0 +1,33 @@
+##############################################################################
+# Copyright (c) 2018 Huawei Tech and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import json
+
+
+def customize_query(filename, rowtitle, panelname, expr):
+    with open(filename, 'r+') as f:
+        data = json.load(f)
+        x = data['rows']  # this is an array of the rows of the dashboard
+        for y in x:
+            if y['title'] == rowtitle:
+                pan = y['panels']
+                for i in range(len(pan) - 1):
+                    z = pan[i]
+                    if z['title'] == panelname:
+                        tar = z['targets']
+                        for a in tar:
+                            a['expr'] = expr
+                            f.seek(0)       # <--- reset file position to start
+                            json.dump(data, f, indent=4)
+                            f.truncate()
+
+
+customize_query("/home/opnfv/bottlenecks/monitor/custom-query-dashboard.json",
+                "Dashboard Row", "Memory Usage per Container",
+                "Sample Prometheus Query")
diff --git a/monitor/dashboard/custom_query_dashboard.json b/monitor/dashboard/custom_query_dashboard.json
new file mode 100644 (file)
index 0000000..7f2e53a
--- /dev/null
@@ -0,0 +1,36 @@
+{
+    "rows": [
+        {
+            "repeat": null,
+            "titleSize": "h6",
+            "repeatIteration": null,
+            "title": "Dashboard Row",
+            "height": 150,
+            "repeatRowId": null,
+            "panels": [
+                {
+                    "title": "Memory Usage per Container",
+                    "aliasColors": {},
+                    "id": 31,
+                    "cacheTimeout": null,
+                    "valueName": "current",
+                    "targets": [
+                        {
+                            "hide": false,
+                            "expr": "Sample Prometheus Query",
+                            "step": 1800,
+                            "legendFormat": "",
+                            "intervalFactor": 2,
+                            "refId": "A"
+                        }
+                    ]
+                },
+                {
+                    "content": "Sample Content"
+                }
+            ],
+            "showTitle": false,
+            "collapse": true
+        }
+    ]
+}
@@ -1,58 +1,40 @@
 {
-  "__inputs": [
-    {
-      "name": "DS_PROMETHEUS",
-      "label": "Prometheus",
-      "description": "",
-      "type": "datasource",
-      "pluginId": "prometheus",
-      "pluginName": "Prometheus"
-    }
-  ],
-  "__requires": [
-    {
-      "type": "panel",
-      "id": "singlestat",
-      "name": "Singlestat",
-      "version": ""
-    },
-    {
-      "type": "panel",
-      "id": "graph",
-      "name": "Graph",
-      "version": ""
-    },
-    {
-      "type": "grafana",
-      "id": "grafana",
-      "name": "Grafana",
-      "version": "3.1.0"
-    },
-    {
-      "type": "datasource",
-      "id": "prometheus",
-      "name": "Prometheus",
-      "version": "1.0.0"
-    }
-  ],
-  "id": null,
-  "title": "Prometheus system",
-  "tags": [
-    "system",
-    "prometheus",
-    "online",
-    "home"
-  ],
-  "style": "dark",
-  "timezone": "browser",
+  "annotations": {
+    "list": [
+      {
+        "datasource": "automated-ds",
+        "enable": false,
+        "expr": "ALERTS{alias=\"$host\", alertstate=\"firing\"}",
+        "iconColor": "rgb(252, 5, 0)",
+        "name": "Alert",
+        "tagKeys": "severity",
+        "textFormat": "{{ alias }} : {{alertstate}}",
+        "titleFormat": "{{ alertname }}"
+      },
+      {
+        "datasource": "automated-ds",
+        "enable": true,
+        "expr": "ALERTS{alias=\"$host\",alertstate=\"pending\"}",
+        "iconColor": "rgb(228, 242, 9)",
+        "name": "Warning",
+        "tagKeys": "severity",
+        "textFormat": "{{ alias }} : {{ alertstate }}",
+        "titleFormat": "{{ alertname }}"
+      }
+    ]
+  },
+  "description": "Load, CPU, RAM, network, process ...",
   "editable": true,
+  "gnetId": 159,
+  "graphTooltip": 1,
   "hideControls": false,
-  "sharedCrosshair": true,
+  "id": null,
+  "links": [],
+  "refresh": false,
   "rows": [
     {
       "collapse": false,
-      "editable": true,
-      "height": "250px",
+      "height": "101",
       "panels": [
         {
           "cacheTimeout": null,
@@ -63,7 +45,7 @@
             "rgba(237, 129, 40, 0.89)",
             "rgba(50, 172, 45, 0.97)"
           ],
-          "datasource": "${DS_PROMETHEUS}",
+          "datasource": "automated-ds",
           "decimals": 1,
           "editable": true,
           "error": false,
@@ -75,7 +57,7 @@
             "thresholdLabels": false,
             "thresholdMarkers": true
           },
-          "height": "50px",
+          "height": "",
           "id": 19,
           "interval": null,
           "links": [],
             "lineColor": "rgb(31, 120, 193)",
             "show": false
           },
+          "tableColumn": "",
           "targets": [
             {
               "calculatedInterval": "10m",
               "datasourceErrors": {},
               "errors": {},
               "expr": "node_time{alias=\"$host\"} - node_boot_time{alias=\"$host\"}",
+              "format": "time_series",
               "interval": "5m",
               "intervalFactor": 1,
               "legendFormat": "",
             "rgba(237, 129, 40, 0.89)",
             "rgba(50, 172, 45, 0.97)"
           ],
-          "datasource": "${DS_PROMETHEUS}",
+          "datasource": "automated-ds",
           "editable": true,
           "error": false,
           "format": "none",
             "thresholdLabels": false,
             "thresholdMarkers": true
           },
-          "height": "55px",
+          "height": "",
           "id": 25,
           "interval": null,
-          "isNew": true,
           "links": [],
           "mappingType": 1,
           "mappingTypes": [
             "lineColor": "rgb(31, 120, 193)",
             "show": false
           },
+          "tableColumn": "",
           "targets": [
             {
               "expr": "count(node_cpu{mode=\"user\", alias=\"$host\"})",
             "rgba(237, 129, 40, 0.89)",
             "rgba(50, 172, 45, 0.97)"
           ],
-          "datasource": "${DS_PROMETHEUS}",
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
             "thresholdLabels": false,
             "thresholdMarkers": true
           },
-          "height": "55px",
+          "height": "",
           "id": 26,
           "interval": null,
-          "isNew": true,
           "links": [],
           "mappingType": 1,
           "mappingTypes": [
             "lineColor": "rgb(31, 120, 193)",
             "show": false
           },
+          "tableColumn": "",
           "targets": [
             {
               "expr": "node_memory_MemAvailable{alias=\"$host\"}",
+              "format": "time_series",
               "interval": "",
               "intervalFactor": 1,
               "legendFormat": "",
               "metric": "node_memory_MemAvailable",
               "refId": "A",
-              "step": 30
+              "step": 20
             }
           ],
           "thresholds": "",
             "rgba(237, 129, 40, 0.89)",
             "rgba(245, 54, 54, 0.9)"
           ],
-          "datasource": "${DS_PROMETHEUS}",
+          "datasource": "automated-ds",
           "decimals": 0,
           "editable": true,
           "error": false,
             "thresholdLabels": false,
             "thresholdMarkers": true
           },
-          "height": "50px",
+          "height": "",
           "id": 9,
           "interval": null,
           "links": [],
             "fillColor": "rgba(31, 118, 189, 0.18)",
             "full": true,
             "lineColor": "rgb(31, 120, 193)",
-            "show": true
+            "show": false
           },
+          "tableColumn": "",
           "targets": [
             {
               "calculatedInterval": "10m",
               "datasourceErrors": {},
               "errors": {},
               "expr": "(node_memory_MemAvailable{alias=\"$host\"} or (node_memory_MemFree{alias=\"$host\"} + node_memory_Buffers{alias=\"$host\"} + node_memory_Cached{alias=\"$host\"})) / node_memory_MemTotal{alias=\"$host\"} * 100",
-              "interval": "5m",
+              "format": "time_series",
+              "interval": "",
               "intervalFactor": 1,
               "legendFormat": "",
               "metric": "node_mem",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%20%2F%20node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20*%20100%22%2C%22range_input%22%3A%2243201s%22%2C%22end_input%22%3A%222015-9-15%2013%3A54%22%2C%22step_input%22%3A%22%22%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 300
+              "step": 20
             }
           ],
           "thresholds": "90,95",
           "valueName": "current"
         },
         {
-          "aliasColors": {},
-          "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
-          "decimals": 2,
-          "editable": true,
-          "error": false,
-          "fill": 6,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
-          "height": "260px",
-          "id": 2,
-          "legend": {
-            "alignAsTable": true,
-            "avg": true,
-            "current": false,
-            "hideEmpty": false,
-            "max": true,
-            "min": true,
-            "rightSide": true,
-            "show": true,
-            "total": false,
-            "values": true
-          },
-          "lines": true,
-          "linewidth": 2,
+          "headings": true,
+          "id": 32,
+          "limit": 10,
           "links": [],
-          "nullPointMode": "null",
-          "percentage": false,
-          "pointradius": 5,
-          "points": false,
-          "renderer": "flot",
-          "seriesOverrides": [],
+          "query": "",
+          "recent": true,
+          "search": false,
           "span": 12,
-          "stack": true,
-          "steppedLine": false,
-          "targets": [
-            {
-              "calculatedInterval": "2s",
-              "datasourceErrors": {},
-              "errors": {},
-              "expr": "sum(rate(node_cpu{alias=\"$host\"}[$interval])) by (mode) * 100 / count_scalar(node_cpu{mode=\"user\", alias=\"$host\"}) or sum(irate(node_cpu{alias=\"$host\"}[5m])) by (mode) * 100 / count_scalar(node_cpu{mode=\"user\", alias=\"$host\"})",
-              "intervalFactor": 1,
-              "legendFormat": "{{ mode }}",
-              "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22sum(rate(node_cpu%7Balias%3D%5C%22%24host%5C%22%7D%5B%24interval%5D))%20by%20(mode)%20*%20100%22%2C%22range_input%22%3A%223600s%22%2C%22end_input%22%3A%222015-10-22%2015%3A27%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "A",
-              "step": 2
-            }
-          ],
-          "timeFrom": null,
-          "timeShift": null,
-          "title": "CPU Usage",
-          "tooltip": {
-            "msResolution": false,
-            "shared": true,
-            "sort": 0,
-            "value_type": "individual"
-          },
-          "type": "graph",
-          "xaxis": {
-            "show": true
-          },
-          "yaxes": [
-            {
-              "format": "percent",
-              "label": "",
-              "logBase": 1,
-              "max": 100,
-              "min": 0,
-              "show": true
-            },
-            {
-              "format": "short",
-              "logBase": 1,
-              "max": null,
-              "min": 0,
-              "show": true
-            }
-          ]
-        },
+          "starred": true,
+          "tags": [],
+          "title": "Status Quick Access",
+          "type": "dashlist"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "System Stats",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": false,
+      "height": 299,
+      "panels": [
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 2,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgb(241, 156, 15)",
-            "threshold2": null,
-            "threshold2Color": "rgb(246, 17, 17)",
-            "thresholdLine": true
-          },
+          "grid": {},
           "id": 18,
           "legend": {
             "alignAsTable": true,
               "color": "#E5AC0E"
             }
           ],
+          "spaceLength": 10,
           "span": 12,
           "stack": false,
           "steppedLine": false,
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_load1%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%223601s%22%2C%22end_input%22%3A%222015-10-22%2015%3A27%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Afalse%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 2,
+              "step": 1,
               "target": ""
             },
             {
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_load5%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%223600s%22%2C%22end_input%22%3A%222015-10-22%2015%3A27%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Afalse%2C%22tab%22%3A0%7D%5D",
               "refId": "B",
-              "step": 2,
+              "step": 1,
               "target": ""
             },
             {
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_load15%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%223600s%22%2C%22end_input%22%3A%222015-10-22%2015%3A27%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Afalse%2C%22tab%22%3A0%7D%5D",
               "refId": "C",
-              "step": 2,
+              "step": 1,
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
           "title": "Load Average",
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
               "show": true
             }
           ]
-        }
-      ],
-      "showTitle": false,
-      "title": "System Stats"
-    },
-    {
-      "collapse": false,
-      "editable": true,
-      "height": "300px",
-      "panels": [
+        },
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 6,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
+          "grid": {},
           "height": "",
-          "id": 6,
+          "id": 2,
           "legend": {
             "alignAsTable": true,
             "avg": true,
             "hideEmpty": false,
             "max": true,
             "min": true,
-            "rightSide": false,
+            "rightSide": true,
             "show": true,
             "total": false,
             "values": true
           "pointradius": 5,
           "points": false,
           "renderer": "flot",
-          "seriesOverrides": [
-            {
-              "alias": "Used",
-              "color": "#0A437C"
-            },
-            {
-              "alias": "Available",
-              "color": "#5195CE"
-            },
-            {
-              "alias": "Total",
-              "color": "#052B51",
-              "legend": false,
-              "stack": false
-            }
-          ],
-          "span": 6,
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 12,
           "stack": true,
           "steppedLine": false,
           "targets": [
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "node_memory_MemTotal{alias=\"$host\"}",
-              "intervalFactor": 1,
-              "legendFormat": "Total",
-              "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "C",
-              "step": 5,
-              "target": ""
-            },
-            {
-              "calculatedInterval": "2s",
-              "datasourceErrors": {},
-              "errors": {},
-              "expr": "node_memory_MemTotal{alias=\"$host\"} - (node_memory_MemAvailable{alias=\"$host\"} or (node_memory_MemFree{alias=\"$host\"} + node_memory_Buffers{alias=\"$host\"} + node_memory_Cached{alias=\"$host\"}))",
+              "expr": "sum(rate(node_cpu{alias=\"$host\"}[$interval])) by (mode) * 100 / count_scalar(node_cpu{mode=\"user\", alias=\"$host\"}) or sum(irate(node_cpu{alias=\"$host\"}[5m])) by (mode) * 100 / count_scalar(node_cpu{mode=\"user\", alias=\"$host\"})",
+              "format": "time_series",
               "intervalFactor": 1,
-              "legendFormat": "Used",
+              "legendFormat": "{{ mode }}",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22sum(rate(node_cpu%7Balias%3D%5C%22%24host%5C%22%7D%5B%24interval%5D))%20by%20(mode)%20*%20100%22%2C%22range_input%22%3A%223600s%22%2C%22end_input%22%3A%222015-10-22%2015%3A27%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 5,
-              "target": ""
-            },
-            {
-              "calculatedInterval": "2s",
-              "datasourceErrors": {},
-              "errors": {},
-              "expr": "node_memory_MemAvailable{alias=\"$host\"} or (node_memory_MemFree{alias=\"$host\"} + node_memory_Buffers{alias=\"$host\"} + node_memory_Cached{alias=\"$host\"})",
-              "intervalFactor": 1,
-              "legendFormat": "Available",
-              "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "B",
-              "step": 5,
-              "target": ""
+              "step": 1
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Memory",
+          "title": "CPU Usage",
           "tooltip": {
             "msResolution": false,
             "shared": true,
             "sort": 0,
             "value_type": "individual"
           },
-          "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
-              "format": "bytes",
+              "format": "percent",
               "label": "",
               "logBase": 1,
-              "max": null,
+              "max": 100,
               "min": 0,
               "show": true
             },
             {
-              "format": "bytes",
+              "format": "short",
               "logBase": 1,
               "max": null,
               "min": 0,
         },
         {
           "aliasColors": {},
-          "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "bars": true,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
-          "fill": 6,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
-          "height": "",
-          "id": 29,
+          "fill": 2,
+          "grid": {},
+          "id": 20,
           "legend": {
             "alignAsTable": true,
             "avg": true,
             "total": false,
             "values": true
           },
-          "lines": true,
+          "lines": false,
           "linewidth": 2,
           "links": [],
           "nullPointMode": "null",
           "pointradius": 5,
           "points": false,
           "renderer": "flot",
-          "seriesOverrides": [],
-          "span": 6,
+          "seriesOverrides": [
+            {
+              "alias": "Processes blocked waiting for I/O to complete",
+              "color": "#E24D42"
+            },
+            {
+              "alias": "Processes in runnable state",
+              "color": "#6ED0E0"
+            }
+          ],
+          "spaceLength": 10,
+          "span": 5,
           "stack": true,
           "steppedLine": false,
           "targets": [
             {
-              "calculatedInterval": "2s",
+              "calculatedInterval": "2m",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "node_memory_MemTotal{alias=\"$host\"} - (node_memory_MemFree{alias=\"$host\"} + node_memory_Buffers{alias=\"$host\"} + node_memory_Cached{alias=\"$host\"})",
+              "expr": "node_procs_running{alias=\"$host\"}",
               "intervalFactor": 1,
-              "legendFormat": "Used",
+              "legendFormat": "Processes in runnable state",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_procs_running%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%2243200s%22%2C%22end_input%22%3A%222015-9-18%2013%3A46%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 5,
+              "step": 2,
               "target": ""
             },
             {
-              "calculatedInterval": "2s",
+              "calculatedInterval": "2m",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "node_memory_MemFree{alias=\"$host\"}",
+              "expr": "node_procs_blocked{alias=\"$host\"}",
               "intervalFactor": 1,
-              "legendFormat": "Free",
+              "legendFormat": "Processes blocked waiting for I/O to complete",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_procs_blocked%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%2243200s%22%2C%22end_input%22%3A%222015-9-18%2013%3A46%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "B",
-              "step": 5,
-              "target": ""
-            },
-            {
-              "calculatedInterval": "2s",
-              "datasourceErrors": {},
-              "errors": {},
-              "expr": "node_memory_Buffers{alias=\"$host\"}",
-              "intervalFactor": 1,
-              "legendFormat": "Buffers",
-              "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "D",
-              "step": 5,
-              "target": ""
-            },
-            {
-              "calculatedInterval": "2s",
-              "datasourceErrors": {},
-              "errors": {},
-              "expr": "node_memory_Cached{alias=\"$host\"}",
-              "intervalFactor": 1,
-              "legendFormat": "Cached",
-              "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "E",
-              "step": 5,
+              "step": 2,
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Memory Distribution",
+          "title": "Processes",
           "tooltip": {
             "msResolution": false,
             "shared": true,
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
-              "format": "bytes",
+              "format": "none",
               "label": "",
               "logBase": 1,
               "max": null,
               "show": true
             },
             {
-              "format": "bytes",
+              "format": "none",
               "logBase": 1,
               "max": null,
               "min": 0,
         {
           "aliasColors": {},
           "bars": true,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 2,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgb(241, 156, 15)",
-            "threshold2": null,
-            "threshold2Color": "rgb(246, 17, 17)",
-            "thresholdLine": true
-          },
+          "grid": {},
           "id": 24,
           "legend": {
             "alignAsTable": true,
               "color": "#EF843C"
             }
           ],
-          "span": 6,
+          "spaceLength": 10,
+          "span": 3,
           "stack": false,
           "steppedLine": false,
           "targets": [
               "datasourceErrors": {},
               "errors": {},
               "expr": "rate(node_forks{alias=\"$host\"}[$interval]) or irate(node_forks{alias=\"$host\"}[5m])",
+              "format": "time_series",
               "intervalFactor": 1,
               "legendFormat": "Forks",
               "metric": "",
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
           "title": "Forks",
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
         },
         {
           "aliasColors": {},
-          "bars": true,
-          "datasource": "${DS_PROMETHEUS}",
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 2,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgb(241, 156, 15)",
-            "threshold2": null,
-            "threshold2Color": "rgb(246, 17, 17)",
-            "thresholdLine": true
-          },
-          "id": 20,
+          "grid": {},
+          "id": 28,
           "legend": {
             "alignAsTable": true,
             "avg": true,
             "total": false,
             "values": true
           },
-          "lines": false,
+          "lines": true,
           "linewidth": 2,
           "links": [],
           "nullPointMode": "null",
           "renderer": "flot",
           "seriesOverrides": [
             {
-              "alias": "Processes blocked waiting for I/O to complete",
-              "color": "#E24D42"
-            },
-            {
-              "alias": "Processes in runnable state",
-              "color": "#6ED0E0"
+              "alias": "Interrupts",
+              "color": "#D683CE"
             }
           ],
-          "span": 6,
-          "stack": true,
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
           "steppedLine": false,
           "targets": [
             {
               "calculatedInterval": "2m",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "node_procs_running{alias=\"$host\"}",
+              "expr": "rate(node_intr{alias=\"$host\"}[$interval]) or irate(node_intr{alias=\"$host\"}[5m])",
               "intervalFactor": 1,
-              "legendFormat": "Processes in runnable state",
+              "legendFormat": "Interrupts",
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_procs_running%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%2243200s%22%2C%22end_input%22%3A%222015-9-18%2013%3A46%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
               "step": 5,
               "target": ""
-            },
-            {
-              "calculatedInterval": "2m",
-              "datasourceErrors": {},
-              "errors": {},
-              "expr": "node_procs_blocked{alias=\"$host\"}",
-              "intervalFactor": 1,
-              "legendFormat": "Processes blocked waiting for I/O to complete",
-              "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_procs_blocked%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%2243200s%22%2C%22end_input%22%3A%222015-9-18%2013%3A46%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "B",
-              "step": 5,
-              "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Processes",
+          "title": "Interrupts",
           "tooltip": {
-            "msResolution": false,
+            "msResolution": true,
             "shared": true,
             "sort": 0,
             "value_type": "individual"
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
               "show": true
             }
           ]
-        },
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "CPU Stats",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": false,
+      "height": 291,
+      "panels": [
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 2,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgb(241, 156, 15)",
-            "threshold2": null,
-            "threshold2Color": "rgb(246, 17, 17)",
-            "thresholdLine": true
-          },
-          "id": 27,
+          "grid": {},
+          "id": 31,
           "legend": {
             "alignAsTable": true,
             "avg": true,
           "points": false,
           "renderer": "flot",
           "seriesOverrides": [],
-          "span": 6,
+          "spaceLength": 10,
+          "span": 12,
           "stack": false,
           "steppedLine": false,
           "targets": [
             {
-              "calculatedInterval": "2m",
+              "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_context_switches{alias=\"$host\"}[$interval]) or irate(node_context_switches{alias=\"$host\"}[5m])",
+              "expr": "rate(node_vmstat_pgpgin{alias=\"$host\"}[$interval]) * 1024 or irate(node_vmstat_pgpgin{alias=\"$host\"}[5m]) * 1024",
               "intervalFactor": 1,
-              "legendFormat": "Context Switches",
+              "legendFormat": "Page In",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_procs_running%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%2243200s%22%2C%22end_input%22%3A%222015-9-18%2013%3A46%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 5,
+              "step": 1,
+              "target": ""
+            },
+            {
+              "calculatedInterval": "2s",
+              "datasourceErrors": {},
+              "errors": {},
+              "expr": "rate(node_vmstat_pgpgout{alias=\"$host\"}[$interval]) * 1024 or irate(node_vmstat_pgpgout{alias=\"$host\"}[5m]) * 1024",
+              "intervalFactor": 1,
+              "legendFormat": "Page Out",
+              "metric": "",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "B",
+              "step": 1,
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Context Switches",
+          "title": "I/O Activity",
           "tooltip": {
             "msResolution": false,
             "shared": true,
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
-              "format": "none",
+              "format": "Bps",
               "label": "",
               "logBase": 1,
               "max": null,
               "show": true
             },
             {
-              "format": "none",
+              "format": "bytes",
               "logBase": 1,
               "max": null,
               "min": 0,
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
-          "fill": 2,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgb(241, 156, 15)",
-            "threshold2": null,
-            "threshold2Color": "rgb(246, 17, 17)",
-            "thresholdLine": true
-          },
-          "id": 28,
+          "fill": 6,
+          "grid": {},
+          "height": "",
+          "id": 6,
           "legend": {
             "alignAsTable": true,
             "avg": true,
           "renderer": "flot",
           "seriesOverrides": [
             {
-              "alias": "Interrupts",
-              "color": "#D683CE"
+              "alias": "Used",
+              "color": "#0A437C"
+            },
+            {
+              "alias": "Available",
+              "color": "#5195CE"
+            },
+            {
+              "alias": "Total",
+              "color": "#052B51",
+              "legend": false,
+              "stack": false
             }
           ],
+          "spaceLength": 10,
           "span": 6,
-          "stack": false,
+          "stack": true,
           "steppedLine": false,
           "targets": [
             {
-              "calculatedInterval": "2m",
+              "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_intr{alias=\"$host\"}[$interval]) or irate(node_intr{alias=\"$host\"}[5m])",
+              "expr": "node_memory_MemTotal{alias=\"$host\"}",
               "intervalFactor": 1,
-              "legendFormat": "Interrupts",
+              "legendFormat": "Total",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_procs_running%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%2243200s%22%2C%22end_input%22%3A%222015-9-18%2013%3A46%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "C",
+              "step": 2,
+              "target": ""
+            },
+            {
+              "calculatedInterval": "2s",
+              "datasourceErrors": {},
+              "errors": {},
+              "expr": "node_memory_MemTotal{alias=\"$host\"} - (node_memory_MemAvailable{alias=\"$host\"} or (node_memory_MemFree{alias=\"$host\"} + node_memory_Buffers{alias=\"$host\"} + node_memory_Cached{alias=\"$host\"}))",
+              "intervalFactor": 1,
+              "legendFormat": "Used",
+              "metric": "",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 5,
+              "step": 2,
+              "target": ""
+            },
+            {
+              "calculatedInterval": "2s",
+              "datasourceErrors": {},
+              "errors": {},
+              "expr": "node_memory_MemAvailable{alias=\"$host\"} or (node_memory_MemFree{alias=\"$host\"} + node_memory_Buffers{alias=\"$host\"} + node_memory_Cached{alias=\"$host\"})",
+              "intervalFactor": 1,
+              "legendFormat": "Available",
+              "metric": "",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "B",
+              "step": 2,
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Interrupts",
+          "title": "Memory",
           "tooltip": {
-            "msResolution": true,
+            "msResolution": false,
             "shared": true,
             "sort": 0,
             "value_type": "individual"
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
-              "format": "none",
+              "format": "bytes",
               "label": "",
               "logBase": 1,
               "max": null,
               "show": true
             },
             {
-              "format": "none",
+              "format": "bytes",
               "logBase": 1,
               "max": null,
               "min": 0,
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 6,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
-          "id": 21,
+          "grid": {},
+          "id": 23,
           "legend": {
             "alignAsTable": true,
             "avg": true,
           "pointradius": 5,
           "points": false,
           "renderer": "flot",
-          "seriesOverrides": [],
+          "seriesOverrides": [
+            {
+              "alias": "Used",
+              "color": "#584477"
+            },
+            {
+              "alias": "Free",
+              "color": "#AEA2E0"
+            }
+          ],
+          "spaceLength": 10,
           "span": 6,
           "stack": true,
           "steppedLine": false,
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_network_receive_bytes{alias=\"$host\", device!=\"lo\"}[$interval]) or irate(node_network_receive_bytes{alias=\"$host\", device!=\"lo\"}[5m])",
+              "expr": "node_memory_SwapTotal{alias=\"$host\"} - node_memory_SwapFree{alias=\"$host\"}",
               "intervalFactor": 1,
-              "legendFormat": "Inbound: {{ device }}",
+              "legendFormat": "Used",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "B",
-              "step": 5,
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "A",
+              "step": 2,
               "target": ""
             },
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_network_transmit_bytes{alias=\"$host\", device!=\"lo\"}[$interval]) or irate(node_network_transmit_bytes{alias=\"$host\", device!=\"lo\"}[5m])",
+              "expr": "node_memory_SwapFree{alias=\"$host\"}",
               "intervalFactor": 1,
-              "legendFormat": "Outbound: {{ device }}",
+              "legendFormat": "Free",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "A",
-              "step": 5,
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "B",
+              "step": 2,
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Network Traffic",
+          "title": "Swap",
           "tooltip": {
             "msResolution": false,
             "shared": true,
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
-              "format": "Bps",
+              "format": "bytes",
               "label": "",
               "logBase": 1,
               "max": null,
         },
         {
           "aliasColors": {},
-          "bars": true,
-          "datasource": "${DS_PROMETHEUS}",
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 6,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
-          "id": 22,
+          "grid": {},
+          "height": "",
+          "id": 29,
           "legend": {
             "alignAsTable": true,
             "avg": true,
             "min": true,
             "rightSide": false,
             "show": true,
-            "sort": "min",
-            "sortDesc": true,
             "total": false,
             "values": true
           },
-          "lines": false,
+          "lines": true,
           "linewidth": 2,
           "links": [],
           "nullPointMode": "null",
           "points": false,
           "renderer": "flot",
           "seriesOverrides": [],
+          "spaceLength": 10,
           "span": 6,
           "stack": true,
           "steppedLine": false,
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "sum(increase(node_network_receive_bytes{alias=\"$host\", device!=\"lo\"}[1h]))",
-              "interval": "1h",
+              "expr": "node_memory_MemTotal{alias=\"$host\"} - (node_memory_MemFree{alias=\"$host\"} + node_memory_Buffers{alias=\"$host\"} + node_memory_Cached{alias=\"$host\"})",
               "intervalFactor": 1,
-              "legendFormat": "Received",
+              "legendFormat": "Used",
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 3600,
+              "step": 2,
               "target": ""
             },
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "sum(increase(node_network_transmit_bytes{alias=\"$host\", device!=\"lo\"}[1h]))",
-              "interval": "1h",
+              "expr": "node_memory_MemFree{alias=\"$host\"}",
               "intervalFactor": 1,
-              "legendFormat": "Sent",
+              "legendFormat": "Free",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "B",
-              "step": 3600,
+              "step": 2,
               "target": ""
-            }
-          ],
-          "timeFrom": "24h",
-          "timeShift": null,
-          "title": "Network Utilization Hourly",
-          "tooltip": {
-            "msResolution": false,
-            "shared": true,
-            "sort": 0,
-            "value_type": "individual"
-          },
-          "transparent": false,
-          "type": "graph",
+            },
+            {
+              "calculatedInterval": "2s",
+              "datasourceErrors": {},
+              "errors": {},
+              "expr": "node_memory_Buffers{alias=\"$host\"}",
+              "intervalFactor": 1,
+              "legendFormat": "Buffers",
+              "metric": "",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "D",
+              "step": 2,
+              "target": ""
+            },
+            {
+              "calculatedInterval": "2s",
+              "datasourceErrors": {},
+              "errors": {},
+              "expr": "node_memory_Cached{alias=\"$host\"}",
+              "intervalFactor": 1,
+              "legendFormat": "Cached",
+              "metric": "",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "E",
+              "step": 2,
+              "target": ""
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Memory Distribution",
+          "tooltip": {
+            "msResolution": false,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "transparent": false,
+          "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
-          "fill": 6,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
-          "id": 23,
+          "fill": 2,
+          "grid": {},
+          "id": 30,
           "legend": {
             "alignAsTable": true,
             "avg": true,
           "pointradius": 5,
           "points": false,
           "renderer": "flot",
-          "seriesOverrides": [
-            {
-              "alias": "Used",
-              "color": "#584477"
-            },
-            {
-              "alias": "Free",
-              "color": "#AEA2E0"
-            }
-          ],
+          "seriesOverrides": [],
+          "spaceLength": 10,
           "span": 6,
-          "stack": true,
+          "stack": false,
           "steppedLine": false,
           "targets": [
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "node_memory_SwapTotal{alias=\"$host\"} - node_memory_SwapFree{alias=\"$host\"}",
+              "expr": "rate(node_vmstat_pswpin{alias=\"$host\"}[$interval]) * 4096 or irate(node_vmstat_pswpin{alias=\"$host\"}[5m]) * 4096",
               "intervalFactor": 1,
-              "legendFormat": "Used",
+              "legendFormat": "Swap In",
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 5,
+              "step": 2,
               "target": ""
             },
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "node_memory_SwapFree{alias=\"$host\"}",
+              "expr": "rate(node_vmstat_pswpout{alias=\"$host\"}[$interval]) * 4096 or irate(node_vmstat_pswpout{alias=\"$host\"}[5m]) * 4096",
               "intervalFactor": 1,
-              "legendFormat": "Free",
+              "legendFormat": "Swap Out",
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "B",
-              "step": 5,
+              "step": 2,
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Swap",
+          "title": "Swap Activity",
           "tooltip": {
             "msResolution": false,
             "shared": true,
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
-              "format": "bytes",
+              "format": "Bps",
               "label": "",
               "logBase": 1,
               "max": null,
               "show": true
             }
           ]
-        },
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Storage Stats",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": false,
+      "height": 283,
+      "panels": [
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
-          "fill": 2,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
-          "id": 30,
+          "fill": 6,
+          "grid": {},
+          "id": 21,
           "legend": {
             "alignAsTable": true,
             "avg": true,
             "hideEmpty": false,
             "max": true,
             "min": true,
-            "rightSide": false,
+            "rightSide": true,
             "show": true,
             "total": false,
             "values": true
           "points": false,
           "renderer": "flot",
           "seriesOverrides": [],
-          "span": 6,
-          "stack": false,
+          "spaceLength": 10,
+          "span": 12,
+          "stack": true,
           "steppedLine": false,
           "targets": [
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_vmstat_pswpin{alias=\"$host\"}[$interval]) * 4096 or irate(node_vmstat_pswpin{alias=\"$host\"}[5m]) * 4096",
+              "expr": "rate(node_network_receive_bytes{alias=\"$host\", device!=\"lo\"}[$interval]) or irate(node_network_receive_bytes{alias=\"$host\", device!=\"lo\"}[5m])",
+              "format": "time_series",
               "intervalFactor": 1,
-              "legendFormat": "Swap In",
+              "legendFormat": "Inbound: {{ device }}",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "A",
-              "step": 5,
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "B",
+              "step": 1,
               "target": ""
             },
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_vmstat_pswpout{alias=\"$host\"}[$interval]) * 4096 or irate(node_vmstat_pswpout{alias=\"$host\"}[5m]) * 4096",
+              "expr": "rate(node_network_transmit_bytes{alias=\"$host\", device!=\"lo\"}[$interval]) or irate(node_network_transmit_bytes{alias=\"$host\", device!=\"lo\"}[5m])",
+              "format": "time_series",
               "intervalFactor": 1,
-              "legendFormat": "Swap Out",
+              "legendFormat": "Outbound: {{ device }}",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
-              "refId": "B",
-              "step": 5,
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "A",
+              "step": 1,
               "target": ""
             }
           ],
+          "thresholds": [],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Swap Activity",
+          "title": "Network Traffic",
           "tooltip": {
             "msResolution": false,
             "shared": true,
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
         {
           "aliasColors": {},
           "bars": false,
-          "datasource": "${DS_PROMETHEUS}",
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
           "decimals": 2,
           "editable": true,
           "error": false,
           "fill": 2,
-          "grid": {
-            "threshold1": null,
-            "threshold1Color": "rgba(216, 200, 27, 0.27)",
-            "threshold2": null,
-            "threshold2Color": "rgba(234, 112, 112, 0.22)",
-            "thresholdLine": false
-          },
-          "id": 31,
+          "grid": {},
+          "id": 27,
           "legend": {
             "alignAsTable": true,
             "avg": true,
           "points": false,
           "renderer": "flot",
           "seriesOverrides": [],
+          "spaceLength": 10,
           "span": 6,
           "stack": false,
           "steppedLine": false,
+          "targets": [
+            {
+              "calculatedInterval": "2m",
+              "datasourceErrors": {},
+              "errors": {},
+              "expr": "rate(node_context_switches{alias=\"$host\"}[$interval]) or irate(node_context_switches{alias=\"$host\"}[5m])",
+              "format": "time_series",
+              "intervalFactor": 1,
+              "legendFormat": "Context Switches",
+              "metric": "",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_procs_running%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%2243200s%22%2C%22end_input%22%3A%222015-9-18%2013%3A46%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "refId": "A",
+              "step": 2,
+              "target": ""
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Context Switches",
+          "tooltip": {
+            "msResolution": false,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "transparent": false,
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "none",
+              "label": "",
+              "logBase": 1,
+              "max": null,
+              "min": 0,
+              "show": true
+            },
+            {
+              "format": "none",
+              "logBase": 1,
+              "max": null,
+              "min": 0,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": true,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "decimals": 2,
+          "editable": true,
+          "error": false,
+          "fill": 6,
+          "grid": {},
+          "id": 22,
+          "legend": {
+            "alignAsTable": true,
+            "avg": true,
+            "current": false,
+            "hideEmpty": false,
+            "max": true,
+            "min": true,
+            "rightSide": false,
+            "show": true,
+            "sort": "min",
+            "sortDesc": true,
+            "total": false,
+            "values": true
+          },
+          "lines": false,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": true,
+          "steppedLine": false,
           "targets": [
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_vmstat_pgpgin{alias=\"$host\"}[$interval]) * 1024 or irate(node_vmstat_pgpgin{alias=\"$host\"}[5m]) * 1024",
+              "expr": "sum(increase(node_network_receive_bytes{alias=\"$host\", device!=\"lo\"}[1h]))",
+              "interval": "1h",
               "intervalFactor": 1,
-              "legendFormat": "Page In",
+              "legendFormat": "Received",
               "metric": "",
               "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "A",
-              "step": 5,
+              "step": 3600,
               "target": ""
             },
             {
               "calculatedInterval": "2s",
               "datasourceErrors": {},
               "errors": {},
-              "expr": "rate(node_vmstat_pgpgout{alias=\"$host\"}[$interval]) * 1024 or irate(node_vmstat_pgpgout{alias=\"$host\"}[5m]) * 1024",
+              "expr": "sum(increase(node_network_transmit_bytes{alias=\"$host\", device!=\"lo\"}[1h]))",
+              "interval": "1h",
               "intervalFactor": 1,
-              "legendFormat": "Page Out",
+              "legendFormat": "Sent",
               "metric": "",
-              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
+              "prometheusLink": "/api/datasources/proxy/1/graph#%5B%7B%22expr%22%3A%22node_memory_MemTotal%7Balias%3D%5C%22%24host%5C%22%7D%20-%20(node_memory_MemFree%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Buffers%7Balias%3D%5C%22%24host%5C%22%7D%20%2B%20node_memory_Cached%7Balias%3D%5C%22%24host%5C%22%7D)%22%2C%22range_input%22%3A%22900s%22%2C%22end_input%22%3A%222015-10-22%2015%3A25%22%2C%22step_input%22%3A%22%22%2C%22stacked%22%3Atrue%2C%22tab%22%3A0%7D%5D",
               "refId": "B",
-              "step": 5,
+              "step": 3600,
               "target": ""
             }
           ],
-          "timeFrom": null,
+          "thresholds": [],
+          "timeFrom": "24h",
           "timeShift": null,
-          "title": "I/O Activity",
+          "title": "Network Utilization Hourly",
           "tooltip": {
             "msResolution": false,
             "shared": true,
           "transparent": false,
           "type": "graph",
           "xaxis": {
-            "show": true
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
           },
           "yaxes": [
             {
-              "format": "Bps",
+              "format": "bytes",
               "label": "",
               "logBase": 1,
               "max": null,
           ]
         }
       ],
-      "title": "New row"
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Network Stats",
+      "titleSize": "h5"
     }
   ],
-  "time": {
-    "from": "now-1h",
-    "to": "now"
-  },
-  "timepicker": {
-    "collapse": false,
-    "enable": true,
-    "notice": false,
-    "now": true,
-    "refresh_intervals": [
-      "5s",
-      "10s",
-      "30s",
-      "1m",
-      "5m",
-      "15m",
-      "30m",
-      "1h",
-      "2h",
-      "1d"
-    ],
-    "status": "Stable",
-    "time_options": [
-      "5m",
-      "15m",
-      "1h",
-      "6h",
-      "12h",
-      "24h",
-      "2d",
-      "7d",
-      "30d"
-    ],
-    "type": "timepicker"
-  },
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
   "templating": {
     "list": [
       {
         "auto_count": 200,
         "auto_min": "1s",
         "current": {
-          "selected": true,
           "text": "5s",
           "value": "5s"
         },
           }
         ],
         "query": "1s,5s,1m,5m,1h,6h,1d",
-        "refresh": 0,
+        "refresh": 2,
         "type": "interval"
       },
       {
         "allFormat": "glob",
-        "current": {},
-        "datasource": "${DS_PROMETHEUS}",
+        "allValue": null,
+        "current": {
+          "isNone": true,
+          "text": "None",
+          "value": ""
+        },
+        "datasource": "automated-ds",
         "hide": 0,
         "includeAll": false,
         "label": "Host",
         "refresh": 1,
         "refresh_on_load": false,
         "regex": "",
+        "sort": 0,
         "tagValuesQuery": "alias",
+        "tags": [],
         "tagsQuery": "up",
         "type": "query",
         "useTags": false
       }
     ]
   },
-  "annotations": {
-    "list": [
-      {
-        "datasource": "${DS_PROMETHEUS}",
-        "enable": false,
-        "expr": "ALERTS{alias=\"$host\", alertstate=\"firing\"}",
-        "iconColor": "rgb(252, 5, 0)",
-        "name": "Alert",
-        "tagKeys": "severity",
-        "textFormat": "{{ alias }} : {{alertstate}}",
-        "titleFormat": "{{ alertname }}"
-      },
-      {
-        "datasource": "${DS_PROMETHEUS}",
-        "enable": true,
-        "expr": "ALERTS{alias=\"$host\",alertstate=\"pending\"}",
-        "iconColor": "rgb(228, 242, 9)",
-        "name": "Warning",
-        "tagKeys": "severity",
-        "textFormat": "{{ alias }} : {{ alertstate }}",
-        "titleFormat": "{{ alertname }}"
-      }
-    ]
+  "time": {
+    "from": "now-30m",
+    "to": "now"
   },
-  "refresh": "30s",
-  "schemaVersion": 12,
-  "version": 18,
-  "links": [],
-  "gnetId": 159,
-  "description": "Prometheus for system metrics. \r\nLoad, CPU, RAM, network, process ... "
+  "timepicker": {
+    "collapse": false,
+    "enable": true,
+    "notice": false,
+    "now": true,
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "status": "Stable",
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ],
+    "type": "timepicker"
+  },
+  "timezone": "browser",
+  "title": "Jump Server Status",
+  "version": 1
 }
\ No newline at end of file
diff --git a/monitor/dashboard/openstack_stats.json b/monitor/dashboard/openstack_stats.json
new file mode 100644 (file)
index 0000000..ce2c360
--- /dev/null
@@ -0,0 +1,5897 @@
+{
+  "annotations": {
+    "list": []
+  },
+  "editable": true,
+  "gnetId": null,
+  "graphTooltip": 1,
+  "hideControls": false,
+  "id": null,
+  "links": [],
+  "refresh": "1m",
+  "rows": [
+    {
+      "collapse": false,
+      "height": 236,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 2,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Keystone",
+              "name": "Drilldown dashboard",
+              "title": "Keystone",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_keystone_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Keystone",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 84,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Nova",
+              "name": "Drilldown dashboard",
+              "title": "Nova",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_nova_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Nova",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 85,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Neutron",
+              "name": "Drilldown dashboard",
+              "title": "Neutron",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_neutron_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Neutron",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 86,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Heat",
+              "name": "Drilldown dashboard",
+              "title": "Heat",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_keystone_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Heat",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 87,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Heat-cfn",
+              "name": "Drilldown dashboard",
+              "title": "Heat-cfn",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_heat_cfn_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Heat-cfn",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 88,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Ceilometer",
+              "name": "Drilldown dashboard",
+              "title": "Ceilometer",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_ceilometer_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Ceilometer",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 89,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Glance",
+              "name": "Drilldown dashboard",
+              "title": "Glance",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_glance_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Glance",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 90,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "CinderV3",
+              "name": "Drilldown dashboard",
+              "title": "CinderV3",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_cinderv3_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "CinderV3",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 91,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Aodh",
+              "name": "Drilldown dashboard",
+              "title": "Aodh",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_aodh_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Aodh",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 92,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Gnocchi",
+              "name": "Drilldown dashboard",
+              "title": "Gnocchi",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_gnocchi_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Gnocchi",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 93,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Placement",
+              "name": "Drilldown dashboard",
+              "title": "Placement",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_placement_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Placement",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgb(241, 12, 12)",
+            "rgba(240, 228, 24, 0.73)",
+            "rgba(106, 249, 0, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 94,
+          "interval": "> 60s",
+          "links": [
+            {
+              "dashboard": "Tacker",
+              "name": "Drilldown dashboard",
+              "title": "Tacker",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "condition": "",
+              "dsType": "influxdb",
+              "expr": "openstack_check_tacker_api",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "groupby_field": "",
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'keystone' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "step": 120,
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "keystone"
+                }
+              ]
+            }
+          ],
+          "thresholds": "0.1,0.9",
+          "title": "Tacker",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "UP",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            }
+          ],
+          "valueName": "current"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "OpenStack API Availability",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": false,
+      "height": 250,
+      "panels": [
+        {
+          "headings": true,
+          "id": 83,
+          "limit": 10,
+          "links": [],
+          "query": "",
+          "recent": true,
+          "search": false,
+          "span": 12,
+          "starred": true,
+          "tags": [],
+          "title": "Status Quick Access",
+          "type": "dashlist"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Row",
+      "titleSize": "h6"
+    },
+    {
+      "collapse": true,
+      "height": 223,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 64,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_running_instances",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "20,40",
+          "title": "Total Instances",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 67,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_running_tasks",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "20,40",
+          "title": "Total Tasks",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 66,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_running_instances",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Running Instances",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 68,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_running_tasks",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Running Tasks",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 69,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_used_vcpus",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "20,40",
+          "title": "Total Used vCPUs",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 77,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_free_vcpus",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "20,40",
+          "title": "Total Free vCPUs",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 71,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_used_vcpus",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Used vCPUs",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 78,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_free_vcpus",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Free vCPUs",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "format": "decmbytes",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 73,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_free_ram_MB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "20000,40000",
+          "title": "Total Free RAM",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "format": "decmbytes",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 79,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_used_ram_MB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "20000,40000",
+          "title": "Total Used RAM",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 80,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_free_ram_MB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Total Free RAM",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "decmbytes",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 75,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_used_ram_MB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Total Used RAM",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "decmbytes",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "decgbytes",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 70,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_free_disk_GB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "100,500",
+          "title": "Total Free Disk",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "format": "decgbytes",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 81,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_total_used_disk_GB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "100,500",
+          "title": "Total Used Disk",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 82,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_free_disk_GB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Total Free Disk",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "decgbytes",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 72,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_used_disk_GB",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Total Used Disk",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "decgbytes",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Consumed Resources",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 217,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 55,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_metering_agent_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Neutron Metering Agent Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 49,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_dhcp_agent_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Neutron DHCP Agent Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 56,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_neutron_metering_agent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Neutron Metering Agent",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 50,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_neutron_dhcp_agent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Neutron DHCP Agent",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 51,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_l3_agent_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Neutron L3 Agent Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 53,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_metadata_agent_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Neutron Metadata Agent Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 52,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_neutron_l3_agent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Neutron L3 Agent",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 54,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_neutron_metadata_agent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Neutron Metadata Agent",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 47,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_openvswitch_agent_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Neutron OVS Agent Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 48,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 10,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_neutron_neutron_openvswitch_agent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 4
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Neutron OVS Agent",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "OpenStack Neutron Stats",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 198,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 59,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_nova_scheduler_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Nova Scheduler Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 60,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_nova_conductor_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Nova Conductor Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 58,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 2,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_nova_nova_compute",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 20
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Nova Compute",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 61,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_nova_nova_scheduler",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 4
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Nova Scheduler",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 57,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_nova_compute_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Nova Compute Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 63,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_nova_consoleauth_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Nova ConsoleAuth",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 62,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_nova_nova_conductor",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Nova Conductor",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 65,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_nova_nova_consoleauth",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Nova ConsoleAuth",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "OpenStack Nova Stats",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 208,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 46,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_cinder_volume_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Cinder Volume Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 45,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "openstack_services_cinder_scheduler_up_percent",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "50,80",
+          "title": "Cinder Scheduler Up",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 42,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_cinderv3_cinder_scheduler",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Cinder Scheduler",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 43,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "openstack_services_cinderv3_cinder_volume",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{region}} : {{host}}: {{state}} ",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Cinder Volume",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "OpenStack Cinder Stats",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": "250px",
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(71, 212, 59, 0.4)",
+            "rgba(245, 150, 40, 0.73)",
+            "rgba(225, 40, 40, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "short",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 16,
+          "interval": ">60s",
+          "links": [
+            {
+              "dashboard": "RabbitMQ",
+              "name": "Drilldown dashboard",
+              "title": "RabbitMQ",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "dsType": "influxdb",
+              "expr": "",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'rabbitmq' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "rabbitmq"
+                }
+              ]
+            }
+          ],
+          "thresholds": "1,3",
+          "title": "RabbitMQ",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "OKAY",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "WARN",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            },
+            {
+              "op": "=",
+              "text": "CRIT",
+              "value": "3"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "4"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(71, 212, 59, 0.4)",
+            "rgba(245, 150, 40, 0.73)",
+            "rgba(225, 40, 40, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "short",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 15,
+          "interval": ">60s",
+          "links": [
+            {
+              "dashboard": "MySQL",
+              "name": "Drilldown dashboard",
+              "title": "MySQL",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "dsType": "influxdb",
+              "expr": "",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'mysql' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "mysql"
+                }
+              ]
+            }
+          ],
+          "thresholds": "1,3",
+          "title": "MySQL",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "OKAY",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "WARN",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            },
+            {
+              "op": "=",
+              "text": "CRIT",
+              "value": "3"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "4"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(71, 212, 59, 0.4)",
+            "rgba(245, 150, 40, 0.73)",
+            "rgba(225, 40, 40, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "short",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 18,
+          "interval": ">60s",
+          "links": [
+            {
+              "dashUri": "db/apache",
+              "dashboard": "Apache",
+              "name": "Drilldown dashboard",
+              "title": "Apache",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "dsType": "influxdb",
+              "expr": "",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'apache' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "apache"
+                }
+              ]
+            }
+          ],
+          "thresholds": "1,3",
+          "title": "Apache",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "OKAY",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "WARN",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            },
+            {
+              "op": "=",
+              "text": "CRIT",
+              "value": "3"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "4"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(71, 212, 59, 0.4)",
+            "rgba(245, 150, 40, 0.73)",
+            "rgba(225, 40, 40, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "short",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 10,
+          "interval": ">60s",
+          "links": [
+            {
+              "dashUri": "db/haproxy",
+              "dashboard": "HAProxy",
+              "name": "Drilldown dashboard",
+              "title": "HAProxy",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "dsType": "influxdb",
+              "expr": "",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'haproxy-openstack' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "haproxy-openstack"
+                }
+              ]
+            }
+          ],
+          "thresholds": "1,3",
+          "title": "haproxy",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "OKAY",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "WARN",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            },
+            {
+              "op": "=",
+              "text": "CRIT",
+              "value": "3"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "4"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(71, 212, 59, 0.4)",
+            "rgba(245, 150, 40, 0.73)",
+            "rgba(225, 40, 40, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "short",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 17,
+          "interval": ">60s",
+          "links": [
+            {
+              "dashUri": "db/memcached",
+              "dashboard": "Memcached",
+              "name": "Drilldown dashboard",
+              "title": "Memcached",
+              "type": "dashboard"
+            }
+          ],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "dsType": "influxdb",
+              "expr": "",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'memcached' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "environment_label",
+                  "operator": "=",
+                  "value": "$environment"
+                },
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "memcached"
+                }
+              ]
+            }
+          ],
+          "thresholds": "1,3",
+          "title": "memcached",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "OKAY",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "WARN",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            },
+            {
+              "op": "=",
+              "text": "CRIT",
+              "value": "3"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "4"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": true,
+          "colorValue": false,
+          "colors": [
+            "rgba(71, 212, 59, 0.4)",
+            "rgba(245, 150, 40, 0.73)",
+            "rgba(225, 40, 40, 0.59)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "short",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 29,
+          "interval": ">60s",
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "column": "value",
+              "dsType": "influxdb",
+              "expr": "",
+              "fill": "",
+              "format": "time_series",
+              "function": "last",
+              "groupBy": [
+                {
+                  "params": [
+                    "$interval"
+                  ],
+                  "type": "time"
+                },
+                {
+                  "params": [
+                    "null"
+                  ],
+                  "type": "fill"
+                }
+              ],
+              "groupByTags": [],
+              "interval": "",
+              "intervalFactor": 2,
+              "measurement": "cluster_status",
+              "policy": "default",
+              "query": "SELECT last(\"value\") FROM \"cluster_status\" WHERE \"cluster_name\" = 'memcached' AND $timeFilter GROUP BY time($interval) fill(null)",
+              "rawQuery": false,
+              "refId": "A",
+              "resultFormat": "time_series",
+              "select": [
+                [
+                  {
+                    "params": [
+                      "value"
+                    ],
+                    "type": "field"
+                  },
+                  {
+                    "params": [],
+                    "type": "last"
+                  }
+                ]
+              ],
+              "tags": [
+                {
+                  "key": "cluster_name",
+                  "operator": "=",
+                  "value": "pacemaker"
+                }
+              ]
+            }
+          ],
+          "thresholds": "1,3",
+          "title": "pacemaker",
+          "type": "singlestat",
+          "valueFontSize": "50%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "no data",
+              "value": "null"
+            },
+            {
+              "op": "=",
+              "text": "OKAY",
+              "value": "0"
+            },
+            {
+              "op": "=",
+              "text": "WARN",
+              "value": "1"
+            },
+            {
+              "op": "=",
+              "text": "UNKW",
+              "value": "2"
+            },
+            {
+              "op": "=",
+              "text": "CRIT",
+              "value": "3"
+            },
+            {
+              "op": "=",
+              "text": "DOWN",
+              "value": "4"
+            }
+          ],
+          "valueName": "current"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Middleware Stats",
+      "titleSize": "h5"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "enable": true,
+    "list": [
+      {
+        "allFormat": "regex values",
+        "allValue": null,
+        "current": {
+          "isNone": true,
+          "text": "None",
+          "value": ""
+        },
+        "datasource": null,
+        "hide": 0,
+        "includeAll": false,
+        "label": null,
+        "multi": false,
+        "name": "environment",
+        "options": [],
+        "query": "show tag values from cpu_idle with key = environment_label",
+        "refresh": 1,
+        "refresh_on_load": true,
+        "regex": "",
+        "sort": 0,
+        "tagValuesQuery": "",
+        "tags": [],
+        "tagsQuery": "",
+        "type": "query",
+        "useTags": false
+      }
+    ]
+  },
+  "time": {
+    "from": "now-30m",
+    "to": "now"
+  },
+  "timepicker": {
+    "collapse": false,
+    "enable": true,
+    "notice": false,
+    "now": true,
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "status": "Stable",
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ],
+    "type": "timepicker"
+  },
+  "timezone": "browser",
+  "title": "OpenStack Stats",
+  "version": 4
+}
\ No newline at end of file
diff --git a/monitor/dashboard/stats_overview.json b/monitor/dashboard/stats_overview.json
new file mode 100644 (file)
index 0000000..440bb5a
--- /dev/null
@@ -0,0 +1,2257 @@
+{
+  "annotations": {
+    "list": []
+  },
+  "description": "A monitoring dashboard for OPNFV long duration test",
+  "editable": true,
+  "gnetId": 893,
+  "graphTooltip": 1,
+  "hideControls": false,
+  "id": null,
+  "links": [],
+  "refresh": false,
+  "rows": [
+    {
+      "collapse": false,
+      "height": -295,
+      "panels": [
+        {
+          "content": "<img src=\"https://wiki.opnfv.org/download/attachments/13212037/soak_monitoring.png\" alt=\"Monitoring Soak Test logo\" style=\"height: 66px;\">\n\n<p style=\"margin-top: 10px;\">\nYou're using the monitoring suite developed by OPNFV Bottlenecks team for OPNFV long duration test.\nThe monitoring suite consists of a monitoring dashboard - \n<a href=\"http://www.grafana.org/\">Grafana</a> ,\na monitoring data source -\n<a href=\"http://prometheus.io/\">Prometheus</a> and\nseveral monitoring tools -\n<a href=\"https://wiki.opnfv.org/display/fastpath/Barometer+Home/\">Barometer</a>,\n<a href=\"https://github.com/google/cadvisor/\">Cadvisor</a> and\n<a href=\"https://github.com/prometheus/node_exporter/\">Node</a>.\nThe monitoring suite is evolving along with OPNFV releases and enriched features will be included based on practical needs.\n</p>",
+          "editable": true,
+          "error": false,
+          "height": "100",
+          "id": 91,
+          "links": [],
+          "mode": "html",
+          "span": 7,
+          "style": {},
+          "title": "",
+          "transparent": true,
+          "type": "text"
+        },
+        {
+          "content": "### OPNFV Long Duration Test\nThis is a collaborative initiative launched by OPNFV test working group (Testperf) for long duration stability test (soak test) in NFV realm.\nSeveral testing projects in OPNFV has been involved, i.e.,\n[Bottlenecks - system limit testing](https://wiki.opnfv.org/display/bottlenecks),\n[Functest - functional testing](https://wiki.opnfv.org/display/functest),\n[NFVbench -NFVI benchmark testing](https://wiki.opnfv.org/display/bottlenecks),\n[Storperf - storage testing](https://wiki.opnfv.org/display/bottlenecks),\n[VSperf - data path testing](https://wiki.opnfv.org/display/bottlenecks) and\n[Yardstick - performance testing](https://wiki.opnfv.org/display/bottlenecks).\nFor more detail, please refer to the [OPNFV LDT WIKI](https://wiki.opnfv.org/display/testing/Long+Duration+Testing).",
+          "editable": true,
+          "error": false,
+          "id": 92,
+          "links": [],
+          "mode": "markdown",
+          "span": 5,
+          "style": {},
+          "title": "",
+          "transparent": true,
+          "type": "text"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": false,
+      "title": "Dashboard Information",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": false,
+      "height": 177,
+      "panels": [
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "decimals": 0,
+          "editable": true,
+          "error": false,
+          "format": "s",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "height": "",
+          "id": 24,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "30%",
+          "prefix": "",
+          "prefixFontSize": "20%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "time() - node_boot_time",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "",
+          "title": "Uptime",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(245, 54, 54, 0.9)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(50, 172, 45, 0.97)"
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "format": "none",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": false,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 31,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 1,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "count(rate(container_last_seen{name=~\".+\"}[$interval]))",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "",
+          "title": "Containers",
+          "type": "singlestat",
+          "valueFontSize": "120%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "decimals": 1,
+          "editable": true,
+          "error": false,
+          "format": "percentunit",
+          "gauge": {
+            "maxValue": 1,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 26,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "min((node_filesystem_size{fstype=~\"xfs|ext4\"} - node_filesystem_free{fstype=~\"xfs|ext4\"} )/ node_filesystem_size{fstype=~\"xfs|ext4\"})",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "0.75, 0.90",
+          "title": "Disk space",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "cacheTimeout": null,
+          "colorBackground": false,
+          "colorValue": false,
+          "colors": [
+            "rgba(50, 172, 45, 0.97)",
+            "rgba(237, 129, 40, 0.89)",
+            "rgba(245, 54, 54, 0.9)"
+          ],
+          "datasource": "automated-ds",
+          "decimals": 0,
+          "editable": true,
+          "error": false,
+          "format": "percent",
+          "gauge": {
+            "maxValue": 100,
+            "minValue": 0,
+            "show": true,
+            "thresholdLabels": false,
+            "thresholdMarkers": true
+          },
+          "id": 25,
+          "interval": null,
+          "links": [],
+          "mappingType": 1,
+          "mappingTypes": [
+            {
+              "name": "value to text",
+              "value": 1
+            },
+            {
+              "name": "range to text",
+              "value": 2
+            }
+          ],
+          "maxDataPoints": 100,
+          "nullPointMode": "connected",
+          "nullText": null,
+          "postfix": "",
+          "postfixFontSize": "50%",
+          "prefix": "",
+          "prefixFontSize": "50%",
+          "rangeMaps": [
+            {
+              "from": "null",
+              "text": "N/A",
+              "to": "null"
+            }
+          ],
+          "span": 2,
+          "sparkline": {
+            "fillColor": "rgba(31, 118, 189, 0.18)",
+            "full": false,
+            "lineColor": "rgb(31, 120, 193)",
+            "show": false
+          },
+          "tableColumn": "",
+          "targets": [
+            {
+              "expr": "((node_memory_MemTotal - node_memory_MemAvailable) / node_memory_MemTotal) * 100",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 40
+            }
+          ],
+          "thresholds": "70, 90",
+          "title": "Memory",
+          "type": "singlestat",
+          "valueFontSize": "80%",
+          "valueMaps": [
+            {
+              "op": "=",
+              "text": "N/A",
+              "value": "null"
+            }
+          ],
+          "valueName": "current"
+        },
+        {
+          "aliasColors": {
+            "{id=\"/\",instance=\"cadvisor:8080\",job=\"prometheus\"}": "#BA43A9"
+          },
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 5,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 3,
+          "stack": true,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "sum(rate(container_cpu_system_seconds_total[1m]))",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "a",
+              "refId": "B",
+              "step": 120
+            },
+            {
+              "expr": "sum(rate(container_cpu_system_seconds_total{name=~\".+\"}[1m]))",
+              "format": "time_series",
+              "hide": true,
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "nur container",
+              "refId": "F",
+              "step": 4
+            },
+            {
+              "expr": "sum(rate(container_cpu_system_seconds_total{id=\"/\"}[1m]))",
+              "format": "time_series",
+              "hide": true,
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "nur docker host",
+              "metric": "",
+              "refId": "A",
+              "step": 4
+            },
+            {
+              "expr": "sum(rate(process_cpu_seconds_total[$interval])) * 100",
+              "format": "time_series",
+              "hide": false,
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "metric": "",
+              "refId": "C",
+              "step": 10
+            },
+            {
+              "expr": "sum(rate(container_cpu_system_seconds_total{name=~\".+\"}[1m])) + sum(rate(container_cpu_system_seconds_total{id=\"/\"}[1m])) + sum(rate(process_cpu_seconds_total[1m]))",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "refId": "D",
+              "step": 4
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU Usage",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": false,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "percent",
+              "label": "",
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {
+            "Available Memory": "#7EB26D",
+            "Unavailable Memory": "#7EB26D"
+          },
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 38,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 2,
+          "stack": true,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "container_memory_rss{name=~\".+\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "D",
+              "step": 20
+            },
+            {
+              "expr": "sum(container_memory_rss{name=~\".+\"})",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "A",
+              "step": 20
+            },
+            {
+              "expr": "container_memory_usage_bytes{name=~\".+\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "B",
+              "step": 20
+            },
+            {
+              "expr": "container_memory_rss{id=\"/\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "C",
+              "step": 20
+            },
+            {
+              "expr": "sum(container_memory_rss)",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "E",
+              "step": 20
+            },
+            {
+              "expr": "node_memory_Buffers",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "node_memory_Dirty",
+              "refId": "N",
+              "step": 30
+            },
+            {
+              "expr": "node_memory_MemFree",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "Free Memory",
+              "refId": "F",
+              "step": 20
+            },
+            {
+              "expr": "node_memory_MemAvailable",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "Available Memory",
+              "refId": "H",
+              "step": 20
+            },
+            {
+              "expr": "node_memory_MemTotal - node_memory_MemAvailable",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "Unavailable Memory",
+              "refId": "G",
+              "step": 20
+            },
+            {
+              "expr": "node_memory_Inactive",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "I",
+              "step": 2
+            },
+            {
+              "expr": "node_memory_KernelStack",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "J",
+              "step": 30
+            },
+            {
+              "expr": "node_memory_Active",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "K",
+              "step": 30
+            },
+            {
+              "expr": "node_memory_MemTotal - (node_memory_Active + node_memory_MemFree + node_memory_Inactive)",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "Unknown",
+              "refId": "L",
+              "step": 40
+            },
+            {
+              "expr": "node_memory_MemFree + node_memory_Inactive ",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "M",
+              "step": 30
+            },
+            {
+              "expr": "container_memory_rss{name=~\".+\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{__name__}}",
+              "refId": "O",
+              "step": 30
+            },
+            {
+              "expr": "node_memory_Inactive + node_memory_MemFree + node_memory_MemAvailable",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "refId": "P",
+              "step": 40
+            }
+          ],
+          "thresholds": [
+            {
+              "colorMode": "critical",
+              "fill": true,
+              "line": true,
+              "op": "gt",
+              "value": 10000000000
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Available Memory",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": false,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bytes",
+              "label": "",
+              "logBase": 1,
+              "max": null,
+              "min": 0,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "headings": true,
+          "id": 94,
+          "limit": 10,
+          "links": [],
+          "query": "",
+          "recent": true,
+          "search": false,
+          "span": 12,
+          "starred": true,
+          "tags": [],
+          "title": "Status Quick Access",
+          "type": "dashlist"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Nodes Overview - CPU, Network, Storage, Container Count",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 265,
+      "panels": [
+        {
+          "alert": {
+            "conditions": [
+              {
+                "evaluator": {
+                  "params": [
+                    1.25
+                  ],
+                  "type": "gt"
+                },
+                "query": {
+                  "params": [
+                    "A",
+                    "5m",
+                    "now"
+                  ]
+                },
+                "reducer": {
+                  "params": [],
+                  "type": "avg"
+                },
+                "type": "query"
+              }
+            ],
+            "executionErrorState": "alerting",
+            "frequency": "60s",
+            "handler": 1,
+            "name": "Panel Title alert",
+            "noDataState": "keep_state",
+            "notifications": [
+              {
+                "id": 1
+              }
+            ]
+          },
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "decimals": 0,
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "id": 28,
+          "legend": {
+            "alignAsTable": false,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "connected",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "node_load1 / count by(job, instance)(count by(job, instance, cpu)(node_cpu))",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "refId": "A",
+              "step": 10
+            },
+            {
+              "expr": "count by(exported_instance, job)(collectd_load_0{exported_instance=~\"host.\"}) / (count by(job, exported_instance)(count by(exported_instance, job, cpu)(collectd_cpu{exported_instance=~\"host.\"})))",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "refId": "B",
+              "step": 10
+            }
+          ],
+          "thresholds": [
+            {
+              "colorMode": "critical",
+              "fill": true,
+              "line": true,
+              "op": "gt",
+              "value": 1.25
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU Loads on Nodes",
+          "tooltip": {
+            "msResolution": false,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": false,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "percentunit",
+              "label": null,
+              "logBase": 1,
+              "max": "1",
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {
+            "SENT": "#BF1B00"
+          },
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 19,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 1,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "sum(rate(container_network_transmit_bytes_total[$interval])) by (instance) - sum(rate(container_network_receive_bytes_total[$interval])) by (instance)",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "(SENT - RECEIVED)  {{instance}}",
+              "refId": "A",
+              "step": 10
+            },
+            {
+              "expr": "- sum(rate(container_network_transmit_bytes_total[$interval])) by (instance)",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "SENT - {{instance}}",
+              "refId": "B",
+              "step": 10
+            },
+            {
+              "expr": "sum(rate(container_network_receive_bytes_total[$interval])) by (instance)",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "RECEIVED - {{instance}}",
+              "refId": "C",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Network Loads on Nodes",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "transparent": false,
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": false,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bytes",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {
+            "IN on /sda": "#7EB26D",
+            "OUT on /sda": "#890F02"
+          },
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 3,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 4,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "-sum(rate(node_disk_bytes_read[$interval])) by (device)",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "OUT on /{{device}}",
+              "metric": "node_disk_bytes_read",
+              "refId": "A",
+              "step": 10
+            },
+            {
+              "expr": "sum(rate(node_disk_bytes_written[$interval])) by (device)",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "IN on /{{device}}",
+              "metric": "",
+              "refId": "B",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Disk I/O",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": false,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Loads on Nodes - CPU, Network, Disk Loads Records",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 281,
+      "panels": [
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 8,
+          "legend": {
+            "alignAsTable": true,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "sum(rate(container_network_receive_bytes_total{name=~\".+\"}[$interval])) by (name)",
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "A",
+              "step": 4
+            },
+            {
+              "expr": "- rate(container_network_transmit_bytes_total{name=~\".+\"}[$interval])",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "B",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Received Network Traffic per Container",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "transparent": false,
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 9,
+          "legend": {
+            "alignAsTable": true,
+            "avg": false,
+            "current": false,
+            "hideEmpty": false,
+            "hideZero": false,
+            "max": false,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "sum(rate(container_network_transmit_bytes_total{name=~\".+\"}[$interval])) by (name)",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "A",
+              "step": 4
+            },
+            {
+              "expr": "rate(container_network_transmit_bytes_total{id=\"/\"}[$interval])",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "refId": "B",
+              "step": 10
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Sent Network Traffic per Container",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "cumulative"
+          },
+          "transparent": false,
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "Bps",
+              "label": "",
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": "",
+              "logBase": 10,
+              "max": 8,
+              "min": 0,
+              "show": false
+            }
+          ]
+        },
+        {
+          "alert": {
+            "conditions": [
+              {
+                "evaluator": {
+                  "params": [
+                    850000000000
+                  ],
+                  "type": "gt"
+                },
+                "query": {
+                  "params": [
+                    "A",
+                    "5m",
+                    "now"
+                  ]
+                },
+                "reducer": {
+                  "params": [],
+                  "type": "avg"
+                },
+                "type": "query"
+              }
+            ],
+            "executionErrorState": "alerting",
+            "frequency": "60s",
+            "handler": 1,
+            "name": "Free/Used Disk Space alert",
+            "noDataState": "keep_state",
+            "notifications": [
+              {
+                "id": 1
+              }
+            ]
+          },
+          "aliasColors": {
+            "Belegete Festplatte": "#BF1B00",
+            "Free Disk Space": "#7EB26D",
+            "Used Disk Space": "#7EB26D",
+            "{}": "#BF1B00"
+          },
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 1,
+          "grid": {},
+          "id": 13,
+          "legend": {
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "show": false,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [
+            {
+              "alias": "Used Disk Space",
+              "yaxis": 1
+            }
+          ],
+          "spaceLength": 10,
+          "span": 3,
+          "stack": true,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "node_filesystem_size{fstype=\"aufs\"} - node_filesystem_free{fstype=\"aufs\"}",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "",
+              "refId": "A",
+              "step": 10
+            }
+          ],
+          "thresholds": [
+            {
+              "colorMode": "critical",
+              "fill": true,
+              "line": true,
+              "op": "gt",
+              "value": 850000000000
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Used Disk Space",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": false,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bytes",
+              "label": "",
+              "logBase": 1,
+              "max": 1000000000000,
+              "min": 0,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 5,
+          "grid": {},
+          "id": 1,
+          "legend": {
+            "alignAsTable": true,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 9,
+          "stack": true,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "sum(rate(container_cpu_usage_seconds_total{name=~\".+\"}[$interval])) by (name) * 100",
+              "format": "time_series",
+              "hide": false,
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "metric": "",
+              "refId": "F",
+              "step": 4
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "CPU Usage per Container",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "percent",
+              "label": "",
+              "logBase": 1,
+              "max": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": false
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 3,
+          "grid": {},
+          "id": 10,
+          "legend": {
+            "alignAsTable": true,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": true,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "sum(container_memory_rss{name=~\".+\"}) by (name)",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "A",
+              "step": 4
+            },
+            {
+              "expr": "container_memory_usage_bytes{name=~\".+\"}",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "B",
+              "step": 240
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Memory Usage per Container",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bytes",
+              "label": "",
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fill": 3,
+          "grid": {},
+          "id": 34,
+          "legend": {
+            "alignAsTable": true,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 2,
+          "links": [],
+          "nullPointMode": "null as zero",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": true,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "sum(container_memory_swap{name=~\".+\"}) by (name)",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "A",
+              "step": 4
+            },
+            {
+              "expr": "container_memory_usage_bytes{name=~\".+\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "B",
+              "step": 240
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Memory Swap per Container",
+          "tooltip": {
+            "msResolution": true,
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "bytes",
+              "label": "",
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 95,
+          "legend": {
+            "alignAsTable": true,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "count by(device)(container_fs_io_current)",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "refId": "A",
+              "step": 120
+            },
+            {
+              "expr": "container_fs_read_seconds_total{name=~\".+\"}",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "Read  - {{name}}",
+              "refId": "B",
+              "step": 4
+            },
+            {
+              "expr": "-container_fs_write_seconds_total{name=~\".+\"}",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "Write - {{name}}",
+              "refId": "C",
+              "step": 4
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Container IO Seconds Total",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        },
+        {
+          "aliasColors": {},
+          "bars": false,
+          "dashLength": 10,
+          "dashes": false,
+          "datasource": "automated-ds",
+          "fill": 1,
+          "id": 96,
+          "legend": {
+            "alignAsTable": true,
+            "avg": false,
+            "current": false,
+            "max": false,
+            "min": false,
+            "rightSide": true,
+            "show": true,
+            "total": false,
+            "values": false
+          },
+          "lines": true,
+          "linewidth": 1,
+          "links": [],
+          "nullPointMode": "null",
+          "percentage": false,
+          "pointradius": 5,
+          "points": false,
+          "renderer": "flot",
+          "seriesOverrides": [],
+          "spaceLength": 10,
+          "span": 6,
+          "stack": false,
+          "steppedLine": false,
+          "targets": [
+            {
+              "expr": "container_fs_io_current{name=~\".+\"}",
+              "format": "time_series",
+              "hide": false,
+              "interval": "",
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "A",
+              "step": 4
+            },
+            {
+              "expr": "container_fs_read_seconds_total{name=~\".+\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "Read  - {{name}}",
+              "refId": "B",
+              "step": 240
+            },
+            {
+              "expr": "container_fs_write_seconds_total{name=~\".+\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "Write - {{name}}",
+              "refId": "C",
+              "step": 240
+            }
+          ],
+          "thresholds": [],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Container IO Current",
+          "tooltip": {
+            "shared": true,
+            "sort": 0,
+            "value_type": "individual"
+          },
+          "type": "graph",
+          "xaxis": {
+            "buckets": null,
+            "mode": "time",
+            "name": null,
+            "show": true,
+            "values": []
+          },
+          "yaxes": [
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            },
+            {
+              "format": "short",
+              "label": null,
+              "logBase": 1,
+              "max": null,
+              "min": null,
+              "show": true
+            }
+          ]
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Containers on Nodes -  CPU, Traffic, Memory Usage",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": null,
+      "panels": [
+        {
+          "columns": [],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "filterNull": false,
+          "fontSize": "100%",
+          "height": "400",
+          "hideTimeOverride": false,
+          "id": 93,
+          "links": [],
+          "pageSize": 100,
+          "repeat": null,
+          "scroll": true,
+          "showHeader": true,
+          "sort": {
+            "col": 0,
+            "desc": false
+          },
+          "span": 9,
+          "styles": [
+            {
+              "colorMode": null,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "decimals": 2,
+              "pattern": "/.*/",
+              "thresholds": [],
+              "type": "number",
+              "unit": "short"
+            }
+          ],
+          "targets": [
+            {
+              "expr": "cadvisor_version_info",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{instance}} - cAdvisor Version: {{cadvisorVersion}} - Docker Version: {{dockerVersion}} - OS Version: {{osVersion}} - Host Kernel Version: {{kernelVersion}}",
+              "refId": "A",
+              "step": 4
+            },
+            {
+              "expr": "prometheus_build_info",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{instance}} - Prometheus Version: {{version}} - Go Version: {{goversion}} - Prometheus Branch: {{branch}}",
+              "refId": "B",
+              "step": 4
+            },
+            {
+              "expr": "node_exporter_build_info",
+              "format": "time_series",
+              "intervalFactor": 2,
+              "legendFormat": "{{instance}} - Node-Exporter Version: {{version}} - Go Version: {{goversion}} - Node Exporter Branch: {{branch}}",
+              "refId": "C",
+              "step": 4
+            },
+            {
+              "expr": "collectd_exporter_build_info",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{instance}} - Collectd Exporter Version: {{version}} - Go Version: {{goversion}} - Collectd Exporter Branch: {{branch}} ",
+              "refId": "G",
+              "step": 4
+            }
+          ],
+          "timeFrom": null,
+          "timeShift": null,
+          "title": "Versions",
+          "transform": "timeseries_aggregations",
+          "type": "table"
+        },
+        {
+          "columns": [
+            {
+              "text": "Avg",
+              "value": "avg"
+            }
+          ],
+          "datasource": "automated-ds",
+          "editable": true,
+          "error": false,
+          "fontSize": "100%",
+          "height": "400",
+          "id": 36,
+          "links": [],
+          "pageSize": null,
+          "scroll": true,
+          "showHeader": true,
+          "sort": {
+            "col": 0,
+            "desc": true
+          },
+          "span": 3,
+          "styles": [
+            {
+              "colorMode": null,
+              "colors": [
+                "rgba(245, 54, 54, 0.9)",
+                "rgba(237, 129, 40, 0.89)",
+                "rgba(50, 172, 45, 0.97)"
+              ],
+              "decimals": 2,
+              "pattern": "/.*/",
+              "thresholds": [
+                "10000000",
+                " 25000000"
+              ],
+              "type": "number",
+              "unit": "decbytes"
+            }
+          ],
+          "targets": [
+            {
+              "expr": "sum(container_spec_memory_limit_bytes{name=~\".+\"} - container_memory_usage_bytes{name=~\".+\"}) by (name) ",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "metric": "",
+              "refId": "A",
+              "step": 240
+            },
+            {
+              "expr": "sum(container_spec_memory_limit_bytes{name=~\".+\"}) by (name) ",
+              "format": "time_series",
+              "hide": false,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "B",
+              "step": 10
+            },
+            {
+              "expr": "container_memory_usage_bytes{name=~\".+\"}",
+              "format": "time_series",
+              "hide": true,
+              "intervalFactor": 2,
+              "legendFormat": "{{name}}",
+              "refId": "C",
+              "step": 240
+            }
+          ],
+          "title": "Limit memory",
+          "transform": "timeseries_aggregations",
+          "type": "table"
+        }
+      ],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Versions - Host OS, Docker, APP, Build Information",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 250,
+      "panels": [],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "OVS Bridges on Nodes - TODO",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 250,
+      "panels": [],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "VMs on Nodes - TODO",
+      "titleSize": "h5"
+    },
+    {
+      "collapse": true,
+      "height": 250,
+      "panels": [],
+      "repeat": null,
+      "repeatIteration": null,
+      "repeatRowId": null,
+      "showTitle": true,
+      "title": "Traffic Generators Status - TODO",
+      "titleSize": "h5"
+    }
+  ],
+  "schemaVersion": 14,
+  "style": "dark",
+  "tags": [],
+  "templating": {
+    "list": [
+      {
+        "allValue": ".+",
+        "current": {
+          "text": "All",
+          "value": "$__all"
+        },
+        "datasource": "automated-ds",
+        "hide": 0,
+        "includeAll": true,
+        "label": "Container Group",
+        "multi": true,
+        "name": "containergroup",
+        "options": [],
+        "query": "label_values(container_group)",
+        "refresh": 1,
+        "regex": "",
+        "sort": 0,
+        "tagValuesQuery": null,
+        "tags": [],
+        "tagsQuery": null,
+        "type": "query",
+        "useTags": false
+      },
+      {
+        "auto": true,
+        "auto_count": 50,
+        "auto_min": "50s",
+        "current": {
+          "text": "auto",
+          "value": "$__auto_interval"
+        },
+        "datasource": null,
+        "hide": 0,
+        "includeAll": false,
+        "label": "Interval",
+        "multi": false,
+        "name": "interval",
+        "options": [
+          {
+            "selected": true,
+            "text": "auto",
+            "value": "$__auto_interval"
+          },
+          {
+            "selected": false,
+            "text": "30s",
+            "value": "30s"
+          },
+          {
+            "selected": false,
+            "text": "1m",
+            "value": "1m"
+          },
+          {
+            "selected": false,
+            "text": "2m",
+            "value": "2m"
+          },
+          {
+            "selected": false,
+            "text": "3m",
+            "value": "3m"
+          },
+          {
+            "selected": false,
+            "text": "5m",
+            "value": "5m"
+          },
+          {
+            "selected": false,
+            "text": "7m",
+            "value": "7m"
+          },
+          {
+            "selected": false,
+            "text": "10m",
+            "value": "10m"
+          },
+          {
+            "selected": false,
+            "text": "30m",
+            "value": "30m"
+          },
+          {
+            "selected": false,
+            "text": "1h",
+            "value": "1h"
+          },
+          {
+            "selected": false,
+            "text": "6h",
+            "value": "6h"
+          },
+          {
+            "selected": false,
+            "text": "12h",
+            "value": "12h"
+          },
+          {
+            "selected": false,
+            "text": "1d",
+            "value": "1d"
+          },
+          {
+            "selected": false,
+            "text": "7d",
+            "value": "7d"
+          },
+          {
+            "selected": false,
+            "text": "14d",
+            "value": "14d"
+          },
+          {
+            "selected": false,
+            "text": "30d",
+            "value": "30d"
+          }
+        ],
+        "query": "30s,1m,2m,3m,5m,7m,10m,30m,1h,6h,12h,1d,7d,14d,30d",
+        "refresh": 2,
+        "type": "interval"
+      },
+      {
+        "allValue": null,
+        "current": {
+          "text": null,
+          "value": null
+        },
+        "datasource": "automated-ds",
+        "hide": 0,
+        "includeAll": false,
+        "label": "Node",
+        "multi": true,
+        "name": "server",
+        "options": [],
+        "query": "label_values(node_boot_time, instance)",
+        "refresh": 1,
+        "regex": "/([^:]+):.*/",
+        "sort": 0,
+        "tagValuesQuery": null,
+        "tags": [],
+        "tagsQuery": null,
+        "type": "query",
+        "useTags": false
+      }
+    ]
+  },
+  "time": {
+    "from": "now-30m",
+    "to": "now"
+  },
+  "timepicker": {
+    "refresh_intervals": [
+      "5s",
+      "10s",
+      "30s",
+      "1m",
+      "5m",
+      "15m",
+      "30m",
+      "1h",
+      "2h",
+      "1d"
+    ],
+    "time_options": [
+      "5m",
+      "15m",
+      "1h",
+      "6h",
+      "12h",
+      "24h",
+      "2d",
+      "7d",
+      "30d"
+    ]
+  },
+  "timezone": "browser",
+  "title": "Stats Overview",
+  "version": 2
+}
\ No newline at end of file
diff --git a/monitor/dispatch/__init__.py b/monitor/dispatch/__init__.py
new file mode 100644 (file)
index 0000000..a90f1d1
--- /dev/null
@@ -0,0 +1,8 @@
+##############################################################################
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
diff --git a/monitor/dispatch/client_ip_configure.py b/monitor/dispatch/client_ip_configure.py
new file mode 100644 (file)
index 0000000..2a66f7b
--- /dev/null
@@ -0,0 +1,25 @@
+##############################################################################
+# Copyright (c) 2018 Huawei Tech and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+import fileinput
+import re
+import logging
+import socket
+
+logger = logging.getLogger(__name__)
+ip_address = socket.gethostbyname(socket.gethostname())
+
+for line in fileinput.input(inplace=1):
+    ip = "        Server \"" + str(ip_address) + "\" \"25826\""
+    line = re.sub(r'.*Server.*25826.*', r'' + str(ip), line.rstrip())
+    print(line)
+
+for line in fileinput.input(inplace=1):
+    ip = "    URL \"http://" + str(ip_address) + ":9103/collectd-post\""
+    line = re.sub(r'.*URL.*collectd-post.*', r'' + str(ip), line.rstrip())
+    print(line)
diff --git a/monitor/dispatch/install_barometer_client.sh b/monitor/dispatch/install_barometer_client.sh
new file mode 100644 (file)
index 0000000..80667cd
--- /dev/null
@@ -0,0 +1,8 @@
+HOSTNAME=`hostname`
+
+docker pull opnfv/barometer
+sudo docker run  --name bottlenecks-barometer-${HOSTNAME} -d --net=host \
+  -v /etc/barometer_config/barometer_client.conf:/src/barometer/src/collectd/collectd/src/collectd.conf \
+  -v /etc/barometer_config/barometer_client.conf:/opt/collectd/etc/collectd.conf \
+  -v /var/run:/var/run -v /tmp:/tmp \
+  --privileged opnfv/barometer /run_collectd.sh
\ No newline at end of file
similarity index 71%
rename from monitor/cadvisor_install.sh
rename to monitor/dispatch/install_cadvisor_client.sh
index 524e24d..bcd0e8a 100644 (file)
@@ -1,4 +1,7 @@
+HOSTNAME=`hostname`
+
 sudo docker run \
+  --name=bottlenecks-cadvisor-${HOSTNAME} \
   --volume=/:/rootfs:ro \
   --volume=/var/run:/var/run:rw \
   --volume=/sys:/sys:ro \
@@ -6,5 +9,4 @@ sudo docker run \
   --volume=/dev/disk/:/dev/disk:ro \
   --publish=8080:8080 \
   --detach=true \
-  --name=cadvisor \
-  google/cadvisor:v0.25.0 \ -storage_driver=Prometheus
+  google/cadvisor:v0.25.0
diff --git a/monitor/dispatch/install_clients.py b/monitor/dispatch/install_clients.py
new file mode 100644 (file)
index 0000000..ab7d0f5
--- /dev/null
@@ -0,0 +1,118 @@
+##############################################################################
+# Copyright (c) 2018 Huawei Tech and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''
+Currently supported installers are Apex, Compass...
+Supported monitoring tools are Cadvisor, Collectd, Barometer...
+Carefully, do not change the path or name of the configuration files which
+are hard coded for docker volume mapping.
+'''
+import os
+import logging
+import yaml
+import utils.infra_setup.passwordless_SSH.ssh as ssh
+import argparse
+
+logger = logging.getLogger(__name__)
+
+parser = argparse.ArgumentParser(description='Monitoring Clients Dispatcher')
+parser.add_argument("-i", "--INSTALLER_TYPE",
+                    help="The installer for the system under monitoring")
+# Barometer config and installation files
+# /home/opnfv/bottlenecks/monitor/dispatch/install_barometer_client.sh
+# /home/opnfv/bottlenecks/monitor/config/barometer_client.conf
+# Cadvisor installation file
+# /home/opnfv/bottlenecks/monitor/dispatch/install_cadvisor_client.sh
+# Collectd config and installation files
+# /home/opnfv/bottlenecks/monitor/dispatch/install_collectd_client.sh
+# /home/opnfv/bottlenecks/monitor/config/collectd_client.conf
+parser.add_argument("-s", "--INSTALlATION_SCRIPT",
+                    help="The path of the script to install monitoring script")
+parser.add_argument("-c", "--CLIENT_CONFIG", default="",
+                    help="The path of the config of monitoring client")
+parser.add_argument("-p", "--POD_DISCRIPTOR", default="/tmp/pod.yaml",
+                    help="The path of pod discrition file")
+args = parser.parse_args()
+
+INSTALLERS = ['apex', 'compass']
+if args.INSTALLER_TYPE not in INSTALLERS:
+    raise Exception("The installer is not supported.")
+if not args.INSTALlATION_SCRIPT:
+    raise Exception("Must specify the client installation script path!")
+
+if "barometer" in args.INSTALlATION_SCRIPT.lower():
+    CONFIG_FILE = "/etc/barometer_config/barometer_client.conf"
+    CONFIG_DIR = "barometer_config"
+    INSTALlATION_SCRIPT = "/etc/barometer_config/install.sh"
+elif "collectd" in args.INSTALlATION_SCRIPT.lower():
+    CONFIG_FILE = "/etc/collectd_config/collectd_client.conf"
+    CONFIG_DIR = "collectd_config"
+    INSTALlATION_SCRIPT = "/etc/collectd_config/install.sh"
+elif "cadvisor" in args.INSTALlATION_SCRIPT.lower():
+    CONFIG_DIR = "cadvisor_config"
+    INSTALlATION_SCRIPT = "/etc/cadvisor_config/install.sh"
+else:
+    raise Exception("The monitor client is not supported")
+
+
+def main():
+    with open(args.POD_DISCRIPTOR) as f:
+        dataMap = yaml.safe_load(f)
+        for x in dataMap:
+            for y in dataMap[x]:
+                if (y['role'].lower() == 'controller') or (
+                        y['role'].lower() == 'compute'):
+                    ip = str(y['ip'])
+                    user = str(y['user'])
+                    pwd = str(y['password'])
+                    idkey = str(y['key_filename'])
+
+                    if pwd:
+                        ssh_d = ssh.SSH(user, host=ip, password=pwd)
+                    elif idkey:
+                        idkey = "/tmp/id_rsa"
+                        ssh_d = ssh.SSH(user, host=ip, key_filename=idkey)
+                    status, stdout, stderr = ssh_d.execute(
+                        "cd /etc && mkdir " + CONFIG_DIR
+                    )
+                    if status:
+                        print Exception(
+                            "Command: \"mkdir {}\".format(CONFIG_DIR) failed.")
+                        logger.info(stdout.splitlines())
+                    if args.CLIENT_CONFIG:
+                        with open(args.CLIENT_CONFIG) as stdin_file:
+                            ssh_d.run("cat > " + CONFIG_FILE,
+                                      stdin=stdin_file)
+                    with open(args.INSTALlATION_SCRIPT) as stdin_file:
+                        ssh_d.run("cat > " + INSTALlATION_SCRIPT,
+                                  stdin=stdin_file)
+
+                    for u in os.uname():
+                        if 'ubuntu' in u.lower():
+                            NODE_OS = 'ubuntu'
+                            break
+                    if NODE_OS == 'ubuntu':
+                        status, stdout, stderr = ssh_d.execute(
+                            "sudo apt-get install -y docker.io"
+                        )
+                    else:
+                        status, stdout, stderr = ssh_d.execute(
+                            "sudo yum install -y docker-io"
+                        )
+                    if status:
+                        raise Exception(
+                            "Command for installing docker failed.")
+                        logger.info(stdout.splitlines())
+
+                    ssh_d.run(
+                        "cd /etc/{}/ && bash ./install.sh".format(CONFIG_DIR)
+                    )
+
+
+if __name__ == '__main__':
+    main()
diff --git a/monitor/dispatch/install_collectd_client.sh b/monitor/dispatch/install_collectd_client.sh
new file mode 100644 (file)
index 0000000..4f08112
--- /dev/null
@@ -0,0 +1,8 @@
+MONITOR_CONFIG="/etc/collectd_config"
+HOSTNAME=`hostname`
+
+sudo docker run --name bottlenecks-collectd-${HOSTNAME} -d \
+  --privileged \
+  -v ${MONITOR_CONFIG}/collectd_client.conf:/etc/collectd/collectd.conf:ro \
+  -v /proc:/mnt/proc:ro \
+  fr3nd/collectd:5.5.0-1
diff --git a/monitor/dispatch/server_ip_configure.py b/monitor/dispatch/server_ip_configure.py
new file mode 100644 (file)
index 0000000..62aa628
--- /dev/null
@@ -0,0 +1,25 @@
+##############################################################################
+# Copyright (c) 2018 Huawei Tech and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+import fileinput
+import re
+import logging
+import socket
+
+logger = logging.getLogger(__name__)
+ip_address = socket.gethostbyname(socket.gethostname())
+
+for line in fileinput.input(inplace=1):
+    ip = "        Listen \"" + str(ip_address) + "\" \"25826\""
+    line = re.sub(r'.*Listen.*25826.*', r'' + str(ip), line.rstrip())
+    print(line)
+
+for line in fileinput.input(inplace=1):
+    ip = "    URL \"http://" + str(ip_address) + ":9103/collectd-post\""
+    line = re.sub(r'.*URL.*collectd-post.*', r'' + str(ip), line.rstrip())
+    print(line)
diff --git a/monitor/install-collectd-client.sh b/monitor/install-collectd-client.sh
deleted file mode 100644 (file)
index 00fa4c8..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-MONITOR_CONFIG="/etc/collectd-config"
-
-# Collectd
-sudo docker run --name bottlenecks-automated-collectd -d \
-  --privileged \
-  -v ${MONITOR_CONFIG}:/etc/collectd:ro \
-  -v /proc:/mnt/proc:ro \
-  fr3nd/collectd:5.5.0-1
index 16cb308..8975061 100644 (file)
@@ -7,11 +7,98 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-
 MONITOR_CONFIG="/home/opnfv/bottlenecks/monitor/config"
-GRAFANA="/home/opnfv/bottlenecks/monitor/grafana"
+DISPATCH="/home/opnfv/bottlenecks/monitor/dispatch"
+OPENSTACK_ENV=${MONITOR_CONFIG}/openstack_exporter.conf
+
+usage="Script to run the tests in Bottlenecks.
+
+usage:
+    bash $(basename "$0") [-h|--help] [-i|--installer <installer typer>] [-o|--openstack-env <openstack env>]
+
+where:
+    -h|--help         show the help text
+    -i|--installer    specify the installer for the system to be monitored
+      <installer type>
+                      one of the following:
+                              (apex, compass)
+    -o|--opentack-env specify the openstack env file for openstack monitoring
+                      defalt value is \"${MONITOR_CONFIG}/openstack_exporter.conf\"
+
+examples:
+    $(basename "$0") -i compass"
+
+
+info () {
+    logger -s -t "BOTTLENECKS INFO" "$*"
+}
+
+error () {
+    logger -s -t "BOTTLENECKS ERROR" "$*"
+    exit 1
+}
+
+# Process input variables
+while [[ $# > 0 ]]
+    do
+    key="$1"
+    case $key in
+        -h|--help)
+            echo "$usage"
+            exit 0
+            shift
+        ;;
+        -i|--installer)
+            INSTALLER_TYPE="$2"
+            shift
+        ;;
+        -i|--openstack-env)
+            OPENSTACK_ENV="$2"
+            shift
+        ;;
+        *)
+            error "unkown input options $1 $2"
+            exit 1
+        ;;
+     esac
+     shift
+done
+
+
+barometer_client_install_sh="/home/opnfv/bottlenecks/monitor/dispatch/install_barometer_client.sh"
+barometer_client_install_conf="/home/opnfv/bottlenecks/monitor/config/barometer_client.conf"
+
+cadvisor_client_install_sh="/home/opnfv/bottlenecks/monitor/dispatch/install_cadvisor_client.sh"
+
+collectd_client_install_sh="/home/opnfv/bottlenecks/monitor/dispatch/install_collectd_client.sh"
+collectd_client_install_conf="/home/opnfv/bottlenecks/monitor/config/collectd_client.conf"
+
+# INSTALL GRAFANA + PROMETHEUS + CADVISOR + BAROMETER on the JUMPERSERVER
+# # Node-Exporter
+echo == installation of monitoring module is started ==
+
+# # Collectd
+# # Configure IP Address in collectd server configuration
+# python ${DISPATCH}/server_ip_configure.py ${MONITOR_CONFIG}/collectd_server.conf
+# sudo docker run --name bottlenecks-collectd -d \
+#   --privileged \
+#   -v ${MONITOR_CONFIG}/collectd_server.conf:/etc/collectd/collectd.conf:ro \
+#   -v /proc:/mnt/proc:ro \
+#   fr3nd/collectd:5.5.0-1
+
+set +e
+# Prometheus
+sudo docker run --name bottlenecks-prometheus \
+  -d -p 9090:9090 \
+  -v ${MONITOR_CONFIG}/prometheus.yaml:/etc/prometheus/prometheus.yml \
+  prom/prometheus:v1.7.1
+
+# Collectd-Exporter
+sudo docker run --name bottlenecks-collectd-exporter \
+  -d -p 9103:9103 -p 25826:25826/udp \
+  prom/collectd-exporter:0.3.1 \
+  -collectd.listen-address=":25826"
 
-# Node-Exporter
 sudo docker run --name bottlenecks-node-exporter \
   -d -p 9100:9100 \
   -v "/proc:/host/proc:ro" \
@@ -23,31 +110,24 @@ sudo docker run --name bottlenecks-node-exporter \
     -collector.sysfs /host/sys \
     -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
 
-# Collectd
-sudo docker run --name bottlenecks-collectd -d \
-  --privileged \
-  -v ${MONITOR_CONFIG}:/etc/collectd:ro \
-  -v /proc:/mnt/proc:ro \
-  fr3nd/collectd:5.5.0-1
-
-# Collectd-Exporter
-sudo docker run --name bottlenecks-collectd-exporter \
-  -d -p 9103:9103 \
-  -p 25826:25826/udp prom/collectd-exporter:0.3.1 \
-  -collectd.listen-address=":25826"
-
-# Prometheus
-sudo docker run --name bottlenecks-prometheus \
-  -d -p 9090:9090 \
-  -v ${MONITOR_CONFIG}/prometheus.yaml:/etc/prometheus/prometheus.yml \
-  prom/prometheus:v1.7.1
+# Openstack-Exporter
+sudo docker run --name bottlenecks-openstack-exporter \
+  -v /tmp:/tmp \
+  -p 9104:9104 --env-file ${OPENSTACK_ENV} \
+  -d gabrielyuyang/att-prometheus-openstack-exporter:latest
 
 # Grafana
 sudo  docker run --name bottlenecks-grafana \
   -d -p 3000:3000 \
-  -v ${GRAFANA}/config/grafana.ini:/etc/grafana/grafana.ini \
+  -v ${MONITOR_CONFIG}/grafana.ini:/etc/grafana/grafana.ini \
   grafana/grafana:4.5.0
+# Automate Prometheus Datasource and Grafana Dashboard creation
 
+set -e
+sleep 5
+python ${DISPATCH}/../dashboard/automated_dashboard_datasource.py
+
+set +e
 # Cadvisor
 sudo docker run \
   --volume=/:/rootfs:ro \
@@ -57,14 +137,43 @@ sudo docker run \
   --volume=/dev/disk/:/dev/disk:ro \
   --publish=8080:8080 \
   --detach=true \
-  --name=cadvisor \
-  google/cadvisor:v0.25.0 \ -storage_driver=Prometheus
+  --name=bottlenecks-cadvisor \
+  google/cadvisor:v0.25.0
+
 
-# Automate Collectd Client
-python automate_collectd_client.py
+set -e
+# Barometer
+# Configure IP Address in barometer server configuration
+sleep 5
+python ${DISPATCH}/server_ip_configure.py ${MONITOR_CONFIG}/barometer_server.conf
+
+set +e
+# Install on jumpserver
+docker pull opnfv/barometer
+sudo docker run  --name bottlenecks-barometer -d --net=host \
+  -v ${MONITOR_CONFIG}/barometer_server.conf:/src/barometer/src/collectd/collectd/src/collectd.conf \
+  -v ${MONITOR_CONFIG}/barometer_server.conf:/opt/collectd/etc/collectd.conf \
+  -v /var/run:/var/run \
+  -v /tmp:/tmp \
+  --privileged opnfv/barometer /run_collectd.sh
+
+set -e
+# INSTALL BAROMETER + CADVISOR (+ COLLECTD) CLIENTS on COMPUTE/CONTROL NODES
+# Configure IP Address in barometer client configuration
+python ${DISPATCH}/client_ip_configure.py ${MONITOR_CONFIG}/barometer_client.conf
+
+# Automate Barometer client installation
+python ${DISPATCH}/install_clients.py \
+  -i ${INSTALLER_TYPE} -s ${barometer_client_install_sh} \
+  -c ${barometer_client_install_conf}
+
+# # Configure IP Address in collectd client configuration
+# python ${DISPATCH}/client_ip_configure.py ${MONITOR_CONFIG}/collectd_client.conf
+# # Automate Collectd Client installation
+# python ${DISPATCH}/automate_collectd_client.py
 
 # Automate Cadvisor Client
-python automate_cadvisor_client.py
+python ${DISPATCH}/install_clients.py \
+  -i ${INSTALLER_TYPE} -s ${cadvisor_client_install_sh}
 
-# Automate Prometheus Datasource and Grafana Dashboard creation
-python automated-dashboard-datasource.py
+echo == installation of monitoring module is finished ==
diff --git a/monitor/uninstall.py b/monitor/uninstall.py
new file mode 100644 (file)
index 0000000..3a9cf0c
--- /dev/null
@@ -0,0 +1,52 @@
+##############################################################################
+# Copyright (c) 2018 Huawei Tech and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import logging
+import yaml
+import os
+import utils.infra_setup.passwordless_SSH.ssh as ssh
+
+LOG = logging.getLogger(__name__)
+DEL_DOCKER_SCRIPT = "/home/opnfv/bottlenecks/docker/docker_cleanup.sh"
+
+
+def ssh_del_docker(docker_name):
+    with open('/tmp/pod.yaml') as f:
+        dataMap = yaml.safe_load(f)
+        for x in dataMap:
+            for y in dataMap[x]:
+                if (y['role'] == 'Controller') or (y['role'] == 'Compute'):
+                    ip = str(y['ip'])
+                    user = str(y['user'])
+                    pwd = str(y['password'])
+                    ssh_d = ssh.SSH(user, host=ip, password=pwd)
+
+                    status, stdout, stderr = ssh_d.execute(
+                        "cd /etc"
+                    )
+                    with open(DEL_DOCKER_SCRIPT) as stdin_file:
+                        ssh_d.run("cat > /etc/docker_cleanup.sh",
+                                  stdin=stdin_file)
+
+                    ssh_d.run("cd /etc/ && bash ./docker_cleanup.sh -d " +
+                              docker_name)
+
+
+def local_del_docker(docker_name):
+        os.system('bash ' + DEL_DOCKER_SCRIPT + ' -d ' + docker_name)
+
+
+ssh_del_docker('cadvisor')
+ssh_del_docker('barometer')
+
+local_del_docker('prometheus')
+local_del_docker('cadvisor')
+local_del_docker('barometer')
+local_del_docker('grafana')
+local_del_docker('collectd')
index 113be33..dacffce 100644 (file)
@@ -8,75 +8,13 @@
 ##############################################################################
 
 appdirs==1.4.0
-Babel==2.2.0
-backport-ipaddress==0.1
-cliff==2.0.0
-cmd2==0.6.8
-coverage==4.1b2
-debtcollector==1.3.0
-ecdsa==0.13
-extras==0.0.3
-fixtures==1.4.0
+pyopenssl==17.5.0
+python-openstackclient==3.11.0
+python-heatclient==1.11.0
+python-neutronclient==6.1.1
 flake8==2.5.4
-funcsigs==0.4
-functools32==3.2.3.post2
-futures==3.0.5
-iso8601==0.1.11
 Jinja2==2.8
-jsonpatch==1.13
-jsonpointer==1.10
-jsonschema==2.5.1
-keystoneauth1==2.3.0
-linecache2==1.0.0
-lxml==3.5.0
-MarkupSafe==0.23
-mccabe==0.4.0
-mock==1.3.0
-monotonic==1.0
-msgpack-python==0.4.7
-netaddr==0.7.18
-netifaces==0.10.4
 nose==1.3.7
-openstacksdk==0.8.1
-os-client-config==1.16.0
-oslo.config==3.9.0
-oslo.i18n==3.4.0
-oslo.serialization==2.4.0
-oslo.utils==3.7.0
-paramiko==1.16.0
-pbr==1.8.1
-pep8==1.7.0
-positional==1.0.1
-prettytable==0.7.2
-pycrypto==2.6.1
-pyflakes==1.0.0
-pyparsing==2.1.0
-pyrsistent==0.11.12
-python-cinderclient==1.6.0
-python-glanceclient==2.0.0
-python-heatclient==1.0.0
-python-keystoneclient==2.3.1
-python-mimeparse==1.5.1
-python-neutronclient==4.1.1
-python-novaclient==3.3.0
-python-openstackclient==2.2.0
-python-subunit==1.2.0
-python-swiftclient==3.0.0
-pytz==2015.7
-PyYAML==3.11
-requests==2.9.1
-requestsexceptions==1.1.3
-scp==0.10.2
-simplejson==3.8.2
-six==1.10.0
-stevedore==1.12.0
-testrepository==0.0.20
-testtools==2.0.0
-traceback2==1.4.0
-unicodecsv==0.14.1
-unittest2==1.1.0
-warlock==1.2.0
-wrapt==1.10.6
 pyroute2==0.4.10
 elasticsearch==5.0.1
 docker==2.0.2
index 2463edb..3bf18c6 100755 (executable)
@@ -17,12 +17,12 @@ where:
     -h|--help         show the help text
     -s|--teststory    run specific test story
       <test story>        one of the following:
-                              (rubbos, vstf, posca_factor_test)
+                              (posca_factor_test)
                       user can also define their own test story and pass as var to this file,
                       please refer to testsuites/posca/testsuite_story/ for details
     -c|--testcase     run specific test case
       <test case>         one of the following:
-                              (posca_factor_system_bandwidth, posca_factor_ping)
+                              (posca_factor_ping, posca_factor_soak_throughputs, ...)
     --cleanup         cleanup test dockers runing when test is done (false by default)
     --report          push results to DB (false by default)
 
diff --git a/testsuites/posca/testcase_cfg/posca_factor_multistack_storage.yaml b/testsuites/posca/testcase_cfg/posca_factor_multistack_storage.yaml
new file mode 100644 (file)
index 0000000..e2f4843
--- /dev/null
@@ -0,0 +1,35 @@
+##############################################################################
+# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+load_manager:
+  scenarios:
+    tool: fio
+    test_times: 10
+    #this "rw" value could be write read rw rr or randrw
+    rw: 'randrw'
+    bs: '4k'
+    size: '20g'
+    rwmixwrite: '50'
+    num_thread: 1, 2
+    num_stack: 1
+    volume_num: '1'
+    num_jobs: '1'
+    direct: '1'
+    volume_size: 50
+
+  runners:
+    stack_create: yardstick
+    flavor:
+    yardstick_test_dir: "samples"
+    yardstick_testcase: "storage_bottlenecks"
+
+contexts:
+  dashboard: "Bottlenecks-ELK"
+  yardstick: "Bottlenecks-Yardstick"
+  yardstick_envpre: True
diff --git a/testsuites/posca/testcase_cfg/posca_factor_multistack_storage_parallel.yaml b/testsuites/posca/testcase_cfg/posca_factor_multistack_storage_parallel.yaml
new file mode 100644 (file)
index 0000000..b55b826
--- /dev/null
@@ -0,0 +1,33 @@
+##############################################################################
+# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+load_manager:
+  scenarios:
+    tool: fio
+    # for this option we provide " write, read, rw, rr"
+    rw: "randrw"
+    bs: "4k"
+    size: "20g"
+    rwmixwrite: "50"
+    num_stack: 1, 3
+    volume_num: "1"
+    num_jobs: "1"
+    direct: "1"
+    volume_size: 50
+
+  runners:
+    stack_create: yardstick
+    flavor:
+    yardstick_test_dir: "samples"
+    yardstick_testcase: "storage_bottlenecks"
+
+contexts:
+  dashboard: "Bottlenecks-ELK"
+  yardstick: "Bottlenecks-Yardstick"
+  yardstick_envpre: True
index 2565435..ea70e33 100644 (file)
@@ -16,8 +16,8 @@ load_manager:
     tool: ping
     test_times: 100
     package_size:
-    num_stack: 20, 20
-    threshhold: 20
+    num_stack: 5, 5
+    threshhold: 5
     package_loss: 0%
 
   runners:
diff --git a/testsuites/posca/testcase_cfg/posca_factor_soak_throughputs.yaml b/testsuites/posca/testcase_cfg/posca_factor_soak_throughputs.yaml
new file mode 100644 (file)
index 0000000..983b7d7
--- /dev/null
@@ -0,0 +1,35 @@
+##############################################################################
+# Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# Sample config file for life-cycle throuphputs baseline test
+# Each vm pair will have its ttl (time to live) and creation delay
+#   (lazy creation delay) specified.
+# Multiple context are used to specify the host and target VMs.
+
+load_manager:
+  scenarios:
+    tool: netperf
+    test_duration_hours: 0.1
+    vim_pair_ttl: 10
+    vim_pair_lazy_cre_delay: 120
+    package_size:
+    threshhold:
+        package_loss: 0%
+        latency: 300
+
+  runners:
+    stack_create: yardstick
+    flavor:
+    yardstick_test_dir: "samples"
+    yardstick_testcase: "netperf_soak"
+
+contexts:
+  dashboard: "Bottlenecks-ELK"
+  yardstick: "Bottlenecks-Yardstick"
+  yardstick_envpre: True
index d6b325f..bbf65ba 100644 (file)
@@ -11,20 +11,27 @@ load_manager:
   scenarios:
     tool: https request
     # info that the cpus and memes have the same number of data.
+    pdp_name: pdp
+    policy_name: "MLS Policy example"
+    model_name: MLS
     tenants: 1,5,10,20
+    subject_number: 10
+    object_number: 10
+    timeout: 0.2
 
   runners:
     stack_create: yardstick
     Debug: False
     yardstick_test_dir: "samples"
-    yardstick_testcase: "bottlenecks_moon_resources"
-
-  runner_exta:
-    # info this section is for yardstick do some exta env prepare.
-    installation_method: yardstick
-    installation_type: testpmd
+    yardstick_testcase: "moon_resource"
 
 contexts:
   # info that dashboard if have data, we will create the data dashboard.
   dashboard: "Bottlenecks-ELK"
-  yardstick: "Bottlenecks-yardstick"
\ No newline at end of file
+  yardstick: "Bottlenecks-yardstick"
+  moon_monitoring: True
+  moon_environment:
+    ip: "192.168.37.205"
+    user: "root"
+    password: "root"
+    consul_port: 30005
index 3b621a9..7feb6e4 100644 (file)
@@ -11,25 +11,30 @@ load_manager:
   scenarios:
     tool: https request
     # info that the cpus and memes have the same number of data.
-    resources: 20
-    initial: 0
-    threshhold: 5
-    timeout: 30
+    pdp_name: pdp
+    policy_name: "MLS Policy example"
+    model_name: MLS
+    subject_number: 20
+    object_number: 20
+    timeout: 0.003
+    initial_tenants: 0
+    steps_tenants: 1
+    tolerate_time: 20
     SLA: 5
 
-
   runners:
     stack_create: yardstick
     Debug: False
     yardstick_test_dir: "samples"
-    yardstick_testcase: "bottlenecks_moon_tenants"
-
-  runner_exta:
-    # info this section is for yardstick do some exta env prepare.
-    installation_method: yardstick
-    installation_type: testpmd
+    yardstick_testcase: "moon_tenant"
 
 contexts:
   # info that dashboard if have data, we will create the data dashboard.
   dashboard: "Bottlenecks-ELK"
-  yardstick: "Bottlenecks-yardstick"
\ No newline at end of file
+  yardstick: "Bottlenecks-yardstick"
+  moon_monitoring: True
+  moon_environment:
+    ip: "192.168.37.205"
+    user: "root"
+    password: "root"
+    consul_port: 30005
diff --git a/testsuites/posca/testcase_dashboard/posca_feature_moon.py b/testsuites/posca/testcase_dashboard/posca_feature_moon.py
new file mode 100644 (file)
index 0000000..6819ea8
--- /dev/null
@@ -0,0 +1,121 @@
+#!/usr/bin/python
+##############################################################################
+# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''This file realize a function of creating dashboard of stress ping test'''
+import ConfigParser
+from elasticsearch import Elasticsearch
+import json
+import os
+import utils.logger as log
+from utils.parser import Parser as conf_parser
+
+LOG = log.Logger(__name__).getLogger()
+config = ConfigParser.ConfigParser()
+es = Elasticsearch()
+dashboard_path = os.path.join(conf_parser.test_dir,
+                              "posca",
+                              "testcase_dashboard")
+dashboard_dir = dashboard_path + "/"
+
+
+def dashboard_send_data(runner_config, test_data):
+    global es
+    print runner_config
+    es_ip = runner_config['dashboard_ip'].split(':')
+    es = Elasticsearch([{'host': es_ip[0]}])
+    print test_data["test_body"]
+    res = es.index(index="bottlenecks",
+                   doc_type=test_data["testcase"],
+                   body=test_data["test_body"][0])
+    if res['created'] == "False":
+        LOG.error("date send to kibana have errors ", test_data["data_body"])
+
+
+def posca_moon_init(runner_config):
+    global es
+    es_ip = runner_config['dashboard_ip'].split(':')
+    es = Elasticsearch([{'host': es_ip[0]}])
+    # Create bottlenecks index
+    with open(dashboard_dir + 'posca_feature_moon_index_pattern.json')\
+            as index_pattern:
+        doc = json.load(index_pattern)
+    res = es.index(
+        index=".kibana",
+        doc_type="index-pattern",
+        id="bottlenecks",
+        body=doc)
+    if res['created'] == "True":
+        LOG.info("bottlenecks index-pattern has created")
+    else:
+        LOG.info("bottlenecks index-pattern has existed")
+
+    with open(dashboard_dir + 'posca_system_bandwidth_config.json')\
+            as index_config:
+        doc = json.load(index_config)
+    res = es.index(index=".kibana", doc_type="config", id="4.6.1", body=doc)
+    if res['created'] == "True":
+        LOG.info("bottlenecks config has created")
+    else:
+        LOG.info("bottlenecks config has existed")
+
+    # Configure discover panel
+    with open(dashboard_dir + 'posca_feature_moon_discover.json')\
+            as index_discover:
+        doc = json.load(index_discover)
+    res = es.index(
+        index=".kibana",
+        doc_type="search",
+        id="moon",
+        body=doc)
+    if res['created'] == "True":
+        LOG.info("moon testcase search has created")
+    else:
+        LOG.info("moon testcase search has existed")
+
+    # Create testing data in line graph
+    with open(dashboard_dir + 'posca_feature_moon_resources_histogram.json')\
+            as line_data:
+        doc = json.load(line_data)
+    res = es.index(
+        index=".kibana",
+        doc_type="visualization",
+        id="resources",
+        body=doc)
+    if res['created'] == "True":
+        LOG.info("moon resources visualization has created")
+    else:
+        LOG.info("moon resources visualization has existed")
+
+    # Create comparison results in line chart
+    with open(dashboard_dir + 'posca_feature_moon_tenants_histogram.json')\
+            as line_char:
+        doc = json.load(line_char)
+    res = es.index(
+        index=".kibana",
+        doc_type="visualization",
+        id="tenants",
+        body=doc)
+    if res['created'] == "True":
+        LOG.info("moon tenants visualization has created")
+    else:
+        LOG.info("moon tenants visualization has existed")
+
+    # Create dashboard
+    with open(dashboard_dir + 'posca_feature_moon_dashboard.json')\
+            as dashboard:
+        doc = json.load(dashboard)
+    res = es.index(
+        index=".kibana",
+        doc_type="dashboard",
+        id="moon",
+        body=doc)
+    if res['created'] == "True":
+        LOG.info("moon testcases dashboard has created")
+    else:
+        LOG.info("moon testcases dashboard has existed")
diff --git a/testsuites/posca/testcase_dashboard/posca_feature_moon_dashboard.json b/testsuites/posca/testcase_dashboard/posca_feature_moon_dashboard.json
new file mode 100644 (file)
index 0000000..53a4a75
--- /dev/null
@@ -0,0 +1,13 @@
+{
+    "title": "moon",
+    "hits": 0,
+    "description": "",
+    "panelsJSON": "[{\"id\":\"resources\",\"type\":\"visualization\",\"panelIndex\":1,\"size_x\":8,\"size_y\":7,\"col\":1,\"row\":1},{\"id\":\"tenants\",\"type\":\"visualization\",\"panelIndex\":2,\"size_x\":3,\"size_y\":7,\"col\":9,\"row\":1}]",
+    "optionsJSON": "{\"darkTheme\":false}",
+    "uiStateJSON": "{}",
+    "version": 1,
+    "timeRestore": false,
+    "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"filter\":[{\"query\":{\"query_string\":{\"query\":\"*\",\"analyze_wildcard\":true}}}]}"
+    }
+}
\ No newline at end of file
diff --git a/testsuites/posca/testcase_dashboard/posca_feature_moon_index_pattern.json b/testsuites/posca/testcase_dashboard/posca_feature_moon_index_pattern.json
new file mode 100644 (file)
index 0000000..2bff871
--- /dev/null
@@ -0,0 +1,4 @@
+{
+    "title": "bottlenecks",
+    "fields": "[{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"tenant_max\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"max_user\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"tenant_number\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":true,\"analyzed\":false,\"doc_values\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"indexed\":false,\"analyzed\":false,\"doc_values\":false}]"
+}
\ No newline at end of file
diff --git a/testsuites/posca/testcase_dashboard/posca_feature_moon_resources_histogram.json b/testsuites/posca/testcase_dashboard/posca_feature_moon_resources_histogram.json
new file mode 100644 (file)
index 0000000..c8977a7
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "title": "resources",
+    "visState": "{\"title\":\"New Visualization\",\"type\":\"histogram\",\"params\":{\"shareYAxis\":true,\"addTooltip\":true,\"addLegend\":true,\"scale\":\"linear\",\"mode\":\"stacked\",\"times\":[],\"addTimeMarker\":false,\"defaultYExtents\":false,\"setYExtents\":false,\"yAxis\":{}},\"aggs\":[{\"id\":\"1\",\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"max_user\"}},{\"id\":\"2\",\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"tenant_number\",\"size\":5,\"order\":\"asc\",\"orderBy\":\"_term\"}}],\"listeners\":{}}",
+    "uiStateJSON": "{}",
+    "description": "",
+    "savedSearchId": "moon",
+    "version": 1,
+    "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"filter\":[]}"
+    }
+}
\ No newline at end of file
diff --git a/testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_discover.json b/testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_discover.json
new file mode 100644 (file)
index 0000000..03360f8
--- /dev/null
@@ -0,0 +1,23 @@
+{
+    "_index": ".kibana",
+    "_type": "search",
+    "_id": "tenants",
+    "_version": 1,
+    "found": true,
+    "_source": {
+        "title": "tenants",
+        "description": "",
+        "hits": 0,
+        "columns": [
+            "_source"
+        ],
+        "sort": [
+            "_score",
+            "desc"
+        ],
+        "version": 1,
+        "kibanaSavedObjectMeta": {
+            "searchSourceJSON": "{\"index\":\"bottlenecks\",\"filter\":[],\"highlight\":{\"pre_tags\":[\"@kibana-highlighted-field@\"],\"post_tags\":[\"@/kibana-highlighted-field@\"],\"fields\":{\"*\":{}},\"require_field_match\":false,\"fragment_size\":2147483647},\"query\":{\"query_string\":{\"query\":\"_type:posca_factor_moon_tenants\",\"analyze_wildcard\":true}}}"
+        }
+    }
+}
\ No newline at end of file
diff --git a/testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_histogram.json b/testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_histogram.json
new file mode 100644 (file)
index 0000000..a731acf
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "title": "tenants",
+    "visState": "{\"title\":\"New Visualization\",\"type\":\"histogram\",\"params\":{\"shareYAxis\":true,\"addTooltip\":true,\"addLegend\":true,\"scale\":\"linear\",\"mode\":\"stacked\",\"times\":[],\"addTimeMarker\":false,\"defaultYExtents\":false,\"setYExtents\":false,\"yAxis\":{}},\"aggs\":[{\"id\":\"1\",\"type\":\"sum\",\"schema\":\"metric\",\"params\":{\"field\":\"tenant_max\"}}],\"listeners\":{}}",
+    "uiStateJSON": "{}",
+    "description": "",
+    "savedSearchId": "moon",
+    "version": 1,
+    "kibanaSavedObjectMeta": {
+        "searchSourceJSON": "{\"filter\":[]}"
+    }
+}
\ No newline at end of file
diff --git a/testsuites/posca/testcase_dashboard/posca_moon_resources.py b/testsuites/posca/testcase_dashboard/posca_moon_resources.py
new file mode 100644 (file)
index 0000000..446facc
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+##############################################################################
+# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''This file realize a function of creating dashboard of stress ping test'''
+import ConfigParser
+from elasticsearch import Elasticsearch
+import os
+import utils.logger as log
+from utils.parser import Parser as conf_parser
+
+LOG = log.Logger(__name__).getLogger()
+config = ConfigParser.ConfigParser()
+es = Elasticsearch()
+dashboard_path = os.path.join(conf_parser.test_dir,
+                              "posca",
+                              "testcase_dashboard")
+dashboard_dir = dashboard_path + "/"
+
+
+def dashboard_send_data(runner_config, test_data):
+    global es
+    print runner_config
+    es_ip = runner_config['dashboard_ip'].split(':')
+    es = Elasticsearch([{'host': es_ip[0]}])
+    print test_data["test_body"]
+    res = es.index(index="bottlenecks",
+                   doc_type=test_data["testcase"],
+                   body=test_data["test_body"][0])
+    if res['created'] == "False":
+        LOG.error("date send to kibana have errors ", test_data["data_body"])
diff --git a/testsuites/posca/testcase_dashboard/posca_moon_tenants.py b/testsuites/posca/testcase_dashboard/posca_moon_tenants.py
new file mode 100644 (file)
index 0000000..446facc
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+##############################################################################
+# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''This file realize a function of creating dashboard of stress ping test'''
+import ConfigParser
+from elasticsearch import Elasticsearch
+import os
+import utils.logger as log
+from utils.parser import Parser as conf_parser
+
+LOG = log.Logger(__name__).getLogger()
+config = ConfigParser.ConfigParser()
+es = Elasticsearch()
+dashboard_path = os.path.join(conf_parser.test_dir,
+                              "posca",
+                              "testcase_dashboard")
+dashboard_dir = dashboard_path + "/"
+
+
+def dashboard_send_data(runner_config, test_data):
+    global es
+    print runner_config
+    es_ip = runner_config['dashboard_ip'].split(':')
+    es = Elasticsearch([{'host': es_ip[0]}])
+    print test_data["test_body"]
+    res = es.index(index="bottlenecks",
+                   doc_type=test_data["testcase"],
+                   body=test_data["test_body"][0])
+    if res['created'] == "False":
+        LOG.error("date send to kibana have errors ", test_data["data_body"])
diff --git a/testsuites/posca/testcase_script/posca_factor_multistack_storage.py b/testsuites/posca/testcase_script/posca_factor_multistack_storage.py
new file mode 100644 (file)
index 0000000..34ee225
--- /dev/null
@@ -0,0 +1,236 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''This file realize the function of run posca multistack storage stress test
+This file contain several part:
+First is create a script to realize several threading run'''
+
+import utils.logger as log
+import uuid
+import json
+import os
+import time
+import threading
+import datetime
+import Queue
+from utils.parser import Parser as conf_parser
+import utils.env_prepare.quota_prepare as quota_prepare
+import utils.env_prepare.stack_prepare as stack_prepare
+import utils.infra_setup.runner.yardstick as yardstick_task
+
+import utils.infra_setup.runner.docker_env as docker_env
+
+# --------------------------------------------------
+# logging configuration
+# --------------------------------------------------
+LOG = log.Logger(__name__).getLogger()
+
+test_dict = {
+    "action": "runTestCase",
+    "args": {
+        "opts": {
+            "task-args": {}
+        },
+        "testcase": "multistack_storage_bottlenecks"
+    }
+}
+testfile = os.path.basename(__file__)
+testcase, file_format = os.path.splitext(testfile)
+cidr = "/home/opnfv/repos/yardstick/samples/storage_bottlenecks.yaml"
+runner_DEBUG = True
+q = Queue.Queue()
+final_result = Queue.Queue()
+
+
+def env_pre(test_config):
+    test_yardstick = False
+    if "yardstick" in test_config["contexts"].keys():
+        test_yardstick = True
+    stack_prepare._prepare_env_daemon(test_yardstick)
+    quota_prepare.quota_env_prepare()
+    LOG.info("yardstick environment prepare!")
+    if(test_config["contexts"]['yardstick_envpre']):
+        stdout = yardstick_task.yardstick_image_prepare()
+        LOG.debug(stdout)
+
+
+def testcase_parser(out_file="yardstick.out", **parameter_info):
+    cmd = yardstick_task.yardstick_command_parser(debug=runner_DEBUG,
+                                                  cidr=cidr,
+                                                  outfile=out_file,
+                                                  parameter=parameter_info)
+    return cmd
+
+
+def do_test(test_config):
+    out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
+    yardstick_container = docker_env.yardstick_info['container']
+    cmd = testcase_parser(out_file=out_file, **test_config)
+    print(cmd)
+    stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
+    LOG.info(stdout)
+    loop_value = 0
+    while loop_value < 60:
+        time.sleep(2)
+        loop_value = loop_value + 1
+        with open(out_file) as f:
+            data = json.load(f)
+            if data["result"]["criteria"] == "PASS":
+                LOG.info("yardstick run success")
+                LOG.info("%s" % data["result"]["testcases"])
+                break
+            else:
+                LOG.error("yardstick error exit")
+                break
+
+    save_data = final_config_to_result(test_config, data)
+    return save_data
+
+
+def config_to_result(num, out_num, during_date):
+    testdata = {}
+    test_result = {}
+    final_data = {}
+
+    final_data["read_iops"] = 0
+    final_data["read_bw"] = 0
+    final_data["read_lat"] = 0
+    final_data["write_iops"] = 0
+    final_data["write_bw"] = 0
+    final_data["write_lat"] = 0
+
+    test_result["number_of_stacks"] = float(num)
+    test_result["success_times"] = out_num
+    test_result["success_rate"] = out_num / num
+    test_result["duration_time"] = during_date
+    testdata["data_body"] = test_result
+    testdata["testcase"] = testcase
+
+    while not final_result.empty():
+        data = final_result.get()
+        final_data["read_iops"] += data["read_iops"]
+        final_data["read_bw"] += data["read_bw"]
+        if final_data["read_lat"] is 0:
+            final_data["read_lat"] = data["read_lat"]
+        else:
+            final_data["read_lat"] += data["read_lat"]
+            final_data["read_lat"] = final_data["read_lat"]/2
+        final_data["write_iops"] += data["write_iops"]
+        final_data["write_bw"] += data["read_iops"]
+        if final_data["write_lat"] is 0:
+            final_data["write_lat"] = data["write_lat"]
+        else:
+            final_data["write_lat"] += data["write_lat"]
+            final_data["write_lat"] = final_data["write_lat"]/2
+
+    testdata["test_value"] = final_data
+    LOG.info("Final testdata is %s" % testdata)
+    return testdata
+
+
+def final_config_to_result(test_config, test_result):
+    out_data = test_result["result"]["testcases"]
+    test_data = out_data["storage_bottlenecks"]["tc_data"]
+    testdata = {}
+    testdata["read_iops"] = 0
+    testdata["read_bw"] = 0
+    testdata["read_lat"] = 0
+    testdata["write_iops"] = 0
+    testdata["write_bw"] = 0
+    testdata["write_lat"] = 0
+    print(testdata["read_iops"])
+    for result in test_data:
+        testdata["read_iops"] += result["data"]["read_iops"]
+        testdata["read_bw"] += result["data"]["read_bw"]
+        if testdata["read_lat"] is 0:
+            testdata["read_lat"] = result["data"]["read_lat"]
+        else:
+            testdata["read_lat"] += result["data"]["read_lat"]
+            testdata["read_lat"] = testdata["read_lat"]/2
+        testdata["write_iops"] += result["data"]["write_iops"]
+        testdata["write_bw"] += result["data"]["write_bw"]
+        if testdata["write_lat"] is 0:
+            testdata["write_lat"] = result["data"]["write_lat"]
+        else:
+            testdata["write_lat"] += result["data"]["write_lat"]
+            testdata["write_lat"] = testdata["write_lat"]/2
+    final_result.put(testdata)
+    q.put(1)
+    return testdata
+
+
+def func_run(con_dic):
+    test_date = do_test(con_dic)
+    return test_date
+
+
+def run(test_config):
+    con_dic = test_config["load_manager"]
+    scenarios_conf = con_dic["scenarios"]
+
+    if test_config["contexts"]["yardstick_ip"] is None:
+        con_dic["contexts"]["yardstick_ip"] =\
+            conf_parser.ip_parser("yardstick_test_ip")
+
+    env_pre(test_config)
+    LOG.info("yardstick environment prepare done!")
+
+    stack_num = scenarios_conf["num_stack"]
+    test_num = conf_parser.str_to_list(scenarios_conf["num_thread"])
+    rw = scenarios_conf["rw"]
+    bs = scenarios_conf["bs"]
+    size = scenarios_conf["size"]
+    rwmixwrite = scenarios_conf["rwmixwrite"]
+    numjobs = scenarios_conf["num_jobs"]
+    direct = scenarios_conf["direct"]
+    volume_num = scenarios_conf["volume_num"]
+    volume_size = scenarios_conf["volume_size"]
+
+    for value in test_num:
+        result = []
+        out_num = 0
+        num = int(value)
+        # pool = multiprocessing.Pool(processes=num)
+        threadings = []
+        LOG.info("begin to run %s thread" % num)
+
+        starttime = datetime.datetime.now()
+
+        for i in xrange(0, num):
+            case_config = {"stack_num": int(stack_num),
+                           "volume_num": volume_num,
+                           "rw": rw,
+                           "bs": bs,
+                           "size": size,
+                           "rwmixwrite": rwmixwrite,
+                           "numjobs": numjobs,
+                           "direct": direct,
+                           "volume_size": int(volume_size)}
+            tmp_thread = threading.Thread(target=func_run, args=(case_config,))
+            threadings.append(tmp_thread)
+            tmp_thread.start()
+
+        for one_thread in threadings:
+            one_thread.join()
+        while not q.empty():
+            result.append(q.get())
+        for item in result:
+            out_num = out_num + float(item)
+
+        print(result)
+
+        endtime = datetime.datetime.now()
+        LOG.info("%s thread success %d times" % (num, out_num))
+        during_date = (endtime - starttime).seconds
+
+        data_reply = config_to_result(num, out_num, during_date)
+        conf_parser.result_to_file(data_reply, test_config["out_file"])
+
+    LOG.info('END POSCA stress multistack storage test')
+    return data_reply
diff --git a/testsuites/posca/testcase_script/posca_factor_multistack_storage_parallel.py b/testsuites/posca/testcase_script/posca_factor_multistack_storage_parallel.py
new file mode 100644 (file)
index 0000000..8c623d4
--- /dev/null
@@ -0,0 +1,164 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''This file realize the function of run posca multistack storage stress test
+This file contain several part:
+First is create a script to realize several threading run'''
+
+import utils.logger as log
+import uuid
+import json
+import os
+import time
+from utils.parser import Parser as conf_parser
+import utils.env_prepare.quota_prepare as quota_prepare
+import utils.env_prepare.stack_prepare as stack_prepare
+import utils.infra_setup.runner.yardstick as yardstick_task
+
+import utils.infra_setup.runner.docker_env as docker_env
+
+# --------------------------------------------------
+# logging configuration
+# --------------------------------------------------
+LOG = log.Logger(__name__).getLogger()
+
+test_dict = {
+    "action": "runTestCase",
+    "args": {
+        "opts": {
+            "task-args": {}
+        },
+        "testcase": "multistack_storage_bottlenecks_parallel"
+    }
+}
+testfile = os.path.basename(__file__)
+testcase, file_format = os.path.splitext(testfile)
+cidr = "/home/opnfv/repos/yardstick/samples/storage_bottlenecks.yaml"
+runner_DEBUG = True
+
+
+def env_pre(test_config):
+    test_yardstick = False
+    if "yardstick" in test_config["contexts"].keys():
+        test_yardstick = True
+    stack_prepare._prepare_env_daemon(test_yardstick)
+    quota_prepare.quota_env_prepare()
+    if(test_config["contexts"]['yardstick_envpre']):
+        LOG.info("yardstick environment prepare!")
+        stdout = yardstick_task.yardstick_image_prepare()
+        LOG.debug(stdout)
+
+
+def testcase_parser(out_file="yardstick.out", **parameter_info):
+    cmd = yardstick_task.yardstick_command_parser(debug=runner_DEBUG,
+                                                  cidr=cidr,
+                                                  outfile=out_file,
+                                                  parameter=parameter_info)
+    return cmd
+
+
+def do_test(test_config):
+    out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
+    yardstick_container = docker_env.yardstick_info['container']
+    cmd = testcase_parser(out_file=out_file, **test_config)
+    print(cmd)
+    stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
+    LOG.info(stdout)
+    loop_value = 0
+    while loop_value < 60:
+        time.sleep(2)
+        loop_value = loop_value + 1
+        with open(out_file) as f:
+            data = json.load(f)
+            if data["result"]["criteria"] == "PASS":
+                LOG.info("yardstick run success")
+                LOG.info("%s" % data["result"]["testcases"])
+                break
+            else:
+                LOG.error("yardstick error exit")
+                break
+
+    save_data = config_to_result(test_config, data)
+    LOG.info(save_data)
+    return save_data
+
+
+def config_to_result(test_config, test_result):
+    print(test_result)
+    out_data = test_result["result"]["testcases"]
+    test_data = out_data["storage_bottlenecks"]["tc_data"]
+    testdata = {}
+    testdata["read_iops"] = 0
+    testdata["read_bw"] = 0
+    testdata["read_lat"] = 0
+    testdata["write_iops"] = 0
+    testdata["write_bw"] = 0
+    testdata["write_lat"] = 0
+    print(testdata["read_iops"])
+    for result in test_data:
+        testdata["read_iops"] += result["data"]["read_iops"]
+        testdata["read_bw"] += result["data"]["read_bw"]
+        if testdata["read_lat"] is 0:
+            testdata["read_lat"] = result["data"]["read_lat"]
+        else:
+            testdata["read_lat"] += result["data"]["read_lat"]
+            testdata["read_lat"] = testdata["read_lat"]/2
+        testdata["write_iops"] += result["data"]["write_iops"]
+        testdata["write_bw"] += result["data"]["write_bw"]
+        if testdata["write_lat"] is 0:
+            testdata["write_lat"] = result["data"]["write_lat"]
+        else:
+            testdata["write_lat"] += result["data"]["write_lat"]
+            testdata["write_lat"] = testdata["write_lat"]/2
+    return testdata
+
+
+def run(test_config):
+    con_dic = test_config["load_manager"]
+    scenarios_conf = con_dic["scenarios"]
+
+    if test_config["contexts"]["yardstick_ip"] is None:
+        con_dic["contexts"]["yardstick_ip"] =\
+            conf_parser.ip_parser("yardstick_test_ip")
+
+    env_pre(test_config)
+    LOG.info("yardstick environment prepare done!")
+
+    test_num = conf_parser.str_to_list(scenarios_conf["num_stack"])
+    rw = scenarios_conf["rw"]
+    bs = scenarios_conf["bs"]
+    size = scenarios_conf["size"]
+    rwmixwrite = scenarios_conf["rwmixwrite"]
+    numjobs = scenarios_conf["num_jobs"]
+    direct = scenarios_conf["direct"]
+    volume_num = scenarios_conf["volume_num"]
+    volume_size = scenarios_conf["volume_size"]
+
+    result = []
+
+    for value in test_num:
+        case_config = {"stack_num": int(value),
+                       "volume_num": volume_num,
+                       "rw": rw,
+                       "bs": bs,
+                       "size": size,
+                       "rwmixwrite": rwmixwrite,
+                       "numjobs": numjobs,
+                       "direct": direct,
+                       "volume_size": int(volume_size)}
+        data_reply = do_test(case_config)
+        result.append(data_reply)
+
+        LOG.info("%s stack successful run" % (value))
+
+        conf_parser.result_to_file(data_reply, test_config["out_file"])
+
+    LOG.info('END POSCA stress multistack storage parallel testcase')
+    LOG.info("The result data is %s", result)
+    return result
index 3a2277c..4ee4396 100644 (file)
@@ -23,6 +23,7 @@ import Queue
 from utils.parser import Parser as conf_parser
 import utils.env_prepare.quota_prepare as quota_prepare
 import utils.env_prepare.stack_prepare as stack_prepare
+import utils.infra_setup.runner.yardstick as runner_yardstick
 
 import testsuites.posca.testcase_dashboard.posca_stress_ping as DashBoard
 import utils.infra_setup.runner.docker_env as docker_env
@@ -42,6 +43,8 @@ test_dict = {
 }
 testfile = os.path.basename(__file__)
 testcase, file_format = os.path.splitext(testfile)
+cidr = "/home/opnfv/repos/yardstick/samples/ping_bottlenecks.yaml"
+runner_DEBUG = True
 
 q = Queue.Queue()
 
@@ -52,20 +55,21 @@ def env_pre(test_config):
         test_yardstick = True
     stack_prepare._prepare_env_daemon(test_yardstick)
     quota_prepare.quota_env_prepare()
-    cmd = ('yardstick env prepare')
     LOG.info("yardstick environment prepare!")
     if(test_config["contexts"]['yardstick_envpre']):
-        yardstick_container = docker_env.yardstick_info['container']
-        stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
+        stdout = runner_yardstick.yardstick_image_prepare()
         LOG.debug(stdout)
 
 
 def do_test():
     func_name = sys._getframe().f_code.co_name
     out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
+    parameter_info = {}
     yardstick_container = docker_env.yardstick_info['container']
-    cmd = ('yardstick task start /home/opnfv/repos/yardstick/'
-           'samples/ping_bottlenecks.yaml --output-file ' + out_file)
+    cmd = runner_yardstick.yardstick_command_parser(debug=runner_DEBUG,
+                                                    cidr=cidr,
+                                                    outfile=out_file,
+                                                    parameter=parameter_info)
     stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
     LOG.info(stdout)
     out_value = 0
@@ -75,11 +79,11 @@ def do_test():
         loop_value = loop_value + 1
         with open(out_file) as f:
             data = json.load(f)
-            if data["status"] == 1:
+            if data["result"]["criteria"] == "PASS":
                 LOG.info("yardstick run success")
                 out_value = 1
                 break
-            elif data["status"] == 2:
+            else:
                 LOG.error("yardstick error exit")
                 out_value = 0
                 break
diff --git a/testsuites/posca/testcase_script/posca_factor_soak_throughputs.py b/testsuites/posca/testcase_script/posca_factor_soak_throughputs.py
new file mode 100644 (file)
index 0000000..2fd3500
--- /dev/null
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+'''This file is to do data-plane baseline test for
+VM pair life-cycle events using netperf.
+Testing steps are summarized below:
+1. run_test load testcase configuration
+2. Bottlenecks eliminates the environments limits/constraints
+3. Bottlenecks tells Yardstick to prepare environment
+4. Bottlenecks tells Yardstick to run test
+   3.1 to create stack
+   3.2 to install netperf
+   3.3 to send/forward packets for t2 seconds
+   3.4 record results and detroy stack
+   3.4 after every t1 seconds goto 3.1 and repeat the workflow
+5. Bottlenecks collects testing results from Yardstick
+6. Bottlenecks tells Yardstick to stop when time ends
+   or system fails the test
+7. Bottlenecks sends testing data to bottlenecks-elk'''
+
+import utils.logger as log
+import uuid
+import json
+import os
+import time
+import threading
+import datetime
+import Queue
+from utils.parser import Parser as conf_parser
+import utils.env_prepare.quota_prepare as quota_prepare
+import utils.env_prepare.stack_prepare as stack_prepare
+import utils.infra_setup.runner.yardstick as runner_yardstick
+import utils.infra_setup.runner.docker_env as docker_env
+import math
+
+# --------------------------------------------------
+# logging configuration
+# --------------------------------------------------
+LOG = log.Logger(__name__).getLogger()
+
+test_dict = {
+    "action": "runTestCase",
+    "args": {
+        "opts": {
+            "task-args": {}
+        },
+        "testcase": "netperf_bottlenecks"
+    }
+}
+testfile = os.path.basename(__file__)
+testcase, file_format = os.path.splitext(testfile)
+cidr = "/home/opnfv/repos/yardstick/samples/netperf_soak.yaml"
+runner_DEBUG = True
+
+q = Queue.Queue()
+
+
+def env_pre(test_config):
+    test_yardstick = False
+    if "yardstick" in test_config["contexts"].keys():
+        test_yardstick = True
+    stack_prepare._prepare_env_daemon(test_yardstick)
+    quota_prepare.quota_env_prepare()
+    LOG.info("yardstick environment prepare!")
+    if(test_config["contexts"]['yardstick_envpre']):
+        stdout = runner_yardstick.yardstick_image_prepare()
+        LOG.debug(stdout)
+
+
+def do_test(con_dic):
+    out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
+    parameter_info = dict(test_time=con_dic["scenarios"]["vim_pair_ttl"])
+    yardstick_container = docker_env.yardstick_info['container']
+    cmd = runner_yardstick.yardstick_command_parser(debug=runner_DEBUG,
+                                                    cidr=cidr,
+                                                    outfile=out_file,
+                                                    parameter=parameter_info)
+    stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
+    LOG.info(stdout)
+    out_value = 0
+    loop_value = 0
+    while loop_value < 60:
+        time.sleep(2)
+        loop_value = loop_value + 1
+        with open(out_file) as f:
+            data = json.load(f)
+            if data["result"]["criteria"] == "PASS":
+                LOG.info("Success run yardstick netperf_soak test!")
+                out_value = 1
+                break
+            elif data["result"]["criteria"] == "FAIL":
+                LOG.error("Failed run yardstick netperf_soak test!")
+                out_value = 0
+                break
+    q.put((out_value, data["result"]["testcases"]))
+    return out_value
+
+
+def config_to_result(
+        test_duration, added_duration, vim_pair_ttl,
+        vim_pair_lazy_cre_delay,
+        vim_pair_num, vim_pair_success_num, result):
+    testdata = {}
+    test_result = {}
+    test_result["test_duration"] = test_duration
+    test_result["sum_duration"] = added_duration
+    test_result["vim_pair_ttl"] = vim_pair_ttl
+    test_result["vim_pair_cre_interval"] = vim_pair_lazy_cre_delay
+    test_result["vim_pair_num"] = vim_pair_num
+    test_result["vim_pair_success_num"] = vim_pair_success_num
+    test_result["result"] = result
+    testdata["data_body"] = test_result
+    testdata["testcase"] = testcase
+    return testdata
+
+
+def func_run(con_dic):
+    test_date = do_test(con_dic)
+    return test_date
+
+
+def run(test_config):
+    con_dic = test_config["load_manager"]
+
+    env_pre(test_config)
+    LOG.info("yardstick environment prepare done!")
+
+    test_duration = float(
+        con_dic["scenarios"]["test_duration_hours"]) * 3600
+    vim_pair_ttl = float(
+        con_dic["scenarios"]["vim_pair_ttl"])
+    vim_pair_lazy_cre_delay = float(
+        con_dic["scenarios"]["vim_pair_lazy_cre_delay"])
+    vim_pair_num = int(math.ceil(
+        (test_duration - vim_pair_ttl) / vim_pair_lazy_cre_delay
+    ) + 1)
+
+    threadings = []
+    result = []
+    vim_pair_success_num = 0
+
+    start_time = datetime.datetime.now()
+
+    LOG.info("Data-path test duration are %i seconds", test_duration)
+    LOG.info("TTL of each VM pair are %i seconds", vim_pair_ttl)
+    LOG.info("Creation delay between VM pairs are %i seconds",
+             vim_pair_lazy_cre_delay)
+    LOG.info("Number of VM pairs to be created are %i", vim_pair_num)
+
+    for vim_pair_index in xrange(0, vim_pair_num):
+        index_thread = threading.Thread(target=func_run,
+                                        args=(con_dic,))
+        threadings.append(index_thread)
+        index_thread.start()
+        vim_pair_error = False
+        for wait_time in xrange(0, int(vim_pair_lazy_cre_delay)):
+            time.sleep(1)
+            while not q.empty():
+                result.append(q.get())
+            for one_result in result:
+                if '0' == one_result[0]:
+                    vim_pair_error = True
+                break
+        if vim_pair_error:
+            break
+    for one_thread in threadings:
+        one_thread.join()
+    while not q.empty():
+            result.append(q.get())
+    for item in result:
+        vim_pair_success_num += int(item[0])
+
+    end_time = datetime.datetime.now()
+    added_duration = (end_time - start_time).seconds
+    LOG.info("Number of success VM pairs/threads are %s out %s ",
+             vim_pair_success_num, vim_pair_num)
+
+    return_result = config_to_result(
+        test_duration, added_duration, vim_pair_ttl,
+        vim_pair_lazy_cre_delay,
+        vim_pair_num, vim_pair_success_num, result
+    )
+
+    conf_parser.result_to_file(return_result, test_config["out_file"])
+
+    return vim_pair_error
index 1a54554..9d8b0ec 100644 (file)
@@ -79,10 +79,10 @@ def do_test(test_config, Use_Dashboard, context_conf):
         with open(out_file) as f:
             data = json.load(f)
             if data["status"] == 1:
-                LOG.info("yardstick run success")
+                LOG.info("Success run yardstick netperf_bottlenecks test!")
                 break
             elif data["status"] == 2:
-                LOG.error("yardstick error exit")
+                LOG.error("Failed to run yardstick netperf_bottlenecks test!")
                 exit()
 
     save_data = config_to_result(test_config, data['result'][1])
index 3c66c7b..8b23824 100644 (file)
@@ -18,8 +18,9 @@ import uuid
 import json
 import utils.logger as log
 from utils.parser import Parser as conf_parser
-import utils.env_prepare.stack_prepare as stack_prepare
+import utils.env_prepare.moon_prepare as moon_env
 import utils.infra_setup.runner.docker_env as docker_env
+import testsuites.posca.testcase_dashboard.posca_feature_moon as DashBoard
 import utils.infra_setup.runner.yardstick as yardstick_task
 
 # --------------------------------------------------
@@ -29,35 +30,35 @@ LOG = log.Logger(__name__).getLogger()
 
 testfile = os.path.basename(__file__)
 testcase, file_format = os.path.splitext(testfile)
-# cidr = "/home/opnfv/repos/yardstick/samples/pvp_throughput_bottlenecks.yaml"
 runner_DEBUG = True
 
 
-def env_pre(con_dic):
-    LOG.info("yardstick environment prepare!")
-    stack_prepare._prepare_env_daemon(True)
+def env_pre(test_config):
+    if "moon_monitoring" in test_config["contexts"].keys():
+        if test_config["contexts"]['moon_envpre'] is True:
+            moon_environment = test_config["contexts"]['moon_environment']
+            moon_env.moon_envprepare(moon_environment)
+    LOG.info("moon environment prepare!")
 
 
 def config_to_result(test_config, test_result):
-    final_data = []
-    print(test_result)
+    final_data = {}
+    final_data["testcase"] = "posca_factor_moon_resources"
+    final_data["test_body"] = []
     out_data = test_result["result"]["testcases"]
-    test_data = out_data["pvp_throughput_bottlenecks"]["tc_data"]
+    test_data = out_data["moon_resource"]["tc_data"]
     for result in test_data:
         testdata = {}
-        testdata["vcpu"] = test_config["vcpu"]
-        testdata["memory"] = test_config["memory"]
-        testdata["nrFlows"] = result["data"]["nrFlows"]
-        testdata["packet_size"] = result["data"]["packet_size"]
-        testdata["throughput"] = result["data"]["throughput_rx_mbps"]
-        final_data.append(testdata)
+        testdata["tenant_number"] = int(test_config["tenant_number"])
+        testdata["max_user"] = result["data"]["max_user"]
+        final_data["test_body"].append(testdata)
     return final_data
 
 
 def testcase_parser(runner_conf, out_file="yardstick.out", **parameter_info):
     cidr = "/home/opnfv/repos/yardstick/" + \
-           runner_conf["yardstick_test_dir"] + \
-           runner_conf["yardstick_testcase"]
+           runner_conf["yardstick_test_dir"] + "/" + \
+           runner_conf["yardstick_testcase"] + ".yaml"
     cmd = yardstick_task.yardstick_command_parser(debug=runner_DEBUG,
                                                   cidr=cidr,
                                                   outfile=out_file,
@@ -84,24 +85,21 @@ def do_test(runner_conf, test_config, Use_Dashboard, context_conf):
             elif data["status"] == 2:
                 LOG.error("yardstick error exit")
                 exit()
-    # data = json.load(output)
 
     save_data = config_to_result(test_config, data)
     if Use_Dashboard is True:
         print("use dashboard")
-        # DashBoard.dashboard_send_data(context_conf, save_data)
-
-    # return save_data["data_body"]
+        DashBoard.dashboard_send_data(context_conf, save_data)
     return save_data
 
 
 def run(test_config):
     load_config = test_config["load_manager"]
     scenarios_conf = load_config["scenarios"]
-    runner_conf = test_config["runners"]
+    runner_conf = load_config["runners"]
+    contexts_conf = test_config["contexts"]
     Use_Dashboard = False
-
-    env_pre(None)
+    env_pre(test_config)
     if test_config["contexts"]["yardstick_ip"] is None:
         load_config["contexts"]["yardstick_ip"] =\
             conf_parser.ip_parser("yardstick_test_ip")
@@ -112,9 +110,14 @@ def run(test_config):
                 conf_parser.ip_parser("dashboard")
         LOG.info("Create Dashboard data")
         Use_Dashboard = True
-        # DashBoard.dashboard_system_bandwidth(test_config["contexts"])
+        DashBoard.posca_moon_init(test_config["contexts"])
 
     tenants_conf = conf_parser.str_to_list(scenarios_conf["tenants"])
+    subject_number = int(scenarios_conf["subject_number"])
+    object_number = int(scenarios_conf["object_number"])
+    timeout = scenarios_conf["timeout"]
+    consul_host = contexts_conf["moon_environment"]["ip"]
+    consul_port = contexts_conf["moon_environment"]["consul_port"]
 
     load_config["result_file"] = os.path.dirname(
         os.path.abspath(__file__)) + "/test_case/result"
@@ -122,7 +125,13 @@ def run(test_config):
     result = []
 
     for tenants in tenants_conf:
-        case_config = {"tenants": tenants}
+        print tenants
+        case_config = {"tenant_number": tenants,
+                       "subject_number": subject_number,
+                       "object_number": object_number,
+                       "timeout": timeout,
+                       "consul_host": consul_host,
+                       "consul_port": consul_port}
 
         data_reply = do_test(runner_conf, case_config,
                              Use_Dashboard, test_config["contexts"])
index 8f4061d..e932575 100644 (file)
@@ -15,14 +15,15 @@ This test is using yardstick as a tool to begin test.'''
 import os
 import time
 import uuid
-import json
 import Queue
 import multiprocessing
 import utils.logger as log
 from utils.parser import Parser as conf_parser
-import utils.env_prepare.stack_prepare as stack_prepare
+import utils.env_prepare.moon_prepare as moon_env
 import utils.infra_setup.runner.docker_env as docker_env
+
 import utils.infra_setup.runner.yardstick as yardstick_task
+import testsuites.posca.testcase_dashboard.posca_feature_moon as DashBoard
 
 # --------------------------------------------------
 # logging configuration
@@ -31,36 +32,31 @@ LOG = log.Logger(__name__).getLogger()
 
 testfile = os.path.basename(__file__)
 testcase, file_format = os.path.splitext(testfile)
-# cidr = "/home/opnfv/repos/yardstick/samples/pvp_throughput_bottlenecks.yaml"
-runner_switch = True
 runner_DEBUG = True
+manager = multiprocessing.Manager()
+switch = manager.Value('tmp', 0)
 
 
-def env_pre(con_dic):
+def env_pre(test_config):
+    if "moon_monitoring" in test_config["contexts"].keys():
+        if test_config["contexts"]['moon_envpre'] is True:
+            moon_environment = test_config["contexts"]['moon_environment']
+            moon_env.moon_envprepare(moon_environment)
     LOG.info("yardstick environment prepare!")
-    stack_prepare._prepare_env_daemon(True)
-
-
-def config_to_result(test_config, test_result):
-    final_data = []
-    print(test_result)
-    out_data = test_result["result"]["testcases"]
-    test_data = out_data["pvp_throughput_bottlenecks"]["tc_data"]
-    for result in test_data:
-        testdata = {}
-        testdata["vcpu"] = test_config["vcpu"]
-        testdata["memory"] = test_config["memory"]
-        testdata["nrFlows"] = result["data"]["nrFlows"]
-        testdata["packet_size"] = result["data"]["packet_size"]
-        testdata["throughput"] = result["data"]["throughput_rx_mbps"]
-        final_data.append(testdata)
+
+
+def config_to_result(test_result):
+    final_data = {}
+    final_data["testcase"] = "posca_factor_moon_tenants"
+    final_data["test_body"] = []
+    final_data["test_body"].append(test_result)
     return final_data
 
 
 def testcase_parser(runner_conf, out_file="yardstick.out", **parameter_info):
     cidr = "/home/opnfv/repos/yardstick/" + \
-           runner_conf["yardstick_test_dir"] + \
-           runner_conf["yardstick_testcase"]
+           runner_conf["yardstick_test_dir"] + "/" + \
+           runner_conf["yardstick_testcase"] + ".yaml"
     cmd = yardstick_task.yardstick_command_parser(debug=runner_DEBUG,
                                                   cidr=cidr,
                                                   outfile=out_file,
@@ -75,36 +71,19 @@ def do_test(runner_conf, test_config, Use_Dashboard, context_conf):
     print(cmd)
     stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
     LOG.info(stdout)
-    loop_value = 0
-    while loop_value < 60:
-        time.sleep(2)
-        loop_value = loop_value + 1
-        with open(out_file) as f:
-            data = json.load(f)
-            if data["status"] == 1:
-                LOG.info("yardstick run success")
-                break
-            elif data["status"] == 2:
-                LOG.error("yardstick error exit")
-                exit()
-    # data = json.load(output)
-
-    save_data = config_to_result(test_config, data)
-    if Use_Dashboard is True:
-        print("use dashboard")
-        # DashBoard.dashboard_send_data(context_conf, save_data)
-
-    # return save_data["data_body"]
-    return save_data
+    switch.value += 1
+    save_date = []
+    return save_date
 
 
 def run(test_config):
     load_config = test_config["load_manager"]
     scenarios_conf = load_config["scenarios"]
-    runner_conf = test_config["runners"]
+    contexts_conf = test_config["contexts"]
+    runner_conf = load_config["runners"]
     Use_Dashboard = False
 
-    env_pre(None)
+    env_pre(test_config)
     if test_config["contexts"]["yardstick_ip"] is None:
         load_config["contexts"]["yardstick_ip"] =\
             conf_parser.ip_parser("yardstick_test_ip")
@@ -115,15 +94,22 @@ def run(test_config):
                 conf_parser.ip_parser("dashboard")
         LOG.info("Create Dashboard data")
         Use_Dashboard = True
-        # DashBoard.dashboard_system_bandwidth(test_config["contexts"])
-
-    resources = conf_parser.str_to_list(scenarios_conf["resources"])
-    initial = conf_parser.str_to_list(scenarios_conf["initial"])
-    threshhold = conf_parser.str_to_list(scenarios_conf["threshhold"])
-    timeout = conf_parser.str_to_list(scenarios_conf["timeout"])
-    SLA = conf_parser.str_to_list(scenarios_conf["SLA"])
-    case_config = {"SLA": SLA,
-                   "resources": resources}
+        DashBoard.posca_moon_init(test_config["contexts"])
+
+    subject_number = int(scenarios_conf["subject_number"])
+    object_number = int(scenarios_conf["object_number"])
+    timeout = scenarios_conf["timeout"]
+    consul_host = contexts_conf["moon_environment"]["ip"]
+    consul_port = contexts_conf["moon_environment"]["consul_port"]
+
+    initial = scenarios_conf["initial_tenants"]
+    threshhold = scenarios_conf["steps_tenants"]
+    tolerate_time = scenarios_conf["tolerate_time"]
+    case_config = {"subject_number": subject_number,
+                   "object_number": object_number,
+                   "timeout": timeout,
+                   "consul_host": consul_host,
+                   "consul_port": consul_port}
 
     process_queue = Queue.Queue()
 
@@ -136,8 +122,8 @@ def run(test_config):
         tenant_number = threshhold
     else:
         tenant_number = initial
-
-    while runner_switch is True:
+    while switch.value == 0:
+        LOG.info("Start %d process", tenant_number)
         for tenant in range(0, tenant_number):
             process = multiprocessing.Process(target=do_test,
                                               args=(runner_conf,
@@ -150,7 +136,7 @@ def run(test_config):
 
         result = result + tenant_number
         tenant_number = threshhold
-        time.sleep(timeout)
+        time.sleep(tolerate_time)
 
     while process_queue.qsize():
         process = process_queue.get()
@@ -161,6 +147,12 @@ def run(test_config):
     else:
         result = result - threshhold
 
+    testdate = {"tenant_max": result}
+    testresult = config_to_result(testdate)
     LOG.info("Finished bottlenecks testcase")
-    LOG.info("The result data is %s", result)
-    return result
+    LOG.info("The result data is %d", result)
+    if Use_Dashboard is True:
+        print "Use Dashboard"
+        DashBoard.dashboard_send_data(test_config["contexts"], testresult)
+
+    return testresult
index 830ff73..08c4cbe 100644 (file)
@@ -81,14 +81,10 @@ def do_test(test_config, Use_Dashboard, context_conf):
             elif data["status"] == 2:
                 LOG.error("yardstick error exit")
                 exit()
-    # data = json.load(output)
 
     save_data = config_to_result(test_config, data)
     if Use_Dashboard is True:
         print("use dashboard")
-        # DashBoard.dashboard_send_data(context_conf, save_data)
-
-    # return save_data["data_body"]
     return save_data
 
 
@@ -108,7 +104,6 @@ def run(test_config):
                 conf_parser.ip_parser("dashboard")
         LOG.info("Create Dashboard data")
         Use_Dashboard = True
-        # DashBoard.dashboard_system_bandwidth(test_config["contexts"])
 
     cpus = conf_parser.str_to_list(scenarios_conf["cpus"])
     mems = conf_parser.str_to_list(scenarios_conf["mems"])
index 6d53515..417cf2b 100644 (file)
@@ -46,12 +46,9 @@ def env_pre(test_config):
     print(test_yardstick)
     stack_prepare._prepare_env_daemon(test_yardstick)
     quota_prepare.quota_env_prepare()
-    cmd = ('yardstick env prepare')
     LOG.info("yardstick environment prepare!")
-    print docker_env.yardstick_info['container']
     if(test_config["contexts"]['yardstick_envpre']):
-        yardstick_container = docker_env.yardstick_info['container']
-        stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
+        stdout = yardstick_task.yardstick_image_prepare()
         LOG.debug(stdout)
 
 
@@ -99,16 +96,11 @@ def do_test(test_config, Use_Dashboard, context_conf):
             elif data["status"] == 2:
                 LOG.error("yardstick error exit")
                 exit()
-    # data = json.load(output)
 
     save_data = config_to_result(test_config, data)
-    print("^^^^^^^^^^^^^^^^^^^^^^^^^")
-    print save_data
     if Use_Dashboard is True:
         print("use dashboard")
-        # DashBoard.dashboard_send_data(context_conf, save_data)
 
-    # return save_data["data_body"]
     return save_data
 
 
index 2e82b20..0f03d3e 100644 (file)
@@ -36,6 +36,15 @@ LOG = log.Logger(__name__).getLogger()
 # ------------------------------------------------------
 
 
+def copy_hosts_file():
+    LOG.info("Begin copying hosts file to Bottlenecks-Yardstick")
+    os.system('cp /etc/hosts /tmp/hosts')
+    yardstick_docker = docker_env.docker_find('Bottlenecks-Yardstick')
+    cp_cmd = 'sudo cp -f /tmp/hosts /etc/hosts'
+    docker_env.docker_exec_cmd(yardstick_docker, cp_cmd)
+    LOG.info("Done with copying hosts file to Bottlenecks-Yardstick")
+
+
 def posca_testcase_run(testsuite, testcase_script, test_config):
 
     module_string = "testsuites.%s.testcase_script.%s" % (testsuite,
@@ -107,10 +116,12 @@ def testsuite_run(test_level, test_name, REPORT="False"):
             conf_parser.Parser.testcase_out_dir(testcase)
         start_date = datetime.datetime.now()
         docker_env_prepare(config[testcase])
-        try:
-            posca_testcase_run(tester_parser[0], testcase, config[testcase])
-        except Exception, e:
-            LOG.warning('e.message:\t%s', e.message)
+        copy_hosts_file()
+        #try:
+        #    posca_testcase_run(tester_parser[0], testcase, config[testcase])
+        #except Exception, e:
+        #    LOG.warning('e.message:\t%s', e.message)
+        posca_testcase_run(tester_parser[0], testcase, config[testcase])
         stop_date = datetime.datetime.now()
         LOG.info("End of %s testcase in POSCA testsuite", testcase)
         criteria = "FAIL"
index 053c9da..b13b5a0 100644 (file)
@@ -18,7 +18,7 @@ where:
     -h|--help         show the help text
     -i|--installer    input the name of the installer
       <installer>         one of the following:
-                              (compass, fuel, joid, apex)
+                              (apex, compass, fuel, joid)
     --debug
                       debug option switch
 examples:
@@ -45,6 +45,10 @@ while [[ $# > 0 ]]
             redirect="/dev/stdout"
             shift
         ;;
+        *)
+            echo "unkown option $1 $2"
+            exit 1
+        ;;
     esac
     shift
 done
@@ -59,22 +63,27 @@ error () {
     exit 1
 }
 
-# Define Variables
-echo "BOTTLENECKS INFO: Downloading Releng"
+# Repo and configs
 RELENG_REPO="/home/releng"
+BOTTLENECKS_CONFIG=/tmp
+OPENRC=${BOTTLENECKS_CONFIG}/admin_rc.sh
+OS_CACERT=${BOTTLENECKS_CONFIG}/os_cacert
+
+
+##############################################################################
+# Preparing scripts for openstack and pod configs for OPNFV Installers
+##############################################################################
+# Define Variables
+info "Downloading Releng fetch_os_creds script for openstack/pod configs of OPNFV installers"
+
 [ -d ${RELENG_REPO} ] && rm -rf ${RELENG_REPO}
 git clone https://gerrit.opnfv.org/gerrit/releng ${RELENG_REPO} >${redirect}
 
-echo "BOTTLENECKS INFO: Downloading Yardstick"
+info "Downloading Yardstick for pod configs of OPNFV installers"
 YARDSTICK_REPO="/home/yardstick"
 [ -d ${YARDSTICK_REPO} ] && rm -rf ${YARDSTICK_REPO}
 git clone https://gerrit.opnfv.org/gerrit/yardstick ${YARDSTICK_REPO} >${redirect}
 
-BOTTLENECKS_CONFIG=/tmp
-
-OPENRC=${BOTTLENECKS_CONFIG}/admin_rc.sh
-OS_CACERT=${BOTTLENECKS_CONFIG}/os_cacert
-
 # Preparing configuration files for testing
 if [[ ${INSTALLER_TYPE} != "" ]]; then
     # Preparing OpenStack RC and Cacert files
@@ -84,73 +93,79 @@ if [[ ${INSTALLER_TYPE} != "" ]]; then
         INSTALLER_IP=192.168.200.2
         if [[ ${BRANCH} == 'master' ]]; then
             ${RELENG_REPO}/utils/fetch_os_creds.sh -d ${OPENRC} -i ${INSTALLER_TYPE} -a ${INSTALLER_IP} -o ${OS_CACERT} >${redirect}
-            if [[ -f ${OS_CACERT} ]]; then
-                echo "BOTTLENECKS INFO: successfully fetching os_cacert for openstack: ${OS_CACERT}"
-            else
-                echo "BOTTLENECKS ERROR: couldn't find os_cacert file: ${OS_CACERT}, please check if the it's been properly provided."
-                exit 1
-            fi
         else
             ${RELENG_REPO}/utils/fetch_os_creds.sh -d ${OPENRC} -i ${INSTALLER_TYPE} -a ${INSTALLER_IP}  >${redirect}
         fi
+    elif [[ $INSTALLER_TYPE == 'apex' ]]; then
+        INSTALLER_IP=$(sudo virsh domifaddr undercloud | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
+        ${RELENG_REPO}/utils/fetch_os_creds.sh -d ${OPENRC} -i ${INSTALLER_TYPE} -a ${INSTALLER_IP} -o ${OS_CACERT} >${redirect}
+        echo ${cmd}
+        ${cmd}
     else
-        error "The isntaller is not specified"
-        exit 1
-    fi
-
-    if [[ -f ${OPENRC} ]]; then
-        echo "BOTTLENECKS INFO: openstack credentials path is ${OPENRC}"
-        if [[ $INSTALLER_TYPE == 'compass' && ${BRANCH} == 'master' ]]; then
-            echo "BOTTLENECKS INFO: writing ${OS_CACERT} to ${OPENRC}"
-            echo "export OS_CACERT=${OS_CACERT}" >> ${OPENRC}
-        fi
-        cat ${OPENRC}
-    else
-        echo "BOTTLENECKS ERROR: couldn't find openstack rc file: ${OPENRC}, please check if the it's been properly provided."
+        error "The installer is not specified"
         exit 1
     fi
 
     # Finding and crearting POD description files from different deployments
-    ssh_options="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
-
-    if [ "$INSTALLER_TYPE" == "fuel" ]; then
-        echo "Fetching id_rsa file from jump_server $INSTALLER_IP..."
-        sshpass -p r00tme sudo scp $ssh_options root@${INSTALLER_IP}:~/.ssh/id_rsa ${BOTTLENECKS_CONFIG}/id_rsa
-    fi
+    if [[ ${INSTALLER_TYPE} == 'compass' ]]; then
+        cmd="sudo cp ${YARDSTICK_REPO}/etc/yardstick/nodes/compass_sclab_virtual/pod.yaml \
+        ${BOTTLENECKS_CONFIG}"
+        info ${cmd}
+        ${cmd}
+    elif [[ ${INSTALLER_TYPE} == 'apex' ]]; then
+        sudo pip install virtualenv
 
-    if [ "$INSTALLER_TYPE" == "apex" ]; then
-        echo "Fetching id_rsa file from jump_server $INSTALLER_IP..."
-        sudo scp $ssh_options stack@${INSTALLER_IP}:~/.ssh/id_rsa ${BOTTLENECKS_CONFIG}/id_rsa
-    fi
+        sudo virtualenv venv
+        source venv/bin/activate
+        sudo pip install -e ${RELENG_REPO}/modules/ >/dev/null
+        sudo pip install netaddr
 
-    if [[ ${INSTALLER_TYPE} == compass ]]; then
-        options="-u root -p root"
-    elif [[ ${INSTALLER_TYPE} == fuel ]]; then
-        options="-u root -p r00tme"
-    elif [[ ${INSTALLER_TYPE} == apex ]]; then
         options="-u stack -k /root/.ssh/id_rsa"
-    else
-        echo "Don't support to generate pod.yaml on ${INSTALLER_TYPE} currently."
-    fi
-
-    if [[ ${INSTALLER_TYPE} != compass ]]; then
         cmd="sudo python ${RELENG_REPO}/utils/create_pod_file.py -t ${INSTALLER_TYPE} \
-         -i ${INSTALLER_IP} ${options} -f ${BOTTLENECKS_CONFIG}/pod.yaml \
-         -s ${BOTTLENECKS_CONFIG}/id_rsa"
-        echo ${cmd}
+         -i ${INSTALLER_IP} ${options} -f ${BOTTLENECKS_CONFIG}/pod.yaml"
+        info ${cmd}
         ${cmd}
-    else
-        cmd="sudo cp ${YARDSTICK_REPO}/etc/yardstick/nodes/compass_sclab_virtual/pod.yaml \
-        ${BOTTLENECKS_CONFIG}"
-        echo ${cmd}
+
+        ssh_options="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
+        cmd="sudo scp $ssh_options stack@${INSTALLER_IP}:~/.ssh/id_rsa ${BOTTLENECKS_CONFIG}/id_rsa"
+        info ${cmd}
         ${cmd}
+
+        deactivate
     fi
 
+
+    ##############################################################################
+    # Check the existence of the output configs for OPNFV Installers
+    ##############################################################################
+    # Checking the pod decription file
     if [ -f ${BOTTLENECKS_CONFIG}/pod.yaml ]; then
-        echo "FILE: ${BOTTLENECKS_CONFIG}/pod.yaml:"
+        info "FILE - ${BOTTLENECKS_CONFIG}/pod.yaml:"
         cat ${BOTTLENECKS_CONFIG}/pod.yaml
     else
-        echo "ERROR: cannot find file ${BOTTLENECKS_CONFIG}/pod.yaml. Please check if it is existing."
+        error "Cannot find file ${BOTTLENECKS_CONFIG}/pod.yaml. Please check if it is existing."
         sudo ls -al ${BOTTLENECKS_CONFIG}
     fi
+
+    # Checking the openstack rc and os_cacert file
+    if [[ -f ${OPENRC} ]]; then
+        info "Opentack credentials path is ${OPENRC}"
+        if [[ -f ${OS_CACERT} ]]; then
+            info "Writing ${OS_CACERT} to ${OPENRC}"
+            echo "export OS_CACERT=${OS_CACERT}" >> ${OPENRC}
+            cat ${OPENRC}
+        else
+           error "Couldn't find openstack cacert file: ${OS_CACERT}, please check if the it's been properly provided."
+       fi
+    else
+        error "Couldn't find openstack rc file: ${OPENRC}, please check if the it's been properly provided."
+        exit 1
+    fi
+
+    # Checking ssh key id_rsa
+    if [[ -f "/tmp/id_rsa" ]]; then
+        info "Path of ssh key file for openstack nodes is /tmp/id_rsa"
+    else
+        error "Couldn't find the ssh key file for openstack nodes. If you are using user/pwd in pod.yaml, please ignore."
+    fi
 fi
diff --git a/utils/env_prepare/moon_prepare.bash b/utils/env_prepare/moon_prepare.bash
new file mode 100644 (file)
index 0000000..7625418
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/bash
+##############################################################################
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+if grep -q "cadvisor" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
+then
+    sed -e "/cadvisor-port=0/d" -i /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
+    systemctl daemon-reload
+    systemctl restart kubelet
+
+fi
+if kubectl get po -n monitoring |grep prometheus-k8s |grep -q Running
+then
+    echo "monitoring k8s deployment has been done"
+else
+    git clone https://github.com/coreos/prometheus-operator.git
+    cd prometheus-operator
+    kubectl apply -n kube-system -f bundle.yaml
+    cd contrib/kube-prometheus
+    sleep 10
+    hack/cluster-monitoring/deploy
+fi
+
+while ! $(kubectl get po -n monitoring |grep prometheus-k8s |grep -q Running);do
+    echo "waiting for monitoring deployment finish!"
+    sleep 10
+done
+
+echo "waiting for monitoring tool works"
+sleep 60
diff --git a/utils/env_prepare/moon_prepare.py b/utils/env_prepare/moon_prepare.py
new file mode 100644 (file)
index 0000000..4173945
--- /dev/null
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+import utils.infra_setup.passwordless_SSH.ssh as localssh
+
+
+def moon_envprepare(host_info):
+    if ("password") in host_info:
+        client = localssh.SSH(user=host_info["user"],
+                              host=host_info["ip"],
+                              password=host_info["password"])
+    else:
+        client = localssh.SSH(user=host_info["user"],
+                              host=host_info["ip"],
+                              key_filename=host_info["keyfile"])
+    with open("/home/opnfv/bottlenecks/utils/env_prepare/moon_prepare.bash",
+              "rb") as stdin_file:
+        client.run("cat > ~/bottlenecks_envprepare.bash", stdin=stdin_file)
+    client.execute("sudo bash ~/bottlenecks_envprepare.bash")
index 267e70a..367f761 100644 (file)
@@ -42,18 +42,52 @@ nova_quota = {"ram": -1,
               "injected_file_path_bytes": -1}
 
 
+def check_https_enabled():
+    LOG.debug("Check if https is enabled in OpenStack")
+    os_auth_url = os.getenv('OS_AUTH_URL')
+    if os_auth_url.startswith('https'):
+        LOG.debug("https is enabled")
+        return True
+    LOG.debug("https is not enabled")
+    return False
+
+
 def quota_env_prepare():
-    tenant_name = os.getenv("OS_TENANT_NAME")
-    cmd = ("openstack project list | grep " +
-           tenant_name +
-           " | awk '{print $2}'")
+    https_enabled = check_https_enabled()
+    insecure_option = ''
+    insecure = os.getenv('OS_INSECURE',)
+    if https_enabled:
+        LOG.info("https is enabled")
+        if insecure:
+            if insecure.lower() == "true":
+                insecure_option = ' --insecure '
+            else:
+                LOG.warn("Env variable OS_INSECURE is {}: if https + no "
+                         "credential used, it should be set as True."
+                         .format(insecure))
 
-    result = commands.getstatusoutput(cmd)
-    if result[0] == 0:
-        LOG.info("Get %s project id is %s" % (tenant_name, result[1]))
+    quota_name = os.getenv("OS_PROJECT_NAME")
+    if quota_name:
+        cmd = ("openstack {} project list | grep ".format(insecure_option) +
+               quota_name +
+               " | awk '{print $2}'")
+        result = commands.getstatusoutput(cmd)
+        if result[0] == 0 and 'exception' not in result[1]:
+            LOG.info("Get %s project name is %s" % (quota_name, result[1]))
+        else:
+            LOG.error("can't get openstack project name")
+            return 1
     else:
-        LOG.error("can't get openstack project id")
-        return 1
+        quota_name = os.getenv("OS_TENANT_NAME")
+        cmd = ("openstack {} tenant list | grep ".format(insecure_option) +
+               quota_name +
+               " | awk '{print $2}'")
+        result = commands.getstatusoutput(cmd)
+        if result[0] == 0 and 'exception' not in result[1]:
+            LOG.info("Get %s tenant name is %s" % (quota_name, result[1]))
+        else:
+            LOG.error("can't get openstack tenant name")
+            return 1
 
     openstack_id = result[1]
 
@@ -62,7 +96,7 @@ def quota_env_prepare():
 
     nova_q = nova_client.quotas.get(openstack_id).to_dict()
     neutron_q = neutron_client.show_quota(openstack_id)
-    LOG.info(tenant_name + "tenant nova and neutron quota(previous) :")
+    LOG.info(quota_name + " nova and neutron quotas (previous) :")
     LOG.info(nova_q)
     LOG.info(neutron_q)
 
@@ -73,7 +107,7 @@ def quota_env_prepare():
 
     nova_q = nova_client.quotas.get(openstack_id).to_dict()
     neutron_q = neutron_client.show_quota(openstack_id)
-    LOG.info(tenant_name + "tenant nova and neutron quota(now) :")
+    LOG.info(quota_name + " nova and neutron quotas (now) :")
     LOG.info(nova_q)
     LOG.info(neutron_q)
     return 0
index c7dae39..6b9bc51 100644 (file)
@@ -14,6 +14,7 @@ from utils.logger import Logger
 from utils.parser import Parser as config
 import utils.infra_setup.heat.manager as utils
 import utils.infra_setup.runner.docker_env as docker_env
+import utils.infra_setup.heat.manager as client_manager
 
 LOG = Logger(__name__).getLogger()
 
@@ -37,16 +38,6 @@ def _prepare_env_daemon(test_yardstick):
                             config.bottlenecks_config["yardstick_rc_dir"])
         docker_env.docker_exec_cmd(yardstick_contain,
                                    cmd)
-        file_orig = ("/home/opnfv/repos/yardstick/etc"
-                     "/yardstick/yardstick.conf.sample")
-        file_after = "/etc/yardstick/yardstick.conf"
-        cmd = "cp %s %s" % (file_orig,
-                            file_after)
-        docker_env.docker_exec_cmd(yardstick_contain,
-                                   cmd)
-        cmd = "sed -i '12s/http/file/g' /etc/yardstick/yardstick.conf"
-        docker_env.docker_exec_cmd(yardstick_contain,
-                                   cmd)
 
     # update the external_network
     _source_file(rc_file)
@@ -83,7 +74,14 @@ def _source_file(rc_file):
     p = subprocess.Popen(". %s; env" % rc_file, stdout=subprocess.PIPE,
                          shell=True)
     output = p.communicate()[0]
-    env = dict((line.split('=', 1) for line in output.splitlines()))
+    output_lines = output.splitlines()
+    env = list()
+    for line in output_lines:
+        if '=' in line:
+            env.append(tuple(line.split('=', 1)))
+
+    env = dict(env)
+#    env = dict((line.split('=', 1) for line in output_lines))
     os.environ.update(env)
     return env
 
@@ -103,3 +101,30 @@ def _append_external_network(rc_file):
         except OSError as e:
             if e.errno != errno.EEXIST:
                 raise
+
+
+def prepare_image(image_name, image_dir):
+    glance_client = client_manager._get_glance_client()
+    if not os.path.isfile(image_dir):
+        LOG.error("Error: file %s does not exist.", image_dir)
+        return None
+    try:
+        images = glance_client.images.list()
+        image_id = next((i.id for i in images if i.name == image_name), None)
+        if image_id is not None:
+            LOG.info("Image %s already exists.", image_name)
+        else:
+            LOG.info("Creating image '%s' from '%s'...", image_name, image_dir)
+
+            image = glance_client.images.create(
+                name=image_name, visibility="public", disk_format="qcow2",
+                container_format="bare")
+            image_id = image.id
+            with open(image_dir) as image_data:
+                glance_client.images.upload(image_id, image_data)
+        return image_id
+    except Exception:  # pylint: disable=broad-except
+        LOG.error(
+            "Error [create_glance_image(glance_client, '%s', '%s')]",
+            image_name, image_dir)
+        return None
index 5c181ae..1a360b7 100644 (file)
@@ -35,7 +35,7 @@ def _get_neutron_client():
     return neutron_client
 
 
-def stack_create_images(
+def create_images(
         imagefile=None,
         image_name="bottlenecks_image"):
     print "========== Create image in OS =========="
index 54478ff..438d3d1 100644 (file)
@@ -45,7 +45,7 @@ def env_yardstick(docker_name):
     volume = get_self_volume()
     yardstick_tag = os.getenv("Yardstick_TAG")
     if yardstick_tag is None:
-        yardstick_tag = "danube.3.1"
+        yardstick_tag = "latest"
     env_docker = client.containers.run(image="opnfv/yardstick:%s"
                                              % yardstick_tag,
                                        privileged=True,
index 559b9c1..3eeeee6 100644 (file)
@@ -15,15 +15,27 @@ At present, This file contain the following function:
 4.how the process of task.'''
 
 import sys
+import os
 import time
 import requests
 import json
+import urllib
 import utils.logger as logger
+from utils.parser import Parser as config
+import utils.env_prepare.stack_prepare as env
 
 headers = {"Content-Type": "application/json"}
 LOG = logger.Logger(__name__).getLogger()
 
 
+def yardstick_image_prepare():
+    if not os.path.exists(config.bottlenecks_config["yardstick_image_dir"]):
+        urllib.urlretrieve(config.bottlenecks_config["image_url"],
+                           config.bottlenecks_config["yardstick_image_dir"])
+    env.prepare_image(config.bottlenecks_config["yardstick_image_name"],
+                      config.bottlenecks_config["yardstick_image_dir"])
+
+
 def yardstick_command_parser(debug, cidr, outfile, parameter):
     cmd = "yardstick"
     if debug:
@@ -31,6 +43,9 @@ def yardstick_command_parser(debug, cidr, outfile, parameter):
     cmd += " task start "
     cmd += str(cidr)
     cmd += " --output-file " + outfile
+    image_name = config.bottlenecks_config["yardstick_image_name"]
+    parameter["image_name"] = image_name
+    LOG.info(parameter)
     if parameter is not None:
         cmd += " --task-args " + '"' + str(parameter) + '"'
     return cmd
index b46a3b9..c0c1072 100644 (file)
@@ -45,6 +45,11 @@ class Parser():
             cls.bottlenecks_config["pod_info"] = common_config['pod_info']
             cls.bottlenecks_config["yardstick_rc_dir"] = \
                 common_config['yardstick_rc_dir']
+            cls.bottlenecks_config["yardstick_image_dir"] = \
+                common_config['yardstick_image_dir']
+            cls.bottlenecks_config["image_url"] = common_config['image_url']
+            cls.bottlenecks_config["yardstick_image_name"] = \
+                common_config['yardstick_image_name']
             cls.config_dir_check(cls.bottlenecks_config["log_dir"])
 
     @classmethod
index 64b5072..1cdac39 100755 (executable)
--- a/verify.sh
+++ b/verify.sh
@@ -12,6 +12,7 @@
 # Run flake8, unit, coverage test
 
 getopts ":f" FILE_OPTION
+STYLE_CHECK_DIRS="testsuites/posca/ utils/ monitor/"
 
 run_flake8() {
     echo "========================================="
@@ -19,9 +20,9 @@ run_flake8() {
     echo "-----------------------------------------"
     logfile=flake8_verify.log
     if [ $FILE_OPTION == "f" ]; then
-       flake8 --append-config=flake8_cfg testsuites/posca/ utils/ > $logfile
+       flake8 --append-config=flake8_cfg ${STYLE_CHECK_DIRS} > $logfile
     else
-       flake8 --append-config=flake8_cfg testsuites/posca/ utils/
+       flake8 --append-config=flake8_cfg ${STYLE_CHECK_DIRS}
     fi
 
     if [ $? -ne 0 ]; then
@@ -53,7 +54,8 @@ run_nosetests() {
         utils/env_prepare/__init__.py \
         utils/infra_setup/__init__.py \
         monitor/__init__.py \
-        monitor/config/__init__.py
+        monitor/dashboard/__init__.py \
+        monitor/dispatch/__init__.py
     echo "===================END==================="
 
 }