summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/config.yaml5
-rw-r--r--docs/release/release-notes/release_notes.rst86
-rw-r--r--docs/release/release-notes/requirements_notes.rst7
-rw-r--r--docs/testing/developer/devguide/index.rst1
-rw-r--r--docs/testing/developer/devguide/unit_coverage_test.rst190
-rw-r--r--docs/testing/user/userguide/overview.rst34
-rw-r--r--docs/testing/user/userguide/posca/posca_factor_multistack_storage.rst59
-rw-r--r--docs/testing/user/userguide/posca/posca_factor_multistack_storage_parallel.rst58
-rw-r--r--docs/testing/user/userguide/posca/posca_factor_soak_throughputs.rst51
-rw-r--r--docs/testing/user/userguide/posca/posca_factor_storperf.rst37
-rw-r--r--docs/testing/user/userguide/posca/posca_feature_moon_resources.rst52
-rw-r--r--docs/testing/user/userguide/posca/posca_feature_moon_tenants.rst55
-rw-r--r--docs/testing/user/userguide/posca/posca_feature_vnf_scale_out.rst46
-rw-r--r--docs/testing/user/userguide/posca_guide.rst20
-rw-r--r--docs/testing/user/userguide/test_cases.rst7
-rw-r--r--monitor/automate_cadvisor_client.py37
-rw-r--r--monitor/automate_collectd_client.py38
-rw-r--r--monitor/automated-dashboard-datasource.py4
-rw-r--r--monitor/barometer-collectd.conf174
-rw-r--r--monitor/barometer-install-script.sh5
-rw-r--r--monitor/barometer_automated_client_install.py36
-rw-r--r--monitor/barometer_client.conf174
-rw-r--r--monitor/barometer_install_client.sh5
-rw-r--r--monitor/cadvisor_install.sh10
-rw-r--r--monitor/client_ip_configure.py27
-rw-r--r--monitor/config/collectd-client.conf125
-rw-r--r--monitor/config/collectd.conf18
-rw-r--r--monitor/config/prometheus.yaml14
-rw-r--r--monitor/custom-dashboard.py31
-rw-r--r--monitor/custom-query-dashboard.json36
-rw-r--r--monitor/install-collectd-client.sh8
-rw-r--r--monitor/monitoring.sh43
-rw-r--r--monitor/prototype_dashboard_collapsible.json2040
-rw-r--r--monitor/server_ip_configure.py27
-rw-r--r--requirements/verify.txt5
-rwxr-xr-xrun_tests.sh4
-rw-r--r--test/__init__.py0
-rw-r--r--testsuites/posca/testcase_cfg/posca_factor_multistack_storage.yaml35
-rw-r--r--testsuites/posca/testcase_cfg/posca_factor_multistack_storage_parallel.yaml33
-rw-r--r--testsuites/posca/testcase_cfg/posca_factor_soak_throughputs.yaml35
-rw-r--r--testsuites/posca/testcase_cfg/posca_feature_moon_resources.yaml21
-rw-r--r--testsuites/posca/testcase_cfg/posca_feature_moon_tenants.yaml40
-rw-r--r--testsuites/posca/testcase_cfg/posca_feature_vnf_scale_out.yaml (renamed from testsuites/posca/testcase_cfg/posca_factor_vnf_scale_out.yaml)25
-rw-r--r--testsuites/posca/testcase_dashboard/posca_feature_moon.py121
-rw-r--r--testsuites/posca/testcase_dashboard/posca_feature_moon_dashboard.json13
-rw-r--r--testsuites/posca/testcase_dashboard/posca_feature_moon_index_pattern.json4
-rw-r--r--testsuites/posca/testcase_dashboard/posca_feature_moon_resources_histogram.json11
-rw-r--r--testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_discover.json23
-rw-r--r--testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_histogram.json11
-rw-r--r--testsuites/posca/testcase_dashboard/posca_moon_resources.py36
-rw-r--r--testsuites/posca/testcase_dashboard/posca_moon_tenants.py36
-rw-r--r--testsuites/posca/testcase_dashboard/posca_stress_ping.py2
-rwxr-xr-xtestsuites/posca/testcase_dashboard/posca_vnf_scale_out.py35
-rwxr-xr-xtestsuites/posca/testcase_dashboard/system_bandwidth.py2
-rw-r--r--testsuites/posca/testcase_script/posca_factor_multistack_storage.py236
-rw-r--r--testsuites/posca/testcase_script/posca_factor_multistack_storage_parallel.py164
-rw-r--r--testsuites/posca/testcase_script/posca_factor_ping.py18
-rw-r--r--testsuites/posca/testcase_script/posca_factor_soak_throughputs.py192
-rw-r--r--testsuites/posca/testcase_script/posca_factor_system_bandwidth.py4
-rw-r--r--testsuites/posca/testcase_script/posca_factor_vnf_scale_out.py125
-rw-r--r--testsuites/posca/testcase_script/posca_feature_moon_resources.py59
-rw-r--r--testsuites/posca/testcase_script/posca_feature_moon_tenants.py158
-rw-r--r--testsuites/posca/testcase_script/posca_feature_testpmd_scale_up.py5
-rw-r--r--testsuites/posca/testcase_script/posca_feature_vnf_scale_out.py143
-rw-r--r--testsuites/run_testsuite.py19
-rw-r--r--utils/env_prepare/moon_prepare.bash35
-rw-r--r--utils/env_prepare/moon_prepare.py25
-rw-r--r--utils/env_prepare/quota_prepare.py31
-rw-r--r--utils/env_prepare/stack_prepare.py47
-rw-r--r--utils/infra_setup/heat/manager.py2
-rw-r--r--utils/infra_setup/runner/docker_env.py4
-rw-r--r--utils/infra_setup/runner/storperf_usage.py171
-rw-r--r--utils/infra_setup/runner/yardstick.py15
-rw-r--r--utils/parser.py5
-rwxr-xr-xverify.sh40
75 files changed, 5285 insertions, 265 deletions
diff --git a/config/config.yaml b/config/config.yaml
index 76e42b30..e01c01f9 100644
--- a/config/config.yaml
+++ b/config/config.yaml
@@ -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'
diff --git a/docs/release/release-notes/release_notes.rst b/docs/release/release-notes/release_notes.rst
index d8d143ac..49e2b7d3 100644
--- a/docs/release/release-notes/release_notes.rst
+++ b/docs/release/release-notes/release_notes.rst
@@ -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
@@ -56,6 +55,12 @@ Version History
| Sept 15th, 2017| 1.6 | Bottlenecks Euphrates release 5.0 |
| | | |
+----------------+--------------------+-----------------------------------+
+| Nov 15th, 2017 | 1.6.1 | Bottlenecks Euphrates release 5.1 |
+| | | |
++----------------+--------------------+-----------------------------------+
+| Apr 10th, 2018 | 1.7 | Bottlenecks Fraser release 6.0 |
+| | | |
++----------------+--------------------+-----------------------------------+
Summary
=======
@@ -78,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
-----------------------
@@ -85,6 +117,30 @@ Euphrates Release Data
| **Project** | Bottlenecks |
| | |
+--------------------------------------+--------------------------------+
+| **Repo/tag** | * Bottlenecks/5.1.0 |
+| | |
+| | |
++--------------------------------------+--------------------------------+
+| **Bottlenecks Docker image tag** | * 5.1.0 |
+| | |
+| | |
++--------------------------------------+--------------------------------+
+| **Release designation** | * 5.1.0 |
+| | |
+| | |
++--------------------------------------+--------------------------------+
+| **Release date** | * Nov 15th 2017 |
+| | |
+| | |
++--------------------------------------+--------------------------------+
+| **Purpose of the delivery** | Euphrates stable release |
+| | |
++--------------------------------------+--------------------------------+
+
++--------------------------------------+--------------------------------+
+| **Project** | Bottlenecks |
+| | |
++--------------------------------------+--------------------------------+
| **Repo/tag** | * Bottlenecks/5.0.0 |
| | |
| | |
@@ -179,8 +235,8 @@ Bramaputra Release Data
+--------------------------------------+--------------------------------+
-Danube Deliverables
-===================
+Release Deliverables
+====================
Software Deliverables
---------------------
@@ -193,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
@@ -213,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
====================
@@ -238,7 +310,7 @@ Known restrictions/issues
* Sometimes, Yardstick will return empty test results with test flag indicating test is excuted succefully.
It maybe due to the environment issue or poor internet connection causing testing tools are not installed successfully.
-* Sometimes, a process will go to sleep state. In this case when a running tool go to sleep state, we try to call it twice. Normally, it will response.
+* Sometimes, a process will go to sleep state. In this case when a running tool go to sleep state, we try to call it twice. Normally, it will response. This applies to the traffic generator, i.e., netperf.
Test results
diff --git a/docs/release/release-notes/requirements_notes.rst b/docs/release/release-notes/requirements_notes.rst
index eb5cd743..7476f75a 100644
--- a/docs/release/release-notes/requirements_notes.rst
+++ b/docs/release/release-notes/requirements_notes.rst
@@ -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
--------
diff --git a/docs/testing/developer/devguide/index.rst b/docs/testing/developer/devguide/index.rst
index d3c871e4..37a4ea09 100644
--- a/docs/testing/developer/devguide/index.rst
+++ b/docs/testing/developer/devguide/index.rst
@@ -11,4 +11,5 @@ Bottlenecks Developer Guide
./quick_start.rst
./framework_guide.rst
+ ./unit_coverage_test.rst
./package_guide.rst
diff --git a/docs/testing/developer/devguide/unit_coverage_test.rst b/docs/testing/developer/devguide/unit_coverage_test.rst
new file mode 100644
index 00000000..87096fca
--- /dev/null
+++ b/docs/testing/developer/devguide/unit_coverage_test.rst
@@ -0,0 +1,190 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) Huawei Technologies Co.,Ltd and others.
+
+****************************************
+Bottlenecks - Unit & Coverage Test Guide
+****************************************
+
+
+Introduction of the Rationale and Framework
+===========================================
+
+What are Unit & Coverage Tests
+------------------------------
+
+A unit test is an automated code-level test for a small and fairly isolated
+part of functionality, mostly in terms of functions.
+They should interact with external resources at their minimum, and includes
+testing every corner cases and cases that do not work.
+
+Unit tests should always be pretty simple, by intent. There are
+a couple of ways to integrate unit tests into your development style `[1]`_:
+
+* Test Driven Development, where unit tests are written prior to the functionality they're testing
+
+* During refactoring, where existing code -- sometimes code without any automated tests to start with -- is retrofitted with unit tests as part of the refactoring process
+
+* Bug fix testing, where bugs are first pinpointed by a targetted test and then fixed
+
+* Straight test enhanced development, where tests are written organically as the code evolves.
+
+Comprehensive and integrally designed unit tests serves valuably as
+validator of your APIs, fuctionalities and the workflow that acctually
+make them executable. It will make it possibe to deliver your codes
+more quickly.
+
+In the meanwhile, Coverage Test is the tool for measuring code coverage of Python programs. Accompany with Unit Test, it monitors your program, noting which parts of the code have been executed, then analyzes the source to identify code that could have been executed but was not.
+
+Coverage measurement is typically used to gauge the effectiveness of tests. It can show which parts of your code are being exercised by tests, and which are not.
+
+Why We Use a Framework and Nose
+-------------------------------
+
+People use unit test discovery and execution frameworks
+so that they can forcus on add tests to existing code,
+then the tests could be tirggerd,
+resulting report could be obtained automatically.
+
+In addition to adding and running your tests,
+frameworks can run tests selectively according to your requirements, add coverage and profiling information, generate comprehensive reports.
+
+There are many unit test frameworks in Python, and more arise every day.
+It will take you some time to be falimiar with those
+that are famous from among the ever-arising frameworks.
+However, to us, it always matters more that you are actually
+writing tests for your codes than how you write them.
+Plus, nose is quite stable, it's been used by many projects and it could be adapted easily to mimic any other unit test discovery framework pretty easily.
+So, why not?
+
+Principles of the Tests
+-----------------------
+
+Before you actually implement test codes for your software,
+please keep the following principles in mind `[2]`_
+
+* A testing unit should focus on one tiny bit of functionality and prove it correct.
+
+* Each test unit must be fully independent. This is usually handled by setUp() and tearDown() methods.
+
+* Try hard to make tests that run fast.
+
+* Learn your tools and learn how to run a single test or a test case. Then, when developing a function inside a module, run this function’s tests frequently, ideally automatically when you save the code.
+
+* Always run the full test suite before a coding session, and run it again after. This will give you more confidence that you did not break anything in the rest of the code.
+
+* It is a good idea to implement a hook that runs all tests before pushing code to a shared repository.
+
+* If you are in the middle of a development session and have to interrupt your work, it is a good idea to write a broken unit test about what you want to develop next. When coming back to work, you will have a pointer to where you were and get back on track faster.
+
+* The first step when you are debugging your code is to write a new test pinpointing the bug, while it is not always possible to do.
+
+* Use long and descriptive names for testing functions. These function names are displayed when a test fails, and should be as descriptive as possible.
+
+* Welly designed tests could acts as an introduction to new developers (read tests or write tests first before going into functionality development) and demonstrations for maintainers.
+
+
+Offline Test
+============
+
+There only are a few guidance for developing and testing your code on your
+local server assuming that you already have python installed.
+For more detailed introduction,
+please refer to the wesites of nose and coverage `[3]`_ `[4]`_.
+
+Install Nose
+------------
+
+Install Nose using your OS's package manager. For example:
+
+.. code-block:: bash
+
+ pip install nose
+
+As to creating tests and a quick start, please refer to `[5]`_
+
+Run Tests
+---------
+
+Nose comes with a command line utility called 'nosetests'.
+The simplest usage is to call nosetests from within your project directory
+and pass a 'tests' directory as an argument. For example,
+
+.. code-block:: bash
+
+ nosetests tests
+
+The outputs could be similar to the following summary:
+
+.. code-block:: bash
+
+ % nosetests tests
+ ....
+ ----------------------------------------------------------------------
+ Ran 4 tests in 0.003s OK
+
+Adding Code Coverage
+--------------------
+
+Coverage is the metric that could complete your unit tests by overseeing
+your test codes themselves.
+Nose support coverage test according the Coverage.py.
+
+.. code-block:: bash
+
+ pip install coverage
+
+To generate a coverage report using the nosetests utility,
+simply add the --with-coverage. By default, coverage generates data
+for all modules found in the current directory.
+
+.. code-block:: bash
+
+ nosetests --with-coverage
+
+% nosetests --with-coverage --cover-package a
+
+The --cover-package switch can be used multiple times to restrain the tests
+only looking into the 3rd party package to avoid useless information.
+
+.. code-block:: bash
+
+ nosetests --with-coverage --cover-package a --cover-package b
+ ....
+ Name Stmts Miss Cover Missing
+ -------------------------------------
+ a 8 0 100%
+ ----------------------------------------------------------------------
+ Ran 4 tests in 0.006sOK
+
+
+OPNFV CI Verify Job
+===================
+
+Assuming that you have already got the main idea of unit testing
+and start to programing you own tests under Bottlenecks repo.
+The most important thing that should be clarified is that
+unit tests under Bottlenecks should be either excutable offline and
+by OPNFV CI pipeline.
+When you submit patches to Bottlenecks repo, your patch should following certain ruls to enable the tests:
+
+* The Bottlenecks unit tests are triggered by OPNFV verify job of CI when you upload files to "test" directory.
+
+* You should add your --cover-package and test directory in ./verify.sh according to the above guides
+
+After meeting the two rules, your patch will automatically validated by
+nose tests executed by OPNFV verify job.
+
+
+Reference
+=========
+
+_`[1]`: http://ivory.idyll.org/articles/nose-intro.html
+
+_`[2]`: https://github.com/kennethreitz/python-guide/blob/master/docs/writing/tests.rst
+
+_`[3]`: http://nose.readthedocs.io/en/latest/
+
+_`[4]`: https://coverage.readthedocs.io/en/coverage-4.4.2
+
+_`[5]`: http://blog.jameskyle.org/2010/10/nose-unit-testing-quick-start/
diff --git a/docs/testing/user/userguide/overview.rst b/docs/testing/user/userguide/overview.rst
index 5d76c76c..725a4b9d 100644
--- a/docs/testing/user/userguide/overview.rst
+++ b/docs/testing/user/userguide/overview.rst
@@ -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_througputs |
-| +-------------------------------+
-| | posca_feature_scaleup |
-| +-------------------------------+
-| | posca_feature_scaleout |
-+--------+-------------------------------+
++--------+----+-------------------------------------------+
+|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
index 00000000..70f555d1
--- /dev/null
+++ b/docs/testing/user/userguide/posca/posca_factor_multistack_storage.rst
@@ -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
index 00000000..f8343bde
--- /dev/null
+++ b/docs/testing/user/userguide/posca/posca_factor_multistack_storage_parallel.rst
@@ -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
index 00000000..9e427b15
--- /dev/null
+++ b/docs/testing/user/userguide/posca/posca_factor_soak_throughputs.rst
@@ -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
index 00000000..2dc9ecdc
--- /dev/null
+++ b/docs/testing/user/userguide/posca/posca_factor_storperf.rst
@@ -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
index 00000000..5f89bca8
--- /dev/null
+++ b/docs/testing/user/userguide/posca/posca_feature_moon_resources.rst
@@ -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
index 00000000..1ac93f8d
--- /dev/null
+++ b/docs/testing/user/userguide/posca/posca_feature_moon_tenants.rst
@@ -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
index 00000000..baf30578
--- /dev/null
+++ b/docs/testing/user/userguide/posca/posca_feature_vnf_scale_out.rst
@@ -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"
diff --git a/docs/testing/user/userguide/posca_guide.rst b/docs/testing/user/userguide/posca_guide.rst
index 009aedb1..934415f0 100644
--- a/docs/testing/user/userguide/posca_guide.rst
+++ b/docs/testing/user/userguide/posca_guide.rst
@@ -30,7 +30,7 @@ Scopes of the POSCA testsuite:
b) Parameters choosing and Algorithms.
Test stories of POSCA testsuite:
- a) Factor test (Stress test): base test cases that Feature test and Optimization will be dependant on.
+ a) Factor test (Stress test): base test cases that Feature test and Optimization will be dependant on or stress test to validate system.
b) Feature test: test cases for features/scenarios.
c) Optimization test: test to tune the system parameter.
@@ -45,6 +45,8 @@ Preinstall Packages
* Docker: https://docs.docker.com/engine/installation/
* For Ubuntu, please refer to https://docs.docker.com/engine/installation/linux/ubuntu/
+[Since Euphrates release, the docker-compose package is not required.]
+
* Docker-Compose: https://docs.docker.com/compose/
.. code-block:: bash
@@ -97,14 +99,16 @@ Edit admin_rc.sh and add the following line
export OS_CACERT=/tmp/os_cacert
-If you are using compass, fuel, apex or joid to deploy your openstack
-environment, you could use the following command to get the required files.
+If you have deployed your openstack environment by compass,
+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.
.. code-block:: bash
- bash /utils/env_prepare/config_prepare.sh -i <installer> [--debug]
+ 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
@@ -116,9 +120,9 @@ Executing Specified Testcase
bottlenecks testcase|teststory run <testname>
- For the *testcase* command, testname should be as the same name of the test case configuration file located in testsuites/posca/testcase_cfg.
- For stress tests in Danube/Euphrates, *testcase* should be replaced by either *posca_factor_ping* or *posca_factor_system_bandwidth*.
- For the *teststory* command, a user can specify the test cases to be executed by defining it in a teststory configuration file located in testsuites/posca/testsuite_story. There is also an example there named *posca_factor_test*.
+For the *testcase* command, testname should be as the same name of the test case configuration file located in testsuites/posca/testcase_cfg.
+For stress tests in Danube/Euphrates, *testcase* should be replaced by either *posca_factor_ping* or *posca_factor_system_bandwidth*.
+For the *teststory* command, a user can specify the test cases to be executed by defining it in a teststory configuration file located in testsuites/posca/testsuite_story. There is also an example there named *posca_factor_test*.
2. There are also other 2 ways to run test cases and test stories.
diff --git a/docs/testing/user/userguide/test_cases.rst b/docs/testing/user/userguide/test_cases.rst
index 57e338e9..b6b1d17f 100644
--- a/docs/testing/user/userguide/test_cases.rst
+++ b/docs/testing/user/userguide/test_cases.rst
@@ -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
new file mode 100644
index 00000000..95b98e9d
--- /dev/null
+++ b/monitor/automate_cadvisor_client.py
@@ -0,0 +1,37 @@
+##############################################################################
+# 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
new file mode 100644
index 00000000..6dd70676
--- /dev/null
+++ b/monitor/automate_collectd_client.py
@@ -0,0 +1,38 @@
+##############################################################################
+# 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/automated-dashboard-datasource.py b/monitor/automated-dashboard-datasource.py
index 1e1b42f7..69f3ebe6 100644
--- a/monitor/automated-dashboard-datasource.py
+++ b/monitor/automated-dashboard-datasource.py
@@ -63,7 +63,9 @@ def post(url, data):
ip_address = socket.gethostbyname(socket.gethostname())
+_create_data_source(ip_address, 3000)
_create_dashboard(ip_address, 3000, '/var/lib/grafana/' +
'dashboards/' +
'prometheus-system_rev1.json')
-_create_data_source(ip_address, 3000)
+_create_dashboard(ip_address, 3000,
+ 'prototype_dashboard_collapsible.json')
diff --git a/monitor/barometer-collectd.conf b/monitor/barometer-collectd.conf
new file mode 100644
index 00000000..ecb1261c
--- /dev/null
+++ b/monitor/barometer-collectd.conf
@@ -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.121.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 false
+</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.121.2:9103/collectd-post"
+ Format "JSON"
+ StoreRates false
+ </Node>
+</Plugin>
diff --git a/monitor/barometer-install-script.sh b/monitor/barometer-install-script.sh
new file mode 100644
index 00000000..9dc20093
--- /dev/null
+++ b/monitor/barometer-install-script.sh
@@ -0,0 +1,5 @@
+docker pull opnfv/barometer
+sudo docker run --name bottlenecks-barometer-server -tid --net=host -v `pwd`/../src/collectd_sample_configs:/opt/collectd/etc/collectd.conf.d \
+-v /home/opnfv/bottlenecks/monitor/barometer-collectd.conf:/src/barometer/src/collectd/collectd/src/collectd.conf \
+-v /etc/barometer-config/barometer_client_collectd.conf:/opt/collectd/etc/collectd.conf \
+-v /var/run:/var/run -v /tmp:/tmp --privileged opnfv/barometer /run_collectd.sh
diff --git a/monitor/barometer_automated_client_install.py b/monitor/barometer_automated_client_install.py
new file mode 100644
index 00000000..7bbfa701
--- /dev/null
+++ b/monitor/barometer_automated_client_install.py
@@ -0,0 +1,36 @@
+##############################################################################
+# 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 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 barometer-config")
+ if status:
+ raise Exception("Command failed with non-zero status.")
+ logger.info(stdout.splitlines())
+ with open("/home/opnfv/bottlenecks/monitor/barometer_client.conf") as stdin_file:
+ ssh_d.run("cat > /etc/barometer-config/barometer_client_collectd.conf", stdin=stdin_file)
+
+ with open("/home/opnfv/bottlenecks/monitor/barometer_install_client.sh") as stdin_file:
+ ssh_d.run("cat > /etc/barometer-config/install.sh", stdin=stdin_file)
+
+ ssh_d.run("cd /etc/barometer-config/ && bash ./install.sh")
diff --git a/monitor/barometer_client.conf b/monitor/barometer_client.conf
new file mode 100644
index 00000000..fc29e72c
--- /dev/null
+++ b/monitor/barometer_client.conf
@@ -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.121.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 false
+</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.121.2:9103/collectd-post"
+ Format "JSON"
+ StoreRates false
+ </Node>
+</Plugin>
diff --git a/monitor/barometer_install_client.sh b/monitor/barometer_install_client.sh
new file mode 100644
index 00000000..d75adf1a
--- /dev/null
+++ b/monitor/barometer_install_client.sh
@@ -0,0 +1,5 @@
+docker pull opnfv/barometer
+sudo docker run --name bottlenecks-barometer-client -tid --net=host -v `pwd`/../src/collectd_sample_configs:/opt/collectd/etc/collectd.conf.d \
+-v /etc/barometer-config/barometer_client_collectd.conf:/src/barometer/src/collectd/collectd/src/collectd.conf \
+-v /etc/barometer-config/barometer_client_collectd.conf:/opt/collectd/etc/collectd.conf \
+-v /var/run:/var/run -v /tmp:/tmp --privileged opnfv/barometer /run_collectd.sh
diff --git a/monitor/cadvisor_install.sh b/monitor/cadvisor_install.sh
new file mode 100644
index 00000000..524e24d8
--- /dev/null
+++ b/monitor/cadvisor_install.sh
@@ -0,0 +1,10 @@
+sudo docker run \
+ --volume=/:/rootfs:ro \
+ --volume=/var/run:/var/run:rw \
+ --volume=/sys:/sys:ro \
+ --volume=/var/lib/docker/:/var/lib/docker:ro \
+ --volume=/dev/disk/:/dev/disk:ro \
+ --publish=8080:8080 \
+ --detach=true \
+ --name=cadvisor \
+ google/cadvisor:v0.25.0 \ -storage_driver=Prometheus
diff --git a/monitor/client_ip_configure.py b/monitor/client_ip_configure.py
new file mode 100644
index 00000000..9bfb12ce
--- /dev/null
+++ b/monitor/client_ip_configure.py
@@ -0,0 +1,27 @@
+##############################################################################
+# 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
+import requests
+from oslo_serialization import jsonutils
+
+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/config/collectd-client.conf b/monitor/config/collectd-client.conf
new file mode 100644
index 00000000..96a2a690
--- /dev/null
+++ b/monitor/config/collectd-client.conf
@@ -0,0 +1,125 @@
+#
+# 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 "/usr/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
+#<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 begnning with `##' belong to plugins which have not been built due #
+# to missing dependencies or because they have been deactivated explicitly. #
+##############################################################################
+
+LoadPlugin cpu
+LoadPlugin interface
+LoadPlugin memory
+LoadPlugin network
+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 cpu>
+# ReportByCpu true
+# ReportByState true
+# ValuesPercentage false
+#</Plugin>
+
+#<Plugin interface>
+# Interface "eth0"
+# IgnoreSelected false
+#</Plugin>
+
+#<Plugin memory>
+# ValuesAbsolute true
+# ValuesPercentage false
+#</Plugin>
+
+<Plugin network>
+ Server "192.168.121.2" "25826"
+</Plugin>
+
+#<Plugin rrdtool>
+# DataDir "${prefix}/var/lib/collectd/rrd"
+# CreateFilesAsync false
+# CacheTimeout 120
+# CacheFlush 900
+# WritesPerSecond 50
+#</Plugin>
+
+#<Plugin write_http>
+# <Node "collectd_exporter">
+# URL "http://192.168.121.2:9103/collectd-post"
+# Format "JSON"
+# StoreRates false
+# </Node>
+#</Plugin>
+
diff --git a/monitor/config/collectd.conf b/monitor/config/collectd.conf
index 62be9fbb..6be610e5 100644
--- a/monitor/config/collectd.conf
+++ b/monitor/config/collectd.conf
@@ -751,7 +751,7 @@ LoadPlugin write_http
#</Plugin>
<Plugin network>
- Server "192.168.104.2" "25826"
+ Listen "192.168.121.2" "25826"
</Plugin>
#<Plugin network>
@@ -1021,13 +1021,13 @@ LoadPlugin write_http
# CollectStatistics true
#</Plugin>
-#<Plugin rrdtool>
-# DataDir "${prefix}/var/lib/collectd/rrd"
-# CreateFilesAsync false
-# CacheTimeout 120
-# CacheFlush 900
-# WritesPerSecond 50
-#</Plugin>
+<Plugin rrdtool>
+ DataDir "/var/lib/collectd/rrd"
+ CreateFilesAsync false
+ CacheTimeout 120
+ CacheFlush 900
+ WritesPerSecond 50
+</Plugin>
#<Plugin sensors>
# SensorConfigFile "/etc/sensors.conf"
@@ -1325,7 +1325,7 @@ LoadPlugin write_http
<Plugin write_http>
<Node "collectd_exporter">
- URL "http://192.168.104.2:9103/collectd-post"
+ URL "http://192.168.121.2:9103/collectd-post"
Format "JSON"
StoreRates false
</Node>
diff --git a/monitor/config/prometheus.yaml b/monitor/config/prometheus.yaml
index 35bf0401..3736d8e4 100644
--- a/monitor/config/prometheus.yaml
+++ b/monitor/config/prometheus.yaml
@@ -25,7 +25,15 @@ scrape_configs:
scrape_interval: 5s
static_configs:
- - targets: ['192.168.104.2:9090']
+ - targets: ['192.168.121.2:9090']
+
+ - job_name: 'cadvisor'
+
+ # Override the global default and scrape targets from this job every 5 seconds.
+ scrape_interval: 5s
+
+ static_configs:
+ - targets: ['192.168.121.2:8080','10.1.0.50:8080','10.1.0.51:8080']
- job_name: 'collectd'
@@ -33,7 +41,7 @@ scrape_configs:
scrape_interval: 5s
static_configs:
- - targets: ['192.168.104.2:9103']
+ - targets: ['192.168.121.2:9103']
- job_name: 'node'
@@ -41,4 +49,4 @@ scrape_configs:
scrape_interval: 5s
static_configs:
- - targets: ['192.168.104.2:9100'] \ No newline at end of file
+ - targets: ['192.168.121.2:9100']
diff --git a/monitor/custom-dashboard.py b/monitor/custom-dashboard.py
new file mode 100644
index 00000000..48173f8e
--- /dev/null
+++ b/monitor/custom-dashboard.py
@@ -0,0 +1,31 @@
+##############################################################################
+# 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/custom-query-dashboard.json b/monitor/custom-query-dashboard.json
new file mode 100644
index 00000000..7f2e53a3
--- /dev/null
+++ b/monitor/custom-query-dashboard.json
@@ -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
+ }
+ ]
+}
diff --git a/monitor/install-collectd-client.sh b/monitor/install-collectd-client.sh
new file mode 100644
index 00000000..00fa4c88
--- /dev/null
+++ b/monitor/install-collectd-client.sh
@@ -0,0 +1,8 @@
+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
diff --git a/monitor/monitoring.sh b/monitor/monitoring.sh
index a4d404ce..01c1edc3 100644
--- a/monitor/monitoring.sh
+++ b/monitor/monitoring.sh
@@ -18,7 +18,7 @@ sudo docker run --name bottlenecks-node-exporter \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
--net="host" \
- quay.io/prometheus/node-exporter \
+ quay.io/prometheus/node-exporter:v0.14.0 \
-collector.procfs /host/proc \
-collector.sysfs /host/sys \
-collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
@@ -28,22 +28,55 @@ sudo docker run --name bottlenecks-collectd -d \
--privileged \
-v ${MONITOR_CONFIG}:/etc/collectd:ro \
-v /proc:/mnt/proc:ro \
- fr3nd/collectd
+ 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 \
+ -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
+ prom/prometheus:v1.7.1
# Grafana
sudo docker run --name bottlenecks-grafana \
-d -p 3000:3000 \
-v ${GRAFANA}/config/grafana.ini:/etc/grafana/grafana.ini \
- grafana/grafana
+ grafana/grafana:4.5.0
+
+# Cadvisor
+sudo docker run \
+ --volume=/:/rootfs:ro \
+ --volume=/var/run:/var/run:rw \
+ --volume=/sys:/sys:ro \
+ --volume=/var/lib/docker/:/var/lib/docker:ro \
+ --volume=/dev/disk/:/dev/disk:ro \
+ --publish=8080:8080 \
+ --detach=true \
+ --name=cadvisor \
+ google/cadvisor:v0.25.0 \ -storage_driver=Prometheus
+
+# Configure IP Address in barometer client configuration
+python client_ip_configure.py barometer_client.conf
+
+# Configure IP Address in barometer server configuration
+python server_ip_configure.py barometer-collectd.conf
+
+# Automate Collectd Client
+python automate_collectd_client.py
+
+# Automate Cadvisor Client
+python automate_cadvisor_client.py
+
+# Automate Barometer installation for jump server
+bash ./barometer-install-script.sh
+
+# Automate Barometer installation for compute/controller nodes
+python barometer_automated_client_install.py
+
+# Automate Prometheus Datasource and Grafana Dashboard creation
+python automated-dashboard-datasource.py
diff --git a/monitor/prototype_dashboard_collapsible.json b/monitor/prototype_dashboard_collapsible.json
new file mode 100644
index 00000000..aca25234
--- /dev/null
+++ b/monitor/prototype_dashboard_collapsible.json
@@ -0,0 +1,2040 @@
+{
+ "annotations": {
+ "list": []
+ },
+ "description": "A simple overview of the most important Docker host and container metrics. (Barometer/Prometheus)",
+ "editable": true,
+ "gnetId": 893,
+ "graphTooltip": 1,
+ "hideControls": false,
+ "id": 13,
+ "links": [],
+ "refresh": "15m",
+ "rows": [
+ {
+ "collapse": false,
+ "height": 193,
+ "panels": [
+ {
+ "content": "<img src=\"http://prometheus.io/assets/prometheus_logo_grey.svg\" alt=\"Prometheus logo\" style=\"height: 40px;\">\n<span style=\"font-family: 'Open Sans', 'Helvetica Neue', Helvetica; font-size: 25px;vertical-align: text-top;color: #bbbfc2;margin-left: 10px;\">Prometheus</span>\n\n<p style=\"margin-top: 10px;\">You're using Prometheus, an open-source systems monitoring and alerting toolkit originally built at SoundCloud. For more information, check out the <a href=\"http://www.grafana.org/\">Grafana</a> and <a href=\"http://prometheus.io/\">Prometheus</a> projects.</p>",
+ "editable": true,
+ "error": false,
+ "id": 91,
+ "links": [],
+ "mode": "html",
+ "span": 6,
+ "style": {},
+ "title": "",
+ "transparent": true,
+ "type": "text"
+ },
+ {
+ "content": "#### Samples Ingested\nThis graph displays the count of samples ingested by the Prometheus server, as measured over the last 5 minutes, per time series in the range vector. When troubleshooting an issue on IRC or Github, this is often the first stat requested by the Prometheus team. ",
+ "editable": true,
+ "error": false,
+ "id": 92,
+ "links": [],
+ "mode": "markdown",
+ "span": 6,
+ "style": {},
+ "title": "",
+ "transparent": true,
+ "type": "text"
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Prometheus Information",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": true,
+ "height": 239,
+ "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": 3,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "time() - node_boot_time{instance=~\"$server:.*\"}",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "A",
+ "step": 1800
+ }
+ ],
+ "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": 3,
+ "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]))",
+ "intervalFactor": 2,
+ "refId": "A",
+ "step": 1800
+ }
+ ],
+ "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": 3,
+ "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\",instance=~\"$server:.*\"} - node_filesystem_free{fstype=~\"xfs|ext4\",instance=~\"$server:.*\"} )/ node_filesystem_size{fstype=~\"xfs|ext4\",instance=~\"$server:.*\"})",
+ "hide": false,
+ "intervalFactor": 2,
+ "refId": "A",
+ "step": 1800
+ }
+ ],
+ "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": 3,
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "expr": "((node_memory_MemTotal{instance=~\"$server:.*\"} - node_memory_MemAvailable{instance=~\"$server:.*\"}) / node_memory_MemTotal{instance=~\"$server:.*\"}) * 100",
+ "intervalFactor": 2,
+ "refId": "A",
+ "step": 1800
+ }
+ ],
+ "thresholds": "70, 90",
+ "title": "Memory",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Container, Disk, Memory Statistics",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": true,
+ "height": 218,
+ "panels": [
+ {
+ "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": 3,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(container_network_receive_bytes_total{id=\"/\"}[$interval])) by (id)",
+ "intervalFactor": 2,
+ "legendFormat": "RECEIVED",
+ "refId": "A",
+ "step": 600
+ },
+ {
+ "expr": "- sum(rate(container_network_transmit_bytes_total{id=\"/\"}[$interval])) by (id)",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "SENT",
+ "refId": "B",
+ "step": 600
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Network Traffic",
+ "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": {
+ "{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]))",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "a",
+ "refId": "B",
+ "step": 120
+ },
+ {
+ "expr": "sum(rate(container_cpu_system_seconds_total{name=~\".+\"}[1m]))",
+ "hide": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "nur container",
+ "refId": "F",
+ "step": 10
+ },
+ {
+ "expr": "sum(rate(container_cpu_system_seconds_total{id=\"/\"}[1m]))",
+ "hide": true,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "nur docker host",
+ "metric": "",
+ "refId": "A",
+ "step": 20
+ },
+ {
+ "expr": "sum(rate(process_cpu_seconds_total[$interval])) * 100",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "host",
+ "metric": "",
+ "refId": "C",
+ "step": 600
+ },
+ {
+ "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]))",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "",
+ "refId": "D",
+ "step": 120
+ }
+ ],
+ "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
+ }
+ ]
+ },
+ {
+ "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": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": 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": 3,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "node_load1{instance=~\"$server:.*\"} / count by(job, instance)(count by(job, instance, cpu)(node_cpu{instance=~\"$server:.*\"}))",
+ "intervalFactor": 2,
+ "refId": "A",
+ "step": 600
+ }
+ ],
+ "thresholds": [
+ {
+ "colorMode": "critical",
+ "fill": true,
+ "line": true,
+ "op": "gt",
+ "value": 1.25
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Load",
+ "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.50",
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "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\"}",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Used Disk Space",
+ "refId": "A",
+ "step": 600
+ }
+ ],
+ "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
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Network, CPU, Load Statistics",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": true,
+ "height": 249,
+ "panels": [
+ {
+ "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": 8,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(rate(container_cpu_usage_seconds_total{name=~\".+\"}[$interval])) by (name) * 100",
+ "hide": false,
+ "interval": "",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "F",
+ "step": 240
+ }
+ ],
+ "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": {
+ "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": 2,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "-sum(rate(node_disk_bytes_read[$interval])) by (device)",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "OUT on /{{device}}",
+ "metric": "node_disk_bytes_read",
+ "refId": "A",
+ "step": 600
+ },
+ {
+ "expr": "sum(rate(node_disk_bytes_written[$interval])) by (device)",
+ "intervalFactor": 2,
+ "legendFormat": "IN on /{{device}}",
+ "metric": "",
+ "refId": "B",
+ "step": 600
+ }
+ ],
+ "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
+ }
+ ]
+ },
+ {
+ "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=~\".+\"}",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "D",
+ "step": 20
+ },
+ {
+ "expr": "sum(container_memory_rss{name=~\".+\"})",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "A",
+ "step": 20
+ },
+ {
+ "expr": "container_memory_usage_bytes{name=~\".+\"}",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "B",
+ "step": 20
+ },
+ {
+ "expr": "container_memory_rss{id=\"/\"}",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "C",
+ "step": 20
+ },
+ {
+ "expr": "sum(container_memory_rss)",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "E",
+ "step": 20
+ },
+ {
+ "expr": "node_memory_Buffers",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "node_memory_Dirty",
+ "refId": "N",
+ "step": 30
+ },
+ {
+ "expr": "node_memory_MemFree",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "F",
+ "step": 20
+ },
+ {
+ "expr": "node_memory_MemAvailable",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "Available Memory",
+ "refId": "H",
+ "step": 20
+ },
+ {
+ "expr": "node_memory_MemTotal - node_memory_MemAvailable",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "Unavailable Memory",
+ "refId": "G",
+ "step": 600
+ },
+ {
+ "expr": "node_memory_Inactive",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "I",
+ "step": 30
+ },
+ {
+ "expr": "node_memory_KernelStack",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "J",
+ "step": 30
+ },
+ {
+ "expr": "node_memory_Active",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "K",
+ "step": 30
+ },
+ {
+ "expr": "node_memory_MemTotal - (node_memory_Active + node_memory_MemFree + node_memory_Inactive)",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "Unknown",
+ "refId": "L",
+ "step": 40
+ },
+ {
+ "expr": "node_memory_MemFree + node_memory_Inactive ",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "M",
+ "step": 30
+ },
+ {
+ "expr": "container_memory_rss{name=~\".+\"}",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{__name__}}",
+ "refId": "O",
+ "step": 30
+ },
+ {
+ "expr": "node_memory_Inactive + node_memory_MemFree + node_memory_MemAvailable",
+ "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": 16000000000,
+ "min": 0,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Container-wise CPU usage, Disk I/O, Memory Available",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": true,
+ "height": 251,
+ "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": 240
+ },
+ {
+ "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)",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "rate(container_network_transmit_bytes_total{id=\"/\"}[$interval])",
+ "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
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Network Traffic",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": true,
+ "height": 250,
+ "panels": [
+ {
+ "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": 240
+ },
+ {
+ "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)",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "container_memory_usage_bytes{name=~\".+\"}",
+ "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
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Container Memory Statistics",
+ "titleSize": "h6"
+ },
+ {
+ "collapse": true,
+ "height": 97,
+ "panels": [
+ {
+ "columns": [
+ {
+ "text": "Current",
+ "value": "current"
+ }
+ ],
+ "editable": true,
+ "error": false,
+ "fontSize": "100%",
+ "id": 37,
+ "links": [],
+ "pageSize": null,
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "span": 4,
+ "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) ",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "sum(container_spec_memory_limit_bytes{name=~\".+\"}) by (name) ",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "container_memory_usage_bytes{name=~\".+\"}",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "C",
+ "step": 240
+ }
+ ],
+ "title": "Usage memory",
+ "transform": "timeseries_aggregations",
+ "type": "table"
+ },
+ {
+ "columns": [
+ {
+ "text": "Current",
+ "value": "current"
+ }
+ ],
+ "editable": true,
+ "error": false,
+ "fontSize": "100%",
+ "id": 35,
+ "links": [],
+ "pageSize": null,
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 1,
+ "desc": true
+ },
+ "span": 4,
+ "styles": [
+ {
+ "colorMode": "cell",
+ "colors": [
+ "rgba(50, 172, 45, 0.97)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(245, 54, 54, 0.9)"
+ ],
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [
+ "80",
+ "90"
+ ],
+ "type": "number",
+ "unit": "percent"
+ }
+ ],
+ "targets": [
+ {
+ "expr": "sum(100 - ((container_spec_memory_limit_bytes{name=~\".+\"} - container_memory_usage_bytes{name=~\".+\"}) * 100 / container_spec_memory_limit_bytes{name=~\".+\"}) ) by (name) ",
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "sum(container_spec_memory_limit_bytes{name=~\".+\"}) by (name) ",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "container_memory_usage_bytes{name=~\".+\"}",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "C",
+ "step": 240
+ }
+ ],
+ "title": "Remaining memory",
+ "transform": "timeseries_aggregations",
+ "type": "table"
+ },
+ {
+ "columns": [
+ {
+ "text": "Current",
+ "value": "current"
+ }
+ ],
+ "editable": true,
+ "error": false,
+ "fontSize": "100%",
+ "id": 36,
+ "links": [],
+ "pageSize": null,
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "span": 4,
+ "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) ",
+ "hide": true,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "metric": "",
+ "refId": "A",
+ "step": 240
+ },
+ {
+ "expr": "sum(container_spec_memory_limit_bytes{name=~\".+\"}) by (name) ",
+ "hide": false,
+ "intervalFactor": 2,
+ "legendFormat": "{{name}}",
+ "refId": "B",
+ "step": 240
+ },
+ {
+ "expr": "container_memory_usage_bytes{name=~\".+\"}",
+ "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": false,
+ "title": "Memory Usage",
+ "titleSize": "h6"
+ }
+ ],
+ "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": "192.168.121.2",
+ "value": "192.168.121.2"
+ },
+ "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-24h",
+ "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": "Monitoring docker using Prometheus",
+ "version": 3
+}
diff --git a/monitor/server_ip_configure.py b/monitor/server_ip_configure.py
new file mode 100644
index 00000000..4e8d630a
--- /dev/null
+++ b/monitor/server_ip_configure.py
@@ -0,0 +1,27 @@
+##############################################################################
+# 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
+import requests
+from oslo_serialization import jsonutils
+
+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/requirements/verify.txt b/requirements/verify.txt
index e8d51f47..3c63c8ff 100644
--- a/requirements/verify.txt
+++ b/requirements/verify.txt
@@ -6,5 +6,8 @@
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
+# This file is for verify job excuted by OPNFV CI
-flake8==3.0.4 \ No newline at end of file
+flake8==3.0.4
+nose==1.3.7
+coverage==4.4.2
diff --git a/run_tests.sh b/run_tests.sh
index 2463edbf..3bf18c62 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -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/test/__init__.py b/test/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/__init__.py
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
index 00000000..e2f48438
--- /dev/null
+++ b/testsuites/posca/testcase_cfg/posca_factor_multistack_storage.yaml
@@ -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
index 00000000..b55b826c
--- /dev/null
+++ b/testsuites/posca/testcase_cfg/posca_factor_multistack_storage_parallel.yaml
@@ -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
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
index 00000000..983b7d76
--- /dev/null
+++ b/testsuites/posca/testcase_cfg/posca_factor_soak_throughputs.yaml
@@ -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
diff --git a/testsuites/posca/testcase_cfg/posca_feature_moon_resources.yaml b/testsuites/posca/testcase_cfg/posca_feature_moon_resources.yaml
index d6b325f7..bbf65ba7 100644
--- a/testsuites/posca/testcase_cfg/posca_feature_moon_resources.yaml
+++ b/testsuites/posca/testcase_cfg/posca_feature_moon_resources.yaml
@@ -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
diff --git a/testsuites/posca/testcase_cfg/posca_feature_moon_tenants.yaml b/testsuites/posca/testcase_cfg/posca_feature_moon_tenants.yaml
new file mode 100644
index 00000000..7feb6e4e
--- /dev/null
+++ b/testsuites/posca/testcase_cfg/posca_feature_moon_tenants.yaml
@@ -0,0 +1,40 @@
+##############################################################################
+# 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: 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"
+
+contexts:
+ # info that dashboard if have data, we will create the data dashboard.
+ dashboard: "Bottlenecks-ELK"
+ 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_cfg/posca_factor_vnf_scale_out.yaml b/testsuites/posca/testcase_cfg/posca_feature_vnf_scale_out.yaml
index 84bde99d..d893ac8a 100644
--- a/testsuites/posca/testcase_cfg/posca_factor_vnf_scale_out.yaml
+++ b/testsuites/posca/testcase_cfg/posca_feature_vnf_scale_out.yaml
@@ -7,12 +7,19 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
-test_config:
- num_vnfs: [1, 40]
-runner_config:
- dashboard: "y"
- dashboard_ip:
- stack_create: yardstick
- yardstick_test_ip:
- yardstick_test_dir: "samples/vnf_samples/nsut/acl"
- yardstick_testcase: "tc_heat_rfc2544_ipv4_1rule_1flow_64B_packetsize_scale_out.yaml"
+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"
+
+contexts:
+ dashboard: "Bottlenecks-ELK"
+ yardstick: "Bottlenecks_yardstick"
+ yardstick_envpre: False
diff --git a/testsuites/posca/testcase_dashboard/posca_feature_moon.py b/testsuites/posca/testcase_dashboard/posca_feature_moon.py
new file mode 100644
index 00000000..6819ea84
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_feature_moon.py
@@ -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
index 00000000..53a4a750
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_feature_moon_dashboard.json
@@ -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
index 00000000..2bff871a
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_feature_moon_index_pattern.json
@@ -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
index 00000000..c8977a72
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_feature_moon_resources_histogram.json
@@ -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
index 00000000..03360f89
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_discover.json
@@ -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
index 00000000..a731acfc
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_feature_moon_tenants_histogram.json
@@ -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
index 00000000..446faccc
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_moon_resources.py
@@ -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
index 00000000..446faccc
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_moon_tenants.py
@@ -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_stress_ping.py b/testsuites/posca/testcase_dashboard/posca_stress_ping.py
index 7a5a8fb8..64ce3835 100644
--- a/testsuites/posca/testcase_dashboard/posca_stress_ping.py
+++ b/testsuites/posca/testcase_dashboard/posca_stress_ping.py
@@ -32,7 +32,7 @@ def dashboard_send_data(runner_config, test_data):
doc_type=test_data["testcase"],
body=test_data["data_body"])
if res['created'] == "False":
- LOG.error("date send to kibana have errors ", test_data["data_body"])
+ LOG.error("date send to kibana have errors %s", test_data["data_body"])
def posca_stress_ping(runner_config):
diff --git a/testsuites/posca/testcase_dashboard/posca_vnf_scale_out.py b/testsuites/posca/testcase_dashboard/posca_vnf_scale_out.py
new file mode 100755
index 00000000..6720b7f0
--- /dev/null
+++ b/testsuites/posca/testcase_dashboard/posca_vnf_scale_out.py
@@ -0,0 +1,35 @@
+#!/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
+##############################################################################
+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
+ # es_ip = runner_config['dashboard_ip'].split(':')
+ es = Elasticsearch([{'host': "172.17.0.5"}])
+ for i in test_data:
+ res = es.index(index="bottlenecks",
+ doc_type="vnf_scale_out",
+ body=i)
+ if res['created'] == "False":
+ LOG.error("date send to kibana have errors %s",
+ test_data["data_body"])
diff --git a/testsuites/posca/testcase_dashboard/system_bandwidth.py b/testsuites/posca/testcase_dashboard/system_bandwidth.py
index 4501dee7..5479b670 100755
--- a/testsuites/posca/testcase_dashboard/system_bandwidth.py
+++ b/testsuites/posca/testcase_dashboard/system_bandwidth.py
@@ -31,7 +31,7 @@ def dashboard_send_data(runner_config, test_data):
doc_type=test_data["testcase"],
body=test_data["data_body"])
if res['created'] == "False":
- LOG.error("date send to kibana have errors ", test_data["data_body"])
+ LOG.error("date send to kibana have errors %s", test_data["data_body"])
def dashboard_system_bandwidth(runner_config):
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
index 00000000..34ee225c
--- /dev/null
+++ b/testsuites/posca/testcase_script/posca_factor_multistack_storage.py
@@ -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
index 00000000..8c623d41
--- /dev/null
+++ b/testsuites/posca/testcase_script/posca_factor_multistack_storage_parallel.py
@@ -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
diff --git a/testsuites/posca/testcase_script/posca_factor_ping.py b/testsuites/posca/testcase_script/posca_factor_ping.py
index 3a2277cf..4ee43964 100644
--- a/testsuites/posca/testcase_script/posca_factor_ping.py
+++ b/testsuites/posca/testcase_script/posca_factor_ping.py
@@ -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
index 00000000..2fd35006
--- /dev/null
+++ b/testsuites/posca/testcase_script/posca_factor_soak_throughputs.py
@@ -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
diff --git a/testsuites/posca/testcase_script/posca_factor_system_bandwidth.py b/testsuites/posca/testcase_script/posca_factor_system_bandwidth.py
index 1a54554c..9d8b0ec6 100644
--- a/testsuites/posca/testcase_script/posca_factor_system_bandwidth.py
+++ b/testsuites/posca/testcase_script/posca_factor_system_bandwidth.py
@@ -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])
diff --git a/testsuites/posca/testcase_script/posca_factor_vnf_scale_out.py b/testsuites/posca/testcase_script/posca_factor_vnf_scale_out.py
deleted file mode 100644
index 2241d02f..00000000
--- a/testsuites/posca/testcase_script/posca_factor_vnf_scale_out.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/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 systembandwidth script.
-for example this contain two part first run_script,
-second is algorithm, this part is about how to judge the bottlenecks.
-This test is using yardstick as a tool to begin test."""
-
-import os
-import time
-import utils.logger as log
-import utils.infra_setup.runner.yardstick as Runner
-from utils.parser import Parser as conf_parser
-import testsuites.posca.testcase_dashboard.system_bandwidth as DashBoard
-# --------------------------------------------------
-# logging configuration
-# --------------------------------------------------
-LOG = log.Logger(__name__).getLogger()
-
-testfile = os.path.basename(__file__)
-testcase, file_format = os.path.splitext(testfile)
-
-
-def env_pre(con_dic):
- Runner.Create_Incluxdb(con_dic['runner_config'])
-
-
-def config_to_result(test_config, test_result):
- testdata = {}
- test_result["throughput"] = float(test_result["throughput"])
- test_result.update(test_config)
- testdata["data_body"] = test_result
- testdata["testcase"] = testcase
- return testdata
-
-
-def do_test(test_config, con_dic):
- test_case = con_dic['runner_config']['yardstick_testcase']
- test_dict = {
- "action": "runTestCase",
- "args": {
- "opts": {
- "task-args": test_config
- },
- "testcase": test_case
- }
- }
- Task_id = Runner.Send_Data(test_dict, con_dic['runner_config'])
- time.sleep(con_dic['test_config']['test_time'])
- Data_Reply = Runner.Get_Reply(con_dic['runner_config'], Task_id)
- try:
- test_date =\
- Data_Reply[con_dic['runner_config']['yardstick_testcase']][0]
- except IndexError:
- test_date = do_test(test_config, con_dic)
-
- save_data = config_to_result(test_config, test_date)
- if con_dic['runner_config']['dashboard'] == 'y':
- DashBoard.dashboard_send_data(con_dic['runner_config'], save_data)
-
- return save_data["data_body"]
-
-
-def run(con_dic):
- # can we specify these ranges from command line?
- low, high = con_dic['test_config']['num_vnfs']
- data = {
- "num_vnfs": range(low, high)
- }
- con_dic["result_file"] = os.path.dirname(
- os.path.abspath(__file__)) + "/test_case/result"
- pre_role_result = 1
- data_return = {}
- data_max = {}
- data_return["throughput"] = 1
-
- if con_dic["runner_config"]["yardstick_test_ip"] is None:
- con_dic["runner_config"]["yardstick_test_ip"] =\
- conf_parser.ip_parser("yardstick_test_ip")
-
- env_pre(con_dic)
-
- if con_dic["runner_config"]["dashboard"] == 'y':
- if con_dic["runner_config"]["dashboard_ip"] is None:
- con_dic["runner_config"]["dashboard_ip"] =\
- conf_parser.ip_parser("dashboard")
- LOG.info("Create Dashboard data")
- DashBoard.dashboard_system_bandwidth(con_dic["runner_config"])
-
- bandwidth_tmp = 1
- # vcpus and mem are scaled together
- for num_vnfs in data["scale_up_values"]:
- data_max["throughput"] = 1
- test_config = {
- "num_vnfs": num_vnfs,
- "test_time": con_dic['test_config']['test_time']
- }
- data_reply = do_test(test_config, con_dic)
- conf_parser.result_to_file(data_reply, con_dic["out_file"])
- # TODO: figure out which KPI to use
- bandwidth = data_reply["throughput"]
- if data_max["throughput"] < bandwidth:
- data_max = data_reply
- if abs(bandwidth_tmp - bandwidth) / float(bandwidth_tmp) < 0.025:
- LOG.info("this group of data has reached top output")
- break
- else:
- pre_reply = data_reply
- bandwidth_tmp = bandwidth
- cur_role_result = float(pre_reply["throughput"])
- if (abs(pre_role_result - cur_role_result) /
- float(pre_role_result) < 0.025):
- LOG.info("The performance increases slowly")
- if data_return["throughput"] < data_max["throughput"]:
- data_return = data_max
- pre_role_result = cur_role_result
- LOG.info("Find bottlenecks of this config")
- LOG.info("The max data is %d", data_return["throughput"])
- return data_return
diff --git a/testsuites/posca/testcase_script/posca_feature_moon_resources.py b/testsuites/posca/testcase_script/posca_feature_moon_resources.py
index 3c66c7b9..8b23824c 100644
--- a/testsuites/posca/testcase_script/posca_feature_moon_resources.py
+++ b/testsuites/posca/testcase_script/posca_feature_moon_resources.py
@@ -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"])
diff --git a/testsuites/posca/testcase_script/posca_feature_moon_tenants.py b/testsuites/posca/testcase_script/posca_feature_moon_tenants.py
new file mode 100644
index 00000000..e932575c
--- /dev/null
+++ b/testsuites/posca/testcase_script/posca_feature_moon_tenants.py
@@ -0,0 +1,158 @@
+#!/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 systembandwidth script.
+for example this contain two part first run_script,
+second is algorithm, this part is about how to judge the bottlenecks.
+This test is using yardstick as a tool to begin test.'''
+
+import os
+import time
+import uuid
+import Queue
+import multiprocessing
+import utils.logger as log
+from utils.parser import Parser as conf_parser
+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
+# --------------------------------------------------
+LOG = log.Logger(__name__).getLogger()
+
+testfile = os.path.basename(__file__)
+testcase, file_format = os.path.splitext(testfile)
+runner_DEBUG = True
+manager = multiprocessing.Manager()
+switch = manager.Value('tmp', 0)
+
+
+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!")
+
+
+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"] + ".yaml"
+ cmd = yardstick_task.yardstick_command_parser(debug=runner_DEBUG,
+ cidr=cidr,
+ outfile=out_file,
+ parameter=parameter_info)
+ return cmd
+
+
+def do_test(runner_conf, test_config, Use_Dashboard, context_conf):
+ yardstick_container = docker_env.yardstick_info['container']
+ out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
+ cmd = testcase_parser(runner_conf, out_file=out_file, **test_config)
+ print(cmd)
+ stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
+ LOG.info(stdout)
+ switch.value += 1
+ save_date = []
+ return save_date
+
+
+def run(test_config):
+ load_config = test_config["load_manager"]
+ scenarios_conf = load_config["scenarios"]
+ contexts_conf = test_config["contexts"]
+ runner_conf = load_config["runners"]
+ Use_Dashboard = False
+
+ env_pre(test_config)
+ if test_config["contexts"]["yardstick_ip"] is None:
+ load_config["contexts"]["yardstick_ip"] =\
+ conf_parser.ip_parser("yardstick_test_ip")
+
+ if "dashboard" in test_config["contexts"].keys():
+ if test_config["contexts"]["dashboard_ip"] is None:
+ test_config["contexts"]["dashboard_ip"] =\
+ conf_parser.ip_parser("dashboard")
+ LOG.info("Create Dashboard data")
+ Use_Dashboard = True
+ 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()
+
+ load_config["result_file"] = os.path.dirname(
+ os.path.abspath(__file__)) + "/test_case/result"
+
+ result = 0
+
+ if initial is 0:
+ tenant_number = threshhold
+ else:
+ tenant_number = initial
+ 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,
+ case_config,
+ Use_Dashboard,
+ test_config["contexts"],
+ ))
+ process.start()
+ process_queue.put(process)
+
+ result = result + tenant_number
+ tenant_number = threshhold
+ time.sleep(tolerate_time)
+
+ while process_queue.qsize():
+ process = process_queue.get()
+ process.terminate()
+
+ if result is initial:
+ result = 0
+ else:
+ result = result - threshhold
+
+ testdate = {"tenant_max": result}
+ testresult = config_to_result(testdate)
+ LOG.info("Finished bottlenecks testcase")
+ 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
diff --git a/testsuites/posca/testcase_script/posca_feature_testpmd_scale_up.py b/testsuites/posca/testcase_script/posca_feature_testpmd_scale_up.py
index 830ff73f..08c4cbe9 100644
--- a/testsuites/posca/testcase_script/posca_feature_testpmd_scale_up.py
+++ b/testsuites/posca/testcase_script/posca_feature_testpmd_scale_up.py
@@ -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"])
diff --git a/testsuites/posca/testcase_script/posca_feature_vnf_scale_out.py b/testsuites/posca/testcase_script/posca_feature_vnf_scale_out.py
new file mode 100644
index 00000000..417cf2b9
--- /dev/null
+++ b/testsuites/posca/testcase_script/posca_feature_vnf_scale_out.py
@@ -0,0 +1,143 @@
+#!/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 systembandwidth script.
+for example this contain two part first run_script,
+second is algorithm, this part is about how to judge the bottlenecks.
+This test is using yardstick as a tool to begin test."""
+
+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.docker_env as docker_env
+import utils.infra_setup.runner.yardstick as yardstick_task
+# --------------------------------------------------
+# logging configuration
+# --------------------------------------------------
+LOG = log.Logger(__name__).getLogger()
+
+
+testcase_name = ("tc_heat_rfc2544_ipv4_1rule_"
+ "1flow_64B_trex_correlated_traffic_scale_out")
+testfile = os.path.basename(__file__)
+testcase, file_format = os.path.splitext(testfile)
+cidr = ("/home/opnfv/repos/yardstick/samples/vnf_samples/nsut/acl/"
+ "tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_"
+ "traffic_scale_out.yaml")
+runner_DEBUG = True
+
+
+def env_pre(test_config):
+ test_yardstick = False
+ if "yardstick" in test_config["contexts"].keys():
+ test_yardstick = True
+ print(test_yardstick)
+ 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 config_to_result(test_config, test_result):
+ final_data = []
+ print(test_result)
+ out_data = test_result["result"]["testcases"]
+ test_data = out_data[testcase_name]["tc_data"]
+ for result in test_data:
+ testdata = {}
+ testdata["sequence"] = result["sequence"]
+ traffic_result = result["data"]["tg__0"]
+ if traffic_result:
+ testdata["RxThroughput"] = traffic_result["RxThroughput"]
+ testdata["TxThroughput"] = traffic_result["TxThroughput"]
+ testdata["DropPercentage"] = traffic_result["DropPercentage"]
+ final_data.append(testdata)
+ return final_data
+
+
+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, Use_Dashboard, context_conf):
+ yardstick_container = docker_env.yardstick_info['container']
+ out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
+ 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["status"] == 1:
+ LOG.info("yardstick run success")
+ break
+ elif data["status"] == 2:
+ LOG.error("yardstick error exit")
+ exit()
+
+ save_data = config_to_result(test_config, data)
+ if Use_Dashboard is True:
+ print("use dashboard")
+
+ return save_data
+
+
+def run(test_config):
+ print test_config
+ load_config = test_config["load_manager"]
+ scenarios_conf = load_config["scenarios"]
+ Use_Dashboard = True
+ env_pre(test_config)
+ if test_config["contexts"]["yardstick_ip"] is None:
+ load_config["contexts"]["yardstick_ip"] =\
+ conf_parser.ip_parser("yardstick_test_ip")
+
+ if "dashboard" in test_config["contexts"].keys():
+ if test_config["contexts"]["dashboard_ip"] is None:
+ test_config["contexts"]["dashboard_ip"] =\
+ conf_parser.ip_parser("dashboard")
+ LOG.info("Create Dashboard data")
+ Use_Dashboard = True
+
+ num_vnfs = conf_parser.str_to_list(scenarios_conf["number_vnfs"])
+ iterations = scenarios_conf["iterations"]
+ interval = scenarios_conf["interval"]
+ load_config["result_file"] = os.path.dirname(
+ os.path.abspath(__file__)) + "/test_case/result"
+
+ result = []
+
+ for i in range(0, len(num_vnfs)):
+ print i
+ case_config = {"num_vnfs": int(num_vnfs[i]),
+ "iterations": iterations,
+ "interval": interval}
+ data_reply = do_test(case_config, Use_Dashboard,
+ test_config["contexts"])
+ result.append(data_reply)
+
+ LOG.info("Finished bottlenecks testcase")
+ LOG.info("The result data is %s", result)
+ return result
diff --git a/testsuites/run_testsuite.py b/testsuites/run_testsuite.py
index e7276689..0f03d3e7 100644
--- a/testsuites/run_testsuite.py
+++ b/testsuites/run_testsuite.py
@@ -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', 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"
diff --git a/utils/env_prepare/moon_prepare.bash b/utils/env_prepare/moon_prepare.bash
new file mode 100644
index 00000000..7625418c
--- /dev/null
+++ b/utils/env_prepare/moon_prepare.bash
@@ -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
index 00000000..41739454
--- /dev/null
+++ b/utils/env_prepare/moon_prepare.py
@@ -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")
diff --git a/utils/env_prepare/quota_prepare.py b/utils/env_prepare/quota_prepare.py
index 24015954..8dcdf3d6 100644
--- a/utils/env_prepare/quota_prepare.py
+++ b/utils/env_prepare/quota_prepare.py
@@ -22,7 +22,9 @@ neutron_quota = {"subnet": -1,
"subnetpool": -1,
"router": -1,
"port": -1,
- "security_group": -1}
+ "security_group": -1,
+ "security_group_rule": -1,
+ "rbac_policy": -1}
nova_quota = {"ram": -1,
"cores": -1,
@@ -40,14 +42,37 @@ 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():
+ 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))
+
tenant_name = os.getenv("OS_TENANT_NAME")
- cmd = ("openstack project list | grep " +
+ cmd = ("openstack {} project list | grep ".format(insecure_option) +
tenant_name +
" | awk '{print $2}'")
result = commands.getstatusoutput(cmd)
- if result[0] == 0:
+ if result[0] == 0 and 'exception' not in result[1]:
LOG.info("Get %s project id is %s" % (tenant_name, result[1]))
else:
LOG.error("can't get openstack project id")
diff --git a/utils/env_prepare/stack_prepare.py b/utils/env_prepare/stack_prepare.py
index 5de6218f..6b9bc510 100644
--- a/utils/env_prepare/stack_prepare.py
+++ b/utils/env_prepare/stack_prepare.py
@@ -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 '13s/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
diff --git a/utils/infra_setup/heat/manager.py b/utils/infra_setup/heat/manager.py
index 5c181ae6..1a360b78 100644
--- a/utils/infra_setup/heat/manager.py
+++ b/utils/infra_setup/heat/manager.py
@@ -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 =========="
diff --git a/utils/infra_setup/runner/docker_env.py b/utils/infra_setup/runner/docker_env.py
index 64d049ba..438d3d19 100644
--- a/utils/infra_setup/runner/docker_env.py
+++ b/utils/infra_setup/runner/docker_env.py
@@ -45,13 +45,13 @@ 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,
tty=True,
detach=True,
- ports={'5000': '8888'},
+ # ports={'5000': '8888'},
volumes=volume,
name=docker_name)
yardstick_info["container"] = env_docker
diff --git a/utils/infra_setup/runner/storperf_usage.py b/utils/infra_setup/runner/storperf_usage.py
new file mode 100644
index 00000000..69f0a29c
--- /dev/null
+++ b/utils/infra_setup/runner/storperf_usage.py
@@ -0,0 +1,171 @@
+#!/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 contain all functions about storperf API.
+At present, This file contain the following function:
+1. Ask storperf to configure the environment.
+2. Ask Storperf to run testcase and get the job id.
+3. Use Job id to ask storperf for status, metrics and metadata.
+4. Query information about current jobs, environment and view logs.'''
+
+import time
+import requests
+import json
+import os
+import utils.logger as logger
+
+headers = {
+ "Content-Type": "application/json",
+ "Accept": "application/json"
+ }
+LOG = logger.Logger(__name__).getLogger()
+
+
+def storperf_env_prepare(con_dic, storperf_count, storperf_image,
+ storperf_flavor, volume_size):
+ base_url = ("http://%s/api/v1.0/configurations"
+ % (con_dic['storperf_test_ip']))
+ test_dict = {
+ "agent_count": storperf_count,
+ "agent_image": storperf_image,
+ "agent_flavor": storperf_flavor,
+ "public_network": os.environ.get("EXTERNAL_NETWORK"),
+ "volume_size": volume_size
+ }
+ LOG.info("waiting for storperf environment to prepare")
+ reponse = requests.post(
+ base_url, data=json.dumps(test_dict), headers=headers)
+ ask_data = json.loads(reponse.text)
+ stack_id = ask_data["stack_id"]
+ LOG.info("Done, storperf environment prepare complete!")
+ time.sleep(30)
+ return stack_id
+
+
+def warmup(con_dic):
+ base_url = ("http://%s/api/v1.0/jobs"
+ % (con_dic['storperf_test_ip']))
+ test_dict = {
+ "workload": "_warm_up"
+ }
+ LOG.info("filling the cinder volume with random data")
+ reponse = requests.post(
+ base_url, data=json.dumps(test_dict), headers=headers)
+ ask_data = json.loads(reponse.text)
+ job_id = ask_data["job_id"]
+ LOG.info("Done, filled the cinder volume with random data!")
+ time.sleep(600)
+ return job_id
+
+
+def job(con_dic):
+ base_url = ("http://%s/api/v1.0/jobs"
+ % (con_dic['storperf_test_ip']))
+ test_dict = {
+ "block_sizes": con_dic['block_sizes'],
+ "deadline": con_dic['deadline'],
+ "steady_state_samples": con_dic['steady_state_samples'],
+ "queue_depths": con_dic['queue_depths'],
+ "workload": con_dic['workload']
+ }
+ deadline = con_dic['deadline']
+ LOG.info("running the storage performance testcase")
+ reponse = requests.post(
+ base_url, data=json.dumps(test_dict), headers=headers)
+ ask_data = json.loads(reponse.text)
+ job_id = ask_data["job_id"]
+ LOG.info("Done, testcase still executing for specified deadline")
+ time.sleep(deadline)
+ return job_id
+
+
+def current_jobs(con_dic):
+ base_url = ("http://%s/api/v1.0/jobs"
+ % (con_dic['storperf_test_ip']))
+ reply_response = requests.get(
+ base_url, headers=headers)
+ reply_data = json.loads(reply_response.text)
+ LOG.info("current storperf jobs are %s" % (reply_data))
+ return reply_data
+
+
+def job_status(con_dic, job_id):
+ base_url = ("http://%s/api/v1.0/jobs?id=%s&type=status"
+ % (con_dic['storperf_test_ip'], job_id))
+ reply_response = requests.get(
+ base_url, headers=headers)
+ reply_data = json.loads(reply_response.text)
+ LOG.info("job status is %s" % (reply_data))
+ return reply_data
+
+
+def job_metrics(con_dic, job_id):
+ base_url = ("http://%s/api/v1.0/jobs?id=%s&type=metrics"
+ % (con_dic['storperf_test_ip'], job_id))
+ reply_response = requests.get(
+ base_url, headers=headers)
+ reply_data = json.loads(reply_response.text)
+ LOG.info("job metrics is %s" % (reply_data))
+ return reply_data
+
+
+def job_metadata(con_dic, job_id):
+ base_url = ("http://%s/api/v1.0/jobs?id=%s&type=metadata"
+ % (con_dic['storperf_test_ip'], job_id))
+ reply_response = requests.get(
+ base_url, headers=headers)
+ reply_data = json.loads(reply_response.text)
+ LOG.info("job metadata is %s" % (reply_data))
+ return reply_data
+
+
+def get_logs(con_dic):
+ base_url = ("http://%s/api/v1.0/logs?lines=all"
+ % (con_dic['storperf_test_ip']))
+ reply_response = requests.get(
+ base_url, headers=headers)
+ reply_data = json.loads(reply_response.text)
+ LOG.info("All storperf logs: %s" % (reply_data))
+ return reply_data
+
+
+def get_quotas(con_dic):
+ base_url = ("http://%s/api/v1.0/quotas"
+ % (con_dic['storperf_test_ip']))
+ reply_response = requests.get(
+ base_url, headers=headers)
+ reply_data = json.loads(reply_response.text)
+ LOG.info("current quotas is %s" % (reply_data))
+ return reply_data
+
+
+def get_configurations(con_dic):
+ base_url = ("http://%s/api/v1.0/configurations"
+ % (con_dic['storperf_test_ip']))
+ reply_response = requests.get(
+ base_url, headers=headers)
+ reply_data = json.loads(reply_response.text)
+ LOG.info("current configurations is %s" % (reply_data))
+ return reply_data
+
+
+def delete_configurations(con_dic):
+ base_url = ("http://%s/api/v1.0/configurations"
+ % (con_dic['storperf_test_ip']))
+ requests.delete(
+ base_url, headers=headers)
+ LOG.info("delete the storperf environment")
+
+
+def delete_jobs(con_dic):
+ base_url = ("http://%s/api/v1.0/jobs"
+ % (con_dic['storperf_test_ip']))
+ requests.delete(
+ base_url, headers=headers)
+ LOG.info("delete current storperf jobs")
diff --git a/utils/infra_setup/runner/yardstick.py b/utils/infra_setup/runner/yardstick.py
index 559b9c10..3eeeee6b 100644
--- a/utils/infra_setup/runner/yardstick.py
+++ b/utils/infra_setup/runner/yardstick.py
@@ -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
diff --git a/utils/parser.py b/utils/parser.py
index b46a3b91..c0c10721 100644
--- a/utils/parser.py
+++ b/utils/parser.py
@@ -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
diff --git a/verify.sh b/verify.sh
index 1e0d0132..64b5072b 100755
--- a/verify.sh
+++ b/verify.sh
@@ -14,7 +14,9 @@
getopts ":f" FILE_OPTION
run_flake8() {
- echo "Running flake8 ... "
+ echo "========================================="
+ echo "Running flake8 for python style check: "
+ echo "-----------------------------------------"
logfile=flake8_verify.log
if [ $FILE_OPTION == "f" ]; then
flake8 --append-config=flake8_cfg testsuites/posca/ utils/ > $logfile
@@ -29,20 +31,36 @@ run_flake8() {
fi
exit 1
else
- echo "OK"
+ echo "The patch has passed python style check "
+ echo "===================END==================="
fi
}
-run_tests() {
- echo "Running unittest ... "
- #will add future
-}
-run_coverage() {
- echo "Running coverage ..."
- #will add future
+run_nosetests() {
+ echo "========================================="
+ echo "Running unit and coverage test: "
+ echo "-----------------------------------------"
+ nosetests --with-coverage --cover-tests \
+ --cover-min-percentage 100 \
+ test/__init__.py \
+ testsuites/posca/__init__.py testsuites/__init__.py \
+ testsuites/posca/testcase_cfg/__init__.py \
+ testsuites/posca/testcase_dashboard/__init__.py \
+ testsuites/posca/testcase_script/__init__.py \
+ utils/__init__.py \
+ utils/dashboard/__init__.py \
+ utils/env_prepare/__init__.py \
+ utils/infra_setup/__init__.py \
+ monitor/__init__.py \
+ monitor/config/__init__.py
+ echo "===================END==================="
+
}
+
+for((i=1;i<=1;i++));do echo -e "\n";done
run_flake8
-run_tests
-run_coverage
+
+for((i=1;i<=1;i++));do echo -e "\n";done
+run_nosetests