aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dashboard/Yardstick-TC002-1456495853488469
-rw-r--r--dashboard/Yardstick-TC005-1456495868837438
-rw-r--r--dashboard/Yardstick-TC010-1456495940503252
-rw-r--r--dashboard/Yardstick-TC011-1456495954966251
-rw-r--r--dashboard/Yardstick-TC012-145649596654014
-rw-r--r--dashboard/Yardstick-TC014-1456496016450240
-rw-r--r--dashboard/Yardstick-TC037-145649607847014
-rw-r--r--docs/userguide/opnfv_yardstick_tc045.rst139
-rw-r--r--samples/cpuload.yaml3
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc044.yaml87
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml43
-rw-r--r--tests/opnfv/test_suites/fuel_test_suite.yaml12
-rw-r--r--tests/opnfv/test_suites/opnfv_huawei-pod2_daily.yaml2
-rw-r--r--tests/unit/benchmark/scenarios/availability/test_baseresultchecker.py88
-rw-r--r--tests/unit/benchmark/scenarios/availability/test_director.py103
-rw-r--r--tests/unit/benchmark/scenarios/availability/test_result_checker_general.py113
-rw-r--r--tests/unit/benchmark/scenarios/availability/test_scenario_general.py65
-rw-r--r--tests/unit/benchmark/scenarios/compute/cpuload_sample_output1.txt12
-rw-r--r--tests/unit/benchmark/scenarios/compute/test_cpuload.py161
-rw-r--r--tests/unit/benchmark/scenarios/networking/test_vsperf.py132
-rwxr-xr-xyardstick/benchmark/scenarios/availability/__init__.py24
-rw-r--r--yardstick/benchmark/scenarios/availability/actionplayers.py54
-rw-r--r--yardstick/benchmark/scenarios/availability/actionrollbackers.py45
-rw-r--r--yardstick/benchmark/scenarios/availability/director.py106
-rw-r--r--yardstick/benchmark/scenarios/availability/result_checker/__init__.py0
-rw-r--r--yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py88
-rw-r--r--yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py107
-rw-r--r--yardstick/benchmark/scenarios/availability/result_checker_conf.yaml11
-rw-r--r--yardstick/benchmark/scenarios/availability/scenario_general.py68
-rw-r--r--yardstick/benchmark/scenarios/compute/cpuload.py71
-rw-r--r--yardstick/benchmark/scenarios/networking/ping.py14
-rw-r--r--yardstick/benchmark/scenarios/networking/vsperf.py229
32 files changed, 3186 insertions, 269 deletions
diff --git a/dashboard/Yardstick-TC002-1456495853488 b/dashboard/Yardstick-TC002-1456495853488
index eb8c27d43..a0be68402 100644
--- a/dashboard/Yardstick-TC002-1456495853488
+++ b/dashboard/Yardstick-TC002-1456495853488
@@ -306,7 +306,7 @@
"tags": []
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"timeShift": null,
"title": "Network Latency - RTT",
"tooltip": {
@@ -366,9 +366,9 @@
"repeat": "POD",
"scopedVars": {
"POD": {
- "selected": true,
"text": "ericsson-pod2",
- "value": "ericsson\\-pod2"
+ "value": "ericsson\\-pod2",
+ "selected": true
}
},
"scroll": true,
@@ -458,7 +458,7 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "table",
"transparent": false,
@@ -479,9 +479,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "huawei-us-deploy-bare-1",
- "value": "huawei\\-us\\-deploy\\-bare\\-1"
+ "text": "huawei-pod1",
+ "value": "huawei\\-pod1",
+ "selected": true
}
},
"scroll": true,
@@ -571,12 +571,12 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "table",
"transparent": false,
"type": "table",
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 2
},
{
@@ -594,9 +594,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "intel-pod6",
- "value": "intel\\-pod6"
+ "text": "huawei-pod2",
+ "value": "huawei\\-pod2",
+ "selected": true
}
},
"scroll": true,
@@ -686,12 +686,12 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "table",
"transparent": false,
"type": "table",
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 2
},
{
@@ -709,9 +709,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-1",
- "value": "opnfv\\-jump\\-1"
+ "text": "intel-pod5",
+ "value": "intel\\-pod5",
+ "selected": true
}
},
"scroll": true,
@@ -801,12 +801,12 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "table",
"transparent": false,
"type": "table",
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 2
},
{
@@ -824,9 +824,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-2",
- "value": "opnfv\\-jump\\-2"
+ "text": "intel-pod6",
+ "value": "intel\\-pod6",
+ "selected": true
}
},
"scroll": true,
@@ -916,12 +916,12 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "table",
"transparent": false,
"type": "table",
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 2
},
{
@@ -939,9 +939,124 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "orange-fr-pod2",
- "value": "orange\\-fr\\-pod2"
+ "text": "lf-pod2",
+ "value": "lf\\-pod2",
+ "selected": true
+ }
+ },
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 2,
+ "desc": false
+ },
+ "span": 2,
+ "styles": [
+ {
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "pattern": "deploy_scenario",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "number",
+ "unit": "ms"
+ }
+ ],
+ "targets": [
+ {
+ "alias": "",
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc002",
+ "query": "SELECT mean(\"rtt\") FROM \"opnfv_yardstick_tc002\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY \"deploy_scenario\"",
+ "rawQuery": false,
+ "refId": "A",
+ "resultFormat": "table",
+ "select": [
+ [
+ {
+ "params": [
+ "rtt"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "14d",
+ "title": "$POD",
+ "transform": "table",
+ "transparent": false,
+ "type": "table",
+ "repeatIteration": 1467967293010,
+ "repeatPanelId": 2
+ },
+ {
+ "columns": [],
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fontSize": "90%",
+ "height": "",
+ "id": 18,
+ "isNew": true,
+ "links": [],
+ "minSpan": 2,
+ "pageSize": 100,
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "text": "zte-pod1",
+ "value": "zte\\-pod1",
+ "selected": true
}
},
"scroll": true,
@@ -1036,7 +1151,7 @@
"transform": "table",
"transparent": false,
"type": "table",
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 2
}
],
@@ -1097,9 +1212,9 @@
"repeat": "POD",
"scopedVars": {
"POD": {
- "selected": true,
"text": "ericsson-pod2",
- "value": "ericsson\\-pod2"
+ "value": "ericsson\\-pod2",
+ "selected": true
}
},
"seriesOverrides": [
@@ -1263,9 +1378,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "huawei-us-deploy-bare-1",
- "value": "huawei\\-us\\-deploy\\-bare\\-1"
+ "text": "huawei-pod1",
+ "value": "huawei\\-pod1",
+ "selected": true
}
},
"seriesOverrides": [
@@ -1379,7 +1494,7 @@
"ms",
"short"
],
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 3
},
{
@@ -1431,9 +1546,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "intel-pod6",
- "value": "intel\\-pod6"
+ "text": "huawei-pod2",
+ "value": "huawei\\-pod2",
+ "selected": true
}
},
"seriesOverrides": [
@@ -1547,7 +1662,7 @@
"ms",
"short"
],
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 3
},
{
@@ -1599,9 +1714,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-1",
- "value": "opnfv\\-jump\\-1"
+ "text": "intel-pod5",
+ "value": "intel\\-pod5",
+ "selected": true
}
},
"seriesOverrides": [
@@ -1715,7 +1830,7 @@
"ms",
"short"
],
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 3
},
{
@@ -1767,9 +1882,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-2",
- "value": "opnfv\\-jump\\-2"
+ "text": "intel-pod6",
+ "value": "intel\\-pod6",
+ "selected": true
}
},
"seriesOverrides": [
@@ -1883,7 +1998,7 @@
"ms",
"short"
],
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
"repeatPanelId": 3
},
{
@@ -1935,9 +2050,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "orange-fr-pod2",
- "value": "orange\\-fr\\-pod2"
+ "text": "lf-pod2",
+ "value": "lf\\-pod2",
+ "selected": true
}
},
"seriesOverrides": [
@@ -2051,7 +2166,175 @@
"ms",
"short"
],
- "repeatIteration": 1456495841616,
+ "repeatIteration": 1467967293010,
+ "repeatPanelId": 3
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {
+ "leftLogBase": 1,
+ "leftMax": null,
+ "leftMin": 0,
+ "rightLogBase": 1,
+ "rightMax": null,
+ "rightMin": null,
+ "threshold1": null,
+ "threshold1Color": "rgba(216, 200, 27, 0.27)",
+ "threshold2": null,
+ "threshold2Color": "rgba(234, 112, 112, 0.22)"
+ },
+ "height": "",
+ "id": 19,
+ "interval": "",
+ "isNew": true,
+ "leftYAxisLabel": "<RTT>",
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "minSpan": 2,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 1,
+ "points": true,
+ "renderer": "flot",
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "text": "zte-pod1",
+ "value": "zte\\-pod1",
+ "selected": true
+ }
+ },
+ "seriesOverrides": [
+ {
+ "alias": "os-odl_l2-nofeature-ha",
+ "color": "#7EB26D"
+ },
+ {
+ "alias": "os-nosdn-nofeature-ha",
+ "color": "#E24D42"
+ },
+ {
+ "alias": "os-onos-nofeature-ha",
+ "color": "#6ED0E0"
+ },
+ {
+ "alias": "os-nosdn-ovs-ha",
+ "color": "#EAB839"
+ },
+ {
+ "alias": "os-odl_l3-nofeature-ha",
+ "color": "#E5A8E2"
+ },
+ {
+ "alias": "os-odl_l2-bgpvpn-ha",
+ "color": "#E0752D"
+ },
+ {
+ "alias": "os-odl_l2-sfc-ha",
+ "color": "#508642"
+ }
+ ],
+ "span": 2,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_deploy_scenario",
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "24h"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "pod_name"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc002",
+ "query": "SELECT mean(\"rtt\") FROM \"opnfv_yardstick_tc002\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY time(24h), \"deploy_scenario\", \"pod_name\" fill(null)",
+ "rawQuery": false,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "rtt"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "14d",
+ "timeShift": null,
+ "title": "$POD",
+ "tooltip": {
+ "shared": true,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "x-axis": true,
+ "y-axis": true,
+ "y_formats": [
+ "ms",
+ "short"
+ ],
+ "repeatIteration": 1467967293010,
"repeatPanelId": 3
}
],
@@ -2095,14 +2378,15 @@
"allFormat": "regex values",
"current": {
"tags": [],
- "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2",
+ "text": "ericsson-pod2 + huawei-pod1 + huawei-pod2 + intel-pod5 + intel-pod6 + lf-pod2 + zte-pod1",
"value": [
"ericsson\\-pod2",
- "huawei\\-us\\-deploy\\-bare\\-1",
+ "huawei\\-pod1",
+ "huawei\\-pod2",
+ "intel\\-pod5",
"intel\\-pod6",
- "opnfv\\-jump\\-1",
- "opnfv\\-jump\\-2",
- "orange\\-fr\\-pod2"
+ "lf\\-pod2",
+ "zte\\-pod1"
]
},
"datasource": "yardstick-vtc",
@@ -2114,49 +2398,84 @@
"name": "POD",
"options": [
{
- "selected": false,
"text": "All",
- "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown)"
+ "value": "(elxg482ls42|ericsson\\-pod1|ericsson\\-pod2|huawei\\-pod1|huawei\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod5|intel\\-pod6|lf\\-pod1|lf\\-pod2|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown|zte\\-pod1)",
+ "selected": false
},
{
- "selected": false,
"text": "elxg482ls42",
- "value": "elxg482ls42"
+ "value": "elxg482ls42",
+ "selected": false
+ },
+ {
+ "text": "ericsson-pod1",
+ "value": "ericsson\\-pod1",
+ "selected": false
},
{
- "selected": true,
"text": "ericsson-pod2",
- "value": "ericsson\\-pod2"
+ "value": "ericsson\\-pod2",
+ "selected": true
+ },
+ {
+ "text": "huawei-pod1",
+ "value": "huawei\\-pod1",
+ "selected": true
+ },
+ {
+ "text": "huawei-pod2",
+ "value": "huawei\\-pod2",
+ "selected": true
},
{
- "selected": true,
"text": "huawei-us-deploy-bare-1",
- "value": "huawei\\-us\\-deploy\\-bare\\-1"
+ "value": "huawei\\-us\\-deploy\\-bare\\-1",
+ "selected": false
+ },
+ {
+ "text": "intel-pod5",
+ "value": "intel\\-pod5",
+ "selected": true
},
{
- "selected": true,
"text": "intel-pod6",
- "value": "intel\\-pod6"
+ "value": "intel\\-pod6",
+ "selected": true
+ },
+ {
+ "text": "lf-pod1",
+ "value": "lf\\-pod1",
+ "selected": false
+ },
+ {
+ "text": "lf-pod2",
+ "value": "lf\\-pod2",
+ "selected": true
},
{
- "selected": true,
"text": "opnfv-jump-1",
- "value": "opnfv\\-jump\\-1"
+ "value": "opnfv\\-jump\\-1",
+ "selected": false
},
{
- "selected": true,
"text": "opnfv-jump-2",
- "value": "opnfv\\-jump\\-2"
+ "value": "opnfv\\-jump\\-2",
+ "selected": false
},
{
- "selected": true,
"text": "orange-fr-pod2",
- "value": "orange\\-fr\\-pod2"
+ "value": "orange\\-fr\\-pod2",
+ "selected": false
},
{
- "selected": false,
"text": "unknown",
- "value": "unknown"
+ "value": "unknown",
+ "selected": false
+ },
+ {
+ "text": "zte-pod1",
+ "value": "zte\\-pod1",
+ "selected": true
}
],
"query": "SHOW TAG VALUES WITH KEY = \"pod_name\"",
@@ -2239,6 +2558,6 @@
},
"refresh": "15m",
"schemaVersion": 8,
- "version": 113,
+ "version": 2,
"links": []
-} \ No newline at end of file
+}
diff --git a/dashboard/Yardstick-TC005-1456495868837 b/dashboard/Yardstick-TC005-1456495868837
index c9719860e..9463b40d3 100644
--- a/dashboard/Yardstick-TC005-1456495868837
+++ b/dashboard/Yardstick-TC005-1456495868837
@@ -154,7 +154,7 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"timeShift": null,
"title": "Storage Performance",
"tooltip": {
@@ -212,9 +212,9 @@
"repeat": "POD",
"scopedVars": {
"POD": {
- "selected": true,
"text": "ericsson-pod2",
- "value": "ericsson\\-pod2"
+ "value": "ericsson\\-pod2",
+ "selected": true
}
},
"scroll": true,
@@ -298,7 +298,7 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "timeseries_to_rows",
"type": "table"
@@ -317,9 +317,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "huawei-us-deploy-bare-1",
- "value": "huawei\\-us\\-deploy\\-bare\\-1"
+ "text": "huawei-pod1",
+ "value": "huawei\\-pod1",
+ "selected": true
}
},
"scroll": true,
@@ -403,11 +403,11 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "timeseries_to_rows",
"type": "table",
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 5
},
{
@@ -424,9 +424,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "intel-pod6",
- "value": "intel\\-pod6"
+ "text": "huawei-pod2",
+ "value": "huawei\\-pod2",
+ "selected": true
}
},
"scroll": true,
@@ -510,11 +510,11 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "timeseries_to_rows",
"type": "table",
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 5
},
{
@@ -531,9 +531,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-1",
- "value": "opnfv\\-jump\\-1"
+ "text": "intel-pod5",
+ "value": "intel\\-pod5",
+ "selected": true
}
},
"scroll": true,
@@ -617,11 +617,11 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "timeseries_to_rows",
"type": "table",
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 5
},
{
@@ -638,9 +638,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-2",
- "value": "opnfv\\-jump\\-2"
+ "text": "intel-pod6",
+ "value": "intel\\-pod6",
+ "selected": true
}
},
"scroll": true,
@@ -724,11 +724,11 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "timeseries_to_rows",
"type": "table",
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 5
},
{
@@ -745,9 +745,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "orange-fr-pod2",
- "value": "orange\\-fr\\-pod2"
+ "text": "lf-pod2",
+ "value": "lf\\-pod2",
+ "selected": true
}
},
"scroll": true,
@@ -831,11 +831,118 @@
]
}
],
- "timeFrom": "24h",
+ "timeFrom": "14d",
"title": "$POD",
"transform": "timeseries_to_rows",
"type": "table",
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
+ "repeatPanelId": 5
+ },
+ {
+ "columns": [],
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fontSize": "100%",
+ "id": 20,
+ "isNew": true,
+ "links": [],
+ "minSpan": 2,
+ "pageSize": null,
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "text": "zte-pod1",
+ "value": "zte\\-pod1",
+ "selected": true
+ }
+ },
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "span": 2,
+ "styles": [
+ {
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "pattern": "deploy_scenario",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc005",
+ "query": "SELECT \"read_iops\" FROM \"opnfv_yardstick_tc005\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY \"deploy_scenario\"",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "read_iops"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "14d",
+ "title": "$POD",
+ "transform": "timeseries_to_rows",
+ "type": "table",
+ "repeatIteration": 1467968127728,
"repeatPanelId": 5
}
],
@@ -888,9 +995,9 @@
"repeat": "POD",
"scopedVars": {
"POD": {
- "selected": true,
"text": "ericsson-pod2",
- "value": "ericsson\\-pod2"
+ "value": "ericsson\\-pod2",
+ "selected": true
}
},
"seriesOverrides": [],
@@ -960,7 +1067,7 @@
]
}
],
- "timeFrom": "10d",
+ "timeFrom": "14d",
"timeShift": null,
"title": "$POD",
"tooltip": {
@@ -1017,9 +1124,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "huawei-us-deploy-bare-1",
- "value": "huawei\\-us\\-deploy\\-bare\\-1"
+ "text": "huawei-pod1",
+ "value": "huawei\\-pod1",
+ "selected": true
}
},
"seriesOverrides": [],
@@ -1089,7 +1196,7 @@
]
}
],
- "timeFrom": "10d",
+ "timeFrom": "14d",
"timeShift": null,
"title": "$POD",
"tooltip": {
@@ -1103,7 +1210,7 @@
"short",
"short"
],
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 7
},
{
@@ -1148,9 +1255,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "intel-pod6",
- "value": "intel\\-pod6"
+ "text": "huawei-pod2",
+ "value": "huawei\\-pod2",
+ "selected": true
}
},
"seriesOverrides": [],
@@ -1220,7 +1327,7 @@
]
}
],
- "timeFrom": "10d",
+ "timeFrom": "14d",
"timeShift": null,
"title": "$POD",
"tooltip": {
@@ -1234,7 +1341,7 @@
"short",
"short"
],
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 7
},
{
@@ -1279,9 +1386,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-1",
- "value": "opnfv\\-jump\\-1"
+ "text": "intel-pod5",
+ "value": "intel\\-pod5",
+ "selected": true
}
},
"seriesOverrides": [],
@@ -1351,7 +1458,7 @@
]
}
],
- "timeFrom": "10d",
+ "timeFrom": "14d",
"timeShift": null,
"title": "$POD",
"tooltip": {
@@ -1365,7 +1472,7 @@
"short",
"short"
],
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 7
},
{
@@ -1410,9 +1517,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "opnfv-jump-2",
- "value": "opnfv\\-jump\\-2"
+ "text": "intel-pod6",
+ "value": "intel\\-pod6",
+ "selected": true
}
},
"seriesOverrides": [],
@@ -1482,7 +1589,7 @@
]
}
],
- "timeFrom": "10d",
+ "timeFrom": "14d",
"timeShift": null,
"title": "$POD",
"tooltip": {
@@ -1496,7 +1603,7 @@
"short",
"short"
],
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
"repeatPanelId": 7
},
{
@@ -1541,9 +1648,9 @@
"repeat": null,
"scopedVars": {
"POD": {
- "selected": true,
- "text": "orange-fr-pod2",
- "value": "orange\\-fr\\-pod2"
+ "text": "lf-pod2",
+ "value": "lf\\-pod2",
+ "selected": true
}
},
"seriesOverrides": [],
@@ -1613,7 +1720,7 @@
]
}
],
- "timeFrom": "10d",
+ "timeFrom": "14d",
"timeShift": null,
"title": "$POD",
"tooltip": {
@@ -1627,7 +1734,138 @@
"short",
"short"
],
- "repeatIteration": 1456495861692,
+ "repeatIteration": 1467968127728,
+ "repeatPanelId": 7
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {
+ "leftLogBase": 1,
+ "leftMax": null,
+ "leftMin": null,
+ "rightLogBase": 1,
+ "rightMax": null,
+ "rightMin": null,
+ "threshold1": null,
+ "threshold1Color": "rgba(216, 200, 27, 0.27)",
+ "threshold2": null,
+ "threshold2Color": "rgba(234, 112, 112, 0.22)"
+ },
+ "id": 21,
+ "isNew": true,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 2,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "text": "zte-pod1",
+ "value": "zte\\-pod1",
+ "selected": true
+ }
+ },
+ "seriesOverrides": [],
+ "span": 2,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_deploy_scenario",
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "24h"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "pod_name"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc005",
+ "query": "SELECT mean(\"read_bw\") FROM \"opnfv_yardstick_tc005\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY time(24h), \"deploy_scenario\", \"pod_name\" fill(null)",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "read_bw"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "14d",
+ "timeShift": null,
+ "title": "$POD",
+ "tooltip": {
+ "shared": true,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "x-axis": true,
+ "y-axis": true,
+ "y_formats": [
+ "short",
+ "short"
+ ],
+ "repeatIteration": 1467968127728,
"repeatPanelId": 7
}
],
@@ -1669,14 +1907,15 @@
"allFormat": "regex values",
"current": {
"tags": [],
- "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2",
+ "text": "ericsson-pod2 + huawei-pod1 + huawei-pod2 + intel-pod5 + intel-pod6 + lf-pod2 + zte-pod1",
"value": [
"ericsson\\-pod2",
- "huawei\\-us\\-deploy\\-bare\\-1",
+ "huawei\\-pod1",
+ "huawei\\-pod2",
+ "intel\\-pod5",
"intel\\-pod6",
- "opnfv\\-jump\\-1",
- "opnfv\\-jump\\-2",
- "orange\\-fr\\-pod2"
+ "lf\\-pod2",
+ "zte\\-pod1"
]
},
"datasource": "yardstick-vtc",
@@ -1686,49 +1925,84 @@
"name": "POD",
"options": [
{
- "selected": false,
"text": "All",
- "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown)"
+ "value": "(elxg482ls42|ericsson\\-pod1|ericsson\\-pod2|huawei\\-pod1|huawei\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod5|intel\\-pod6|lf\\-pod1|lf\\-pod2|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown|zte\\-pod1)",
+ "selected": false
},
{
- "selected": false,
"text": "elxg482ls42",
- "value": "elxg482ls42"
+ "value": "elxg482ls42",
+ "selected": false
+ },
+ {
+ "text": "ericsson-pod1",
+ "value": "ericsson\\-pod1",
+ "selected": false
},
{
- "selected": true,
"text": "ericsson-pod2",
- "value": "ericsson\\-pod2"
+ "value": "ericsson\\-pod2",
+ "selected": true
+ },
+ {
+ "text": "huawei-pod1",
+ "value": "huawei\\-pod1",
+ "selected": true
+ },
+ {
+ "text": "huawei-pod2",
+ "value": "huawei\\-pod2",
+ "selected": true
},
{
- "selected": true,
"text": "huawei-us-deploy-bare-1",
- "value": "huawei\\-us\\-deploy\\-bare\\-1"
+ "value": "huawei\\-us\\-deploy\\-bare\\-1",
+ "selected": false
+ },
+ {
+ "text": "intel-pod5",
+ "value": "intel\\-pod5",
+ "selected": true
},
{
- "selected": true,
"text": "intel-pod6",
- "value": "intel\\-pod6"
+ "value": "intel\\-pod6",
+ "selected": true
+ },
+ {
+ "text": "lf-pod1",
+ "value": "lf\\-pod1",
+ "selected": false
+ },
+ {
+ "text": "lf-pod2",
+ "value": "lf\\-pod2",
+ "selected": true
},
{
- "selected": true,
"text": "opnfv-jump-1",
- "value": "opnfv\\-jump\\-1"
+ "value": "opnfv\\-jump\\-1",
+ "selected": false
},
{
- "selected": true,
"text": "opnfv-jump-2",
- "value": "opnfv\\-jump\\-2"
+ "value": "opnfv\\-jump\\-2",
+ "selected": false
},
{
- "selected": true,
"text": "orange-fr-pod2",
- "value": "orange\\-fr\\-pod2"
+ "value": "orange\\-fr\\-pod2",
+ "selected": false
},
{
- "selected": false,
"text": "unknown",
- "value": "unknown"
+ "value": "unknown",
+ "selected": false
+ },
+ {
+ "text": "zte-pod1",
+ "value": "zte\\-pod1",
+ "selected": true
}
],
"query": "SHOW TAG VALUES WITH KEY = \"pod_name\"",
@@ -1806,6 +2080,6 @@
"list": []
},
"schemaVersion": 8,
- "version": 9,
+ "version": 2,
"links": []
-} \ No newline at end of file
+}
diff --git a/dashboard/Yardstick-TC010-1456495940503 b/dashboard/Yardstick-TC010-1456495940503
index 9edc972d6..72cb70495 100644
--- a/dashboard/Yardstick-TC010-1456495940503
+++ b/dashboard/Yardstick-TC010-1456495940503
@@ -838,6 +838,113 @@
"type": "table",
"repeatIteration": 1456495934825,
"repeatPanelId": 5
+ },
+ {
+ "columns": [],
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fontSize": "100%",
+ "id": 20,
+ "isNew": true,
+ "links": [],
+ "minSpan": 2,
+ "pageSize": null,
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ }
+ },
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "span": 2,
+ "styles": [
+ {
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "pattern": "deploy_scenario",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc010",
+ "query": "SELECT \"latencies0.latency\" FROM \"opnfv_yardstick_tc010\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY \"deploy_scenario\"",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "latencies0.latency"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "24h",
+ "title": "$POD",
+ "transform": "timeseries_to_rows",
+ "type": "table",
+ "repeatIteration": 1456495934825,
+ "repeatPanelId": 5
}
],
"title": "New row"
@@ -1630,6 +1737,137 @@
],
"repeatIteration": 1456495934825,
"repeatPanelId": 7
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {
+ "leftLogBase": 1,
+ "leftMax": null,
+ "leftMin": null,
+ "rightLogBase": 1,
+ "rightMax": null,
+ "rightMin": null,
+ "threshold1": null,
+ "threshold1Color": "rgba(216, 200, 27, 0.27)",
+ "threshold2": null,
+ "threshold2Color": "rgba(234, 112, 112, 0.22)"
+ },
+ "id": 21,
+ "isNew": true,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 2,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ }
+ },
+ "seriesOverrides": [],
+ "span": 2,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_deploy_scenario",
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "24h"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "pod_name"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc010",
+ "query": "SELECT mean(\"latencies0.latency\") FROM \"opnfv_yardstick_tc010\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY time(24h), \"deploy_scenario\", \"pod_name\" fill(null)",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "latencies0.latency"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "10d",
+ "timeShift": null,
+ "title": "$POD",
+ "tooltip": {
+ "shared": true,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "x-axis": true,
+ "y-axis": true,
+ "y_formats": [
+ "short",
+ "short"
+ ],
+ "repeatIteration": 1456495934825,
+ "repeatPanelId": 7
}
],
"title": "New row"
@@ -1670,14 +1908,15 @@
"allFormat": "regex values",
"current": {
"tags": [],
- "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2",
+ "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2 + zte-pod1",
"value": [
"ericsson\\-pod2",
"huawei\\-us\\-deploy\\-bare\\-1",
"intel\\-pod6",
"opnfv\\-jump\\-1",
"opnfv\\-jump\\-2",
- "orange\\-fr\\-pod2"
+ "orange\\-fr\\-pod2",
+ "zte\\-pod1"
]
},
"datasource": "yardstick-vtc",
@@ -1689,7 +1928,7 @@
{
"selected": false,
"text": "All",
- "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown)"
+ "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|zte\\-pod1|unknown)"
},
{
"selected": false,
@@ -1727,6 +1966,11 @@
"value": "orange\\-fr\\-pod2"
},
{
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ },
+ {
"selected": false,
"text": "unknown",
"value": "unknown"
@@ -1809,4 +2053,4 @@
"schemaVersion": 8,
"version": 4,
"links": []
-} \ No newline at end of file
+}
diff --git a/dashboard/Yardstick-TC011-1456495954966 b/dashboard/Yardstick-TC011-1456495954966
index 248135534..db8f48ce8 100644
--- a/dashboard/Yardstick-TC011-1456495954966
+++ b/dashboard/Yardstick-TC011-1456495954966
@@ -837,6 +837,113 @@
"type": "table",
"repeatIteration": 1456495947533,
"repeatPanelId": 5
+ },
+ {
+ "columns": [],
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fontSize": "100%",
+ "id": 20,
+ "isNew": true,
+ "links": [],
+ "minSpan": 2,
+ "pageSize": null,
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ }
+ },
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "span": 2,
+ "styles": [
+ {
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "pattern": "deploy_scenario",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 4,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc011",
+ "query": "SELECT \"end.sum.jitter_ms\" FROM \"opnfv_yardstick_tc011\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY \"deploy_scenario\"",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "end.sum.jitter_ms"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "24h",
+ "title": "$POD",
+ "transform": "timeseries_to_rows",
+ "type": "table",
+ "repeatIteration": 1456495947533,
+ "repeatPanelId": 5
}
],
"title": "New row"
@@ -1623,6 +1730,136 @@
],
"repeatIteration": 1456495947533,
"repeatPanelId": 7
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {
+ "leftLogBase": 1,
+ "leftMax": null,
+ "leftMin": null,
+ "rightLogBase": 1,
+ "rightMax": null,
+ "rightMin": null,
+ "threshold1": null,
+ "threshold1Color": "rgba(216, 200, 27, 0.27)",
+ "threshold2": null,
+ "threshold2Color": "rgba(234, 112, 112, 0.22)"
+ },
+ "id": 21,
+ "isNew": true,
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 2,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 3,
+ "points": true,
+ "renderer": "flot",
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ }
+ },
+ "seriesOverrides": [],
+ "span": 2,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "24h"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "pod_name"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc011",
+ "query": "SELECT mean(\"end.sum.jitter_ms\") FROM \"opnfv_yardstick_tc011\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY time(24h), \"deploy_scenario\", \"pod_name\" fill(null)",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "end.sum.jitter_ms"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "10d",
+ "timeShift": null,
+ "title": "$POD",
+ "tooltip": {
+ "shared": true,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "x-axis": true,
+ "y-axis": true,
+ "y_formats": [
+ "short",
+ "short"
+ ],
+ "repeatIteration": 1456495947533,
+ "repeatPanelId": 7
}
],
"title": "New row"
@@ -1663,14 +1900,15 @@
"allFormat": "regex values",
"current": {
"tags": [],
- "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2",
+ "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2 + zte-pod1",
"value": [
"ericsson\\-pod2",
"huawei\\-us\\-deploy\\-bare\\-1",
"intel\\-pod6",
"opnfv\\-jump\\-1",
"opnfv\\-jump\\-2",
- "orange\\-fr\\-pod2"
+ "orange\\-fr\\-pod2",
+ "zte\\-pod1"
]
},
"datasource": "yardstick-vtc",
@@ -1682,7 +1920,7 @@
{
"selected": false,
"text": "All",
- "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown)"
+ "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|zte\\-pod1|unknown)"
},
{
"selected": false,
@@ -1720,6 +1958,11 @@
"value": "orange\\-fr\\-pod2"
},
{
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ },
+ {
"selected": false,
"text": "unknown",
"value": "unknown"
@@ -1803,4 +2046,4 @@
"schemaVersion": 8,
"version": 11,
"links": []
-} \ No newline at end of file
+}
diff --git a/dashboard/Yardstick-TC012-1456495966540 b/dashboard/Yardstick-TC012-1456495966540
index fde466f15..0cab51702 100644
--- a/dashboard/Yardstick-TC012-1456495966540
+++ b/dashboard/Yardstick-TC012-1456495966540
@@ -365,14 +365,15 @@
"allFormat": "regex values",
"current": {
"tags": [],
- "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2",
+ "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2 + zte-pod1",
"value": [
"ericsson\\-pod2",
"huawei\\-us\\-deploy\\-bare\\-1",
"intel\\-pod6",
"opnfv\\-jump\\-1",
"opnfv\\-jump\\-2",
- "orange\\-fr\\-pod2"
+ "orange\\-fr\\-pod2",
+ "zte\\-pod1"
]
},
"datasource": "yardstick-vtc",
@@ -384,7 +385,7 @@
{
"selected": false,
"text": "All",
- "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown)"
+ "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|zte\\-pod1|unknown)"
},
{
"selected": false,
@@ -422,6 +423,11 @@
"value": "orange\\-fr\\-pod2"
},
{
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ },
+ {
"selected": false,
"text": "unknown",
"value": "unknown"
@@ -503,4 +509,4 @@
"schemaVersion": 8,
"version": 29,
"links": []
-} \ No newline at end of file
+}
diff --git a/dashboard/Yardstick-TC014-1456496016450 b/dashboard/Yardstick-TC014-1456496016450
index e0a284505..a06ddb603 100644
--- a/dashboard/Yardstick-TC014-1456496016450
+++ b/dashboard/Yardstick-TC014-1456496016450
@@ -841,6 +841,113 @@
"type": "table",
"repeatIteration": 1456496008517,
"repeatPanelId": 6
+ },
+ {
+ "columns": [],
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fontSize": "90%",
+ "id": 24,
+ "isNew": true,
+ "links": [],
+ "minSpan": 2,
+ "pageSize": null,
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ }
+ },
+ "scroll": true,
+ "showHeader": true,
+ "sort": {
+ "col": 0,
+ "desc": true
+ },
+ "span": 2,
+ "styles": [
+ {
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "pattern": "Time",
+ "type": "date"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "decimals": 2,
+ "pattern": "deploy_scenario",
+ "thresholds": [],
+ "type": "string",
+ "unit": "short"
+ },
+ {
+ "colorMode": null,
+ "colors": [
+ "rgba(245, 54, 54, 0.9)",
+ "rgba(237, 129, 40, 0.89)",
+ "rgba(50, 172, 45, 0.97)"
+ ],
+ "dateFormat": "YYYY-MM-DD HH:mm:ss",
+ "decimals": 2,
+ "pattern": "/.*/",
+ "thresholds": [],
+ "type": "number",
+ "unit": "short"
+ }
+ ],
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc014",
+ "query": "SELECT \"parallel_score\" FROM \"opnfv_yardstick_tc014\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY \"deploy_scenario\"",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "parallel_score"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "24h",
+ "title": "$POD",
+ "transform": "timeseries_to_rows",
+ "type": "table",
+ "repeatIteration": 1456496008517,
+ "repeatPanelId": 6
}
],
"title": "New row"
@@ -1573,6 +1680,127 @@
],
"repeatIteration": 1456496008517,
"repeatPanelId": 5
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fill": 1,
+ "grid": {
+ "leftLogBase": 1,
+ "leftMax": null,
+ "leftMin": 0,
+ "rightLogBase": 1,
+ "rightMax": null,
+ "rightMin": null,
+ "threshold1": null,
+ "threshold1Color": "rgba(216, 200, 27, 0.27)",
+ "threshold2": null,
+ "threshold2Color": "rgba(234, 112, 112, 0.22)"
+ },
+ "id": 25,
+ "isNew": true,
+ "leftYAxisLabel": "score",
+ "legend": {
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 2,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 5,
+ "points": true,
+ "renderer": "flot",
+ "repeat": null,
+ "scopedVars": {
+ "POD": {
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ }
+ },
+ "seriesOverrides": [
+ {
+ "alias": "os-odl_l2-bgpvpn-ha",
+ "color": "#7EB26D"
+ }
+ ],
+ "span": 2,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_deploy_scenario",
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "deploy_scenario"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "pod_name"
+ ],
+ "type": "tag"
+ }
+ ],
+ "measurement": "opnfv_yardstick_tc014",
+ "query": "SELECT \"single_score\" FROM \"opnfv_yardstick_tc014\" WHERE \"pod_name\" =~ /$POD$/ AND \"deploy_scenario\" =~ /$SCENARIO$/ AND $timeFilter GROUP BY \"deploy_scenario\", \"pod_name\"",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "single_score"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "pod_name",
+ "operator": "=~",
+ "value": "/$POD$/"
+ },
+ {
+ "condition": "AND",
+ "key": "deploy_scenario",
+ "operator": "=~",
+ "value": "/$SCENARIO$/"
+ }
+ ]
+ }
+ ],
+ "timeFrom": "10d",
+ "timeShift": null,
+ "title": "$POD",
+ "tooltip": {
+ "shared": true,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "x-axis": true,
+ "y-axis": true,
+ "y_formats": [
+ "short",
+ "short"
+ ],
+ "repeatIteration": 1456496008517,
+ "repeatPanelId": 5
}
],
"title": "New row"
@@ -1734,14 +1962,15 @@
"allFormat": "regex values",
"current": {
"tags": [],
- "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2",
+ "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2 + zte-pod1",
"value": [
"ericsson\\-pod2",
"huawei\\-us\\-deploy\\-bare\\-1",
"intel\\-pod6",
"opnfv\\-jump\\-1",
"opnfv\\-jump\\-2",
- "orange\\-fr\\-pod2"
+ "orange\\-fr\\-pod2",
+ "zte\\-pod1"
]
},
"datasource": "yardstick-vtc",
@@ -1791,6 +2020,11 @@
"value": "orange\\-fr\\-pod2"
},
{
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ },
+ {
"selected": false,
"text": "unknown",
"value": "unknown"
@@ -1874,4 +2108,4 @@
"schemaVersion": 8,
"version": 13,
"links": []
-} \ No newline at end of file
+}
diff --git a/dashboard/Yardstick-TC037-1456496078470 b/dashboard/Yardstick-TC037-1456496078470
index dae167d88..6072c327b 100644
--- a/dashboard/Yardstick-TC037-1456496078470
+++ b/dashboard/Yardstick-TC037-1456496078470
@@ -1113,14 +1113,15 @@
"allFormat": "regex values",
"current": {
"tags": [],
- "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2",
+ "text": "ericsson-pod2 + huawei-us-deploy-bare-1 + intel-pod6 + opnfv-jump-1 + opnfv-jump-2 + orange-fr-pod2 + zte-pod1",
"value": [
"ericsson\\-pod2",
"huawei\\-us\\-deploy\\-bare\\-1",
"intel\\-pod6",
"opnfv\\-jump\\-1",
"opnfv\\-jump\\-2",
- "orange\\-fr\\-pod2"
+ "orange\\-fr\\-pod2",
+ "zte\\-pod1"
]
},
"datasource": "yardstick-vtc",
@@ -1133,7 +1134,7 @@
{
"selected": false,
"text": "All",
- "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|unknown)"
+ "value": "(elxg482ls42|ericsson\\-pod2|huawei\\-us\\-deploy\\-bare\\-1|intel\\-pod6|opnfv\\-jump\\-1|opnfv\\-jump\\-2|orange\\-fr\\-pod2|zte\\-pod1|unknown)"
},
{
"selected": false,
@@ -1171,6 +1172,11 @@
"value": "orange\\-fr\\-pod2"
},
{
+ "selected": true,
+ "text": "zte-pod1",
+ "value": "zte\\-pod1"
+ },
+ {
"selected": false,
"text": "unknown",
"value": "unknown"
@@ -1252,4 +1258,4 @@
"schemaVersion": 8,
"version": 85,
"links": []
-} \ No newline at end of file
+}
diff --git a/docs/userguide/opnfv_yardstick_tc045.rst b/docs/userguide/opnfv_yardstick_tc045.rst
new file mode 100644
index 000000000..0b0993c34
--- /dev/null
+++ b/docs/userguide/opnfv_yardstick_tc045.rst
@@ -0,0 +1,139 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International
+.. License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) OPNFV, Yin Kanglin and others.
+.. 14_ykl@tongji.edu.cn
+
+*************************************
+Yardstick Test Case Description TC045
+*************************************
+
++-----------------------------------------------------------------------------+
+|Control Node Openstack Service High Availability - Neutron Server |
+| |
++--------------+--------------------------------------------------------------+
+|test case id | OPNFV_YARDSTICK_TC045: Control node Openstack service down - |
+| | neutron server |
++--------------+--------------------------------------------------------------+
+|test purpose | This test case will verify the high availability of the |
+| | network service provided by OpenStack (neutro-server) on |
+| | control node. |
+| | |
++--------------+--------------------------------------------------------------+
+|test method | This test case kills the processes of neutron-server service |
+| | on a selected control node, then checks whether the request |
+| | of the related Openstack command is OK and the killed |
+| | processes are recovered. |
+| | |
++--------------+--------------------------------------------------------------+
+|attackers | In this test case, an attacker called "kill-process" is |
+| | needed. This attacker includes three parameters: |
+| | 1) fault_type: which is used for finding the attacker's |
+| | scripts. It should be always set to "kill-process" in this |
+| | test case. |
+| | 2) process_name: which is the process name of the specified |
+| | OpenStack service. If there are multiple processes use the |
+| | same name on the host, all of them are killed by this |
+| | attacker. |
+| | In this case. This parameter should always set to "neutron- |
+| | server". |
+| | 3) host: which is the name of a control node being attacked. |
+| | |
+| | e.g. |
+| | -fault_type: "kill-process" |
+| | -process_name: "neutron-server" |
+| | -host: node1 |
+| | |
++--------------+--------------------------------------------------------------+
+|monitors | In this test case, two kinds of monitor are needed: |
+| | 1. the "openstack-cmd" monitor constantly request a specific |
+| | Openstack command, which needs two parameters: |
+| | 1) monitor_type: which is used for finding the monitor class |
+| | and related scritps. It should be always set to |
+| | "openstack-cmd" for this monitor. |
+| | 2) command_name: which is the command name used for request. |
+| | In this case, the command name should be neutron related |
+| | commands. |
+| | |
+| | 2. the "process" monitor check whether a process is running |
+| | on a specific node, which needs three parameters: |
+| | 1) monitor_type: which used for finding the monitor class and|
+| | related scritps. It should be always set to "process" |
+| | for this monitor. |
+| | 2) process_name: which is the process name for monitor |
+| | 3) host: which is the name of the node runing the process |
+| | |
+| | e.g. |
+| | monitor1: |
+| | -monitor_type: "openstack-cmd" |
+| | -command_name: "neutron agent-list" |
+| | monitor2: |
+| | -monitor_type: "process" |
+| | -process_name: "neutron-server" |
+| | -host: node1 |
+| | |
++--------------+--------------------------------------------------------------+
+|metrics | In this test case, there are two metrics: |
+| | 1)service_outage_time: which indicates the maximum outage |
+| | time (seconds) of the specified Openstack command request. |
+| | 2)process_recover_time: which indicates the maximun time |
+| | (seconds) from the process being killed to recovered |
+| | |
++--------------+--------------------------------------------------------------+
+|test tool | Developed by the project. Please see folder: |
+| | "yardstick/benchmark/scenarios/availability/ha_tools" |
+| | |
++--------------+--------------------------------------------------------------+
+|references | ETSI NFV REL001 |
+| | |
++--------------+--------------------------------------------------------------+
+|configuration | This test case needs two configuration files: |
+| | 1) test case file: opnfv_yardstick_tc045.yaml |
+| | -Attackers: see above "attackers" discription |
+| | -waiting_time: which is the time (seconds) from the process |
+| | being killed to stoping monitors the monitors |
+| | -Monitors: see above "monitors" discription |
+| | -SLA: see above "metrics" discription |
+| | |
+| | 2)POD file: pod.yaml |
+| | The POD configuration should record on pod.yaml first. |
+| | the "host" item in this test case will use the node name in |
+| | the pod.yaml. |
+| | |
++--------------+--------------------------------------------------------------+
+|test sequence | description and expected result |
+| | |
++--------------+--------------------------------------------------------------+
+|step 1 | start monitors: |
+| | each monitor will run with independently process |
+| | |
+| | Result: The monitor info will be collected. |
+| | |
++--------------+--------------------------------------------------------------+
+|step 2 | do attacker: connect the host through SSH, and then execute |
+| | the kill process script with param value specified by |
+| | "process_name" |
+| | |
+| | Result: Process will be killed. |
+| | |
++--------------+--------------------------------------------------------------+
+|step 3 | stop monitors after a period of time specified by |
+| | "waiting_time" |
+| | |
+| | Result: The monitor info will be aggregated. |
+| | |
++--------------+--------------------------------------------------------------+
+|step 4 | verify the SLA |
+| | |
+| | Result: The test case is passed or not. |
+| | |
++--------------+--------------------------------------------------------------+
+|post-action | It is the action when the test cases exist. It will check the|
+| | status of the specified process on the host, and restart the |
+| | process if it is not running for next test cases |
+| | |
++--------------+--------------------------------------------------------------+
+|test verdict | Fails only if SLA is not passed, or if there is a test case |
+| | execution problem. |
+| | |
++--------------+--------------------------------------------------------------+
diff --git a/samples/cpuload.yaml b/samples/cpuload.yaml
index 7ca528278..21d068205 100644
--- a/samples/cpuload.yaml
+++ b/samples/cpuload.yaml
@@ -10,7 +10,8 @@ scenarios:
-
type: CPUload
options:
- interval: 2
+ interval: 1
+ count: 1
host: apollo.demo
runner:
type: Duration
diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc044.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc044.yaml
new file mode 100644
index 000000000..d7406832d
--- /dev/null
+++ b/tests/opnfv/test_cases/opnfv_yardstick_tc044.yaml
@@ -0,0 +1,87 @@
+---
+# Yardstick TC044 config file
+# Measure memory usage statistics, network throughput, latency and packet loss.
+# Different amounts of flows are tested with, from 2 up to 1001000.
+# All tests are run 2 times each. First 2 times with the least
+# amount of ports, then 2 times with the next amount of ports,
+# and so on until all packet sizes have been run with.
+#
+# During the measurements memory usage statistics and network latency are
+# recorded/measured using sar and ping, respectively.
+
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+ type: MEMORYload
+ run_in_background: true
+
+ options:
+ interval: 1
+ count: 1
+
+ host: demeter.yardstick-TC044
+-
+ type: MEMORYload
+ run_in_background: true
+
+ options:
+ interval: 1
+ count: 1
+
+ host: poseidon.yardstick-TC044
+-
+ type: Ping
+ run_in_background: true
+
+ options:
+ packetsize: 100
+
+ host: demeter.yardstick-TC044
+ target: poseidon.yardstick-TC044
+
+ sla:
+ max_rtt: 10
+ action: monitor
+{% for num_ports in [1, 10, 50, 100, 300, 500, 750, 1000] %}
+-
+ type: Pktgen
+ options:
+ packetsize: 64
+ number_of_ports: {{num_ports}}
+ duration: 20
+
+ host: demeter.yardstick-TC044
+ target: poseidon.yardstick-TC044
+
+ runner:
+ type: Iteration
+ iterations: 2
+ interval: 1
+
+ sla:
+ max_ppm: 1000
+ action: monitor
+{% endfor %}
+
+context:
+ name: yardstick-TC044
+ image: yardstick-trusty-server
+ flavor: yardstick-flavor
+ user: ubuntu
+
+ placement_groups:
+ pgrp1:
+ policy: "availability"
+
+ servers:
+ demeter:
+ floating_ip: true
+ placement: "pgrp1"
+ poseidon:
+ floating_ip: true
+ placement: "pgrp1"
+
+ networks:
+ test:
+ cidr: '10.0.1.0/24'
diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml
new file mode 100644
index 000000000..812d53dd8
--- /dev/null
+++ b/tests/opnfv/test_cases/opnfv_yardstick_tc045.yaml
@@ -0,0 +1,43 @@
+---
+# Test case for TC045 :Control node Openstack service down - neutron server
+
+schema: "yardstick:task:0.1"
+
+scenarios:
+-
+ type: ServiceHA
+ options:
+ attackers:
+ - fault_type: "kill-process"
+ process_name: "neutron-server"
+ host: node1
+
+ monitors:
+ - monitor_type: "openstack-cmd"
+ command_name: "neutron agent-list"
+ monitor_time: 10
+ sla:
+ max_outage_time: 5
+ - monitor_type: "process"
+ process_name: "neutron-server"
+ host: node1
+ monitor_time: 10
+ sla:
+ max_recover_time: 5
+
+ nodes:
+ node1: node1.LF
+
+ runner:
+ type: Duration
+ duration: 1
+ sla:
+ outage_time: 5
+ action: monitor
+
+
+context:
+ type: Node
+ name: LF
+ file: /root/yardstick/etc/yardstick/nodes/fuel_virtual/pod.yaml
+
diff --git a/tests/opnfv/test_suites/fuel_test_suite.yaml b/tests/opnfv/test_suites/fuel_test_suite.yaml
new file mode 100644
index 000000000..016bf0953
--- /dev/null
+++ b/tests/opnfv/test_suites/fuel_test_suite.yaml
@@ -0,0 +1,12 @@
+---
+# Fuel integration test task suite
+
+schema: "yardstick:suite:0.1"
+
+name: "fuel_test_suite"
+test_cases_dir: "samples/"
+test_cases:
+-
+ file_name: ping.yaml
+-
+ file_name: iperf3.yaml
diff --git a/tests/opnfv/test_suites/opnfv_huawei-pod2_daily.yaml b/tests/opnfv/test_suites/opnfv_huawei-pod2_daily.yaml
index 3a3bfccc0..435d21c9e 100644
--- a/tests/opnfv/test_suites/opnfv_huawei-pod2_daily.yaml
+++ b/tests/opnfv/test_suites/opnfv_huawei-pod2_daily.yaml
@@ -19,6 +19,4 @@ test_cases:
-
file_name: opnfv_yardstick_tc014.yaml
-
- file_name: opnfv_yardstick_tc027.yaml
--
file_name: opnfv_yardstick_tc037.yaml
diff --git a/tests/unit/benchmark/scenarios/availability/test_baseresultchecker.py b/tests/unit/benchmark/scenarios/availability/test_baseresultchecker.py
new file mode 100644
index 000000000..9972d6b1b
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/availability/test_baseresultchecker.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2016 Huan Li and others
+# lihuansse@tongji.edu.cn
+# 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
+##############################################################################
+
+# Unittest for yardstick.benchmark.scenarios.availability.result_checker
+# .baseresultchecker
+
+import mock
+import unittest
+
+from yardstick.benchmark.scenarios.availability.result_checker import baseresultchecker
+
+
+@mock.patch('yardstick.benchmark.scenarios.availability.result_checker'
+ '.baseresultchecker.BaseResultChecker')
+class ResultCheckerMgrTestCase(unittest.TestCase):
+
+ def setUp(self):
+ config = {
+ 'checker_type': 'general-result-checker',
+ 'key' : 'process-checker'
+ }
+
+ self.checker_configs = []
+ self.checker_configs.append(config)
+
+ def test_ResultCheckerMgr_setup_successful(self, mock_basechacer):
+ mgr_ins = baseresultchecker.ResultCheckerMgr()
+ mgr_ins.init_ResultChecker(self.checker_configs, None)
+ mgr_ins.verify()
+
+ def test_getitem_succeessful(self, mock_basechacer):
+ mgr_ins = baseresultchecker.ResultCheckerMgr()
+ mgr_ins.init_ResultChecker(self.checker_configs, None)
+ checker_ins = mgr_ins["process-checker"]
+
+ def test_getitem_fail(self, mock_basechacer):
+ mgr_ins = baseresultchecker.ResultCheckerMgr()
+ mgr_ins.init_ResultChecker(self.checker_configs, None)
+ with self.assertRaises(KeyError):
+ checker_ins = mgr_ins["checker-not-exist"]
+
+
+class BaseResultCheckerTestCase(unittest.TestCase):
+
+ class ResultCheckeSimple(baseresultchecker.BaseResultChecker):
+ __result_checker__type__ = "ResultCheckeForTest"
+ def setup(self):
+ self.success = False
+
+ def verify(self):
+ return self.success
+
+ def setUp(self):
+ self.checker_cfg = {
+ 'checker_type': 'general-result-checker',
+ 'key' : 'process-checker'
+ }
+
+ def test_baseresultchecker_setup_verify_successful(self):
+ ins = baseresultchecker.BaseResultChecker(self.checker_cfg, None)
+ ins.setup()
+ ins.verify()
+
+ def test_baseresultchecker_verfiy_pass(self):
+ ins = baseresultchecker.BaseResultChecker(self.checker_cfg, None)
+ ins.setup()
+ ins.actualResult = True
+ ins.expectedResult = True
+ ins.verify()
+
+ def test_get_script_fullpath(self):
+ ins = baseresultchecker.BaseResultChecker(self.checker_cfg, None)
+ path = ins.get_script_fullpath("test.bash")
+
+ def test_get_resultchecker_cls_successful(self):
+ baseresultchecker.BaseResultChecker.get_resultchecker_cls("ResultCheckeForTest")
+
+ def test_get_resultchecker_cls_fail(self):
+ with self.assertRaises(RuntimeError):
+ baseresultchecker.BaseResultChecker.get_resultchecker_cls("ResultCheckeNotExist")
diff --git a/tests/unit/benchmark/scenarios/availability/test_director.py b/tests/unit/benchmark/scenarios/availability/test_director.py
new file mode 100644
index 000000000..887ddd631
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/availability/test_director.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2016 Huan Li and others
+# lihuansse@tongji.edu.cn
+# 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
+##############################################################################
+
+# Unittest for yardstick.benchmark.scenarios.availability.director
+
+import mock
+import unittest
+
+from yardstick.benchmark.scenarios.availability.director import Director
+from yardstick.benchmark.scenarios.availability import actionplayers
+
+
+@mock.patch('yardstick.benchmark.scenarios.availability.director.basemonitor')
+@mock.patch('yardstick.benchmark.scenarios.availability.director.baseattacker')
+@mock.patch('yardstick.benchmark.scenarios.availability.director.baseoperation')
+@mock.patch('yardstick.benchmark.scenarios.availability.director.baseresultchecker')
+class DirectorTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.scenario_cfg = {
+ 'type': "general_scenario",
+ 'options': {
+ 'attackers':[{
+ 'fault_type': "general-attacker",
+ 'key': "kill-process"}],
+ 'monitors': [{
+ 'monitor_type': "general-monitor",
+ 'key': "service_status"}],
+ 'operations': [{
+ 'operation_type': 'general-operation',
+ 'key' : 'service_status'}],
+ 'resultCheckers': [{
+ 'checker_type': 'general-result-checker',
+ 'key' : 'process-checker',}],
+ 'steps':[
+ {
+ 'actionKey': "service_status",
+ 'actionType': "operation",
+ 'index': 1},
+ {
+ 'actionKey': "kill-process",
+ 'actionType': "attacker",
+ 'index': 2},
+ {
+ 'actionKey': "process-checker",
+ 'actionType': "resultchecker",
+ 'index': 3},
+ {
+ 'actionKey': "service_status",
+ 'actionType': "monitor",
+ 'index': 4},
+ ]
+ }
+ }
+ host = {
+ "ip": "10.20.0.5",
+ "user": "root",
+ "key_filename": "/root/.ssh/id_rsa"
+ }
+ self.ctx = {"nodes": {"node1": host}}
+
+ def test_director_all_successful(self, mock_checer, mock_opertion, mock_attacker, mock_monitor):
+ ins = Director(self.scenario_cfg, self.ctx)
+ opertion_action = ins.createActionPlayer("operation", "service_status")
+ attacker_action = ins.createActionPlayer("attacker", "kill-process")
+ checker_action = ins.createActionPlayer("resultchecker", "process-checker")
+ monitor_action = ins.createActionPlayer("monitor", "service_status")
+
+ opertion_rollback = ins.createActionRollbacker("operation", "service_status")
+ attacker_rollback = ins.createActionRollbacker("attacker", "kill-process")
+ ins.executionSteps.append(opertion_rollback)
+ ins.executionSteps.append(attacker_rollback)
+
+ opertion_action.action()
+ attacker_action.action()
+ checker_action.action()
+ monitor_action.action()
+
+ attacker_rollback.rollback()
+ opertion_rollback.rollback()
+
+ ins.stopMonitors()
+ ins.verify()
+ ins.knockoff()
+
+ def test_director_get_wrong_item(self, mock_checer, mock_opertion, mock_attacker, mock_monitor):
+ ins = Director(self.scenario_cfg, self.ctx)
+ ins.createActionPlayer("wrong_type", "wrong_key")
+ ins.createActionRollbacker("wrong_type", "wrong_key")
+
+
+
+
+
+
diff --git a/tests/unit/benchmark/scenarios/availability/test_result_checker_general.py b/tests/unit/benchmark/scenarios/availability/test_result_checker_general.py
new file mode 100644
index 000000000..88a9b9d20
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/availability/test_result_checker_general.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2016 Huan Li and others
+# lihuansse@tongji.edu.cn
+# 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
+##############################################################################
+
+# Unittest for yardstick.benchmark.scenarios.availability.result_checker
+# .result_checker_general
+
+import mock
+import unittest
+import copy
+
+from yardstick.benchmark.scenarios.availability.result_checker import result_checker_general
+
+
+@mock.patch('yardstick.benchmark.scenarios.availability.result_checker.'
+ 'result_checker_general.ssh')
+@mock.patch('yardstick.benchmark.scenarios.availability.result_checker.'
+ 'result_checker_general.open')
+class GeneralResultCheckerTestCase(unittest.TestCase):
+
+ def setUp(self):
+ host = {
+ "ip": "10.20.0.5",
+ "user": "root",
+ "key_filename": "/root/.ssh/id_rsa"
+ }
+ self.context = {"node1": host}
+ self.checker_cfg = {
+ 'parameter': {'processname': 'process'},
+ 'checker_type': 'general-result-checker',
+ 'condition' : 'eq',
+ 'expectedValue' : 1,
+ 'key' : 'process-checker',
+ 'host': 'node1'
+ }
+
+ def test__result_checker_eq(self, mock_open, mock_ssh):
+ ins = result_checker_general.GeneralResultChecker(self.checker_cfg,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (0, "1", '')
+ ins.setup()
+ self.assertTrue(ins.verify())
+
+ def test__result_checker_gt(self, mock_open, mock_ssh):
+ config = copy.deepcopy(self.checker_cfg)
+ config['condition'] = 'gt'
+ ins = result_checker_general.GeneralResultChecker(config,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (0, "2", '')
+ ins.setup()
+ self.assertTrue(ins.verify())
+
+ def test__result_checker_gt_eq(self, mock_open, mock_ssh):
+ config = copy.deepcopy(self.checker_cfg)
+ config['condition'] = 'gt_eq'
+ ins = result_checker_general.GeneralResultChecker(config,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (0, "1", '')
+ ins.setup()
+ self.assertTrue(ins.verify())
+
+ def test__result_checker_lt(self, mock_open, mock_ssh):
+ config = copy.deepcopy(self.checker_cfg)
+ config['condition'] = 'lt'
+ ins = result_checker_general.GeneralResultChecker(config,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (0, "0", '')
+ ins.setup()
+ self.assertTrue(ins.verify())
+
+ def test__result_checker_lt_eq(self, mock_open, mock_ssh):
+ config = copy.deepcopy(self.checker_cfg)
+ config['condition'] = 'lt_eq'
+ ins = result_checker_general.GeneralResultChecker(config,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (0, "1", '')
+ ins.setup()
+ self.assertTrue(ins.verify())
+
+ def test__result_checker_in(self, mock_open, mock_ssh):
+ config = copy.deepcopy(self.checker_cfg)
+ config['condition'] = 'in'
+ config['expectedValue'] = "value"
+ ins = result_checker_general.GeneralResultChecker(config,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (0, "value return", '')
+ ins.setup()
+ self.assertTrue(ins.verify())
+
+ def test__result_checker_wrong(self, mock_open, mock_ssh):
+ config = copy.deepcopy(self.checker_cfg)
+ config['condition'] = 'wrong'
+ ins = result_checker_general.GeneralResultChecker(config,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (0, "1", '')
+ ins.setup()
+ self.assertFalse(ins.verify())
+
+ def test__result_checker_fail(self, mock_open, mock_ssh):
+ config = copy.deepcopy(self.checker_cfg)
+ config.pop('parameter')
+ ins = result_checker_general.GeneralResultChecker(config,
+ self.context);
+ mock_ssh.SSH().execute.return_value = (1, "fail", '')
+ ins.setup()
+ ins.verify() \ No newline at end of file
diff --git a/tests/unit/benchmark/scenarios/availability/test_scenario_general.py b/tests/unit/benchmark/scenarios/availability/test_scenario_general.py
new file mode 100644
index 000000000..c17edea45
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/availability/test_scenario_general.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2016 Huan Li and others
+# lihuansse@tongji.edu.cn
+# 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
+##############################################################################
+
+# Unittest for yardstick.benchmark.scenarios.availability.scenario_general
+
+import mock
+import unittest
+
+from yardstick.benchmark.scenarios.availability.scenario_general import ScenarioGeneral
+
+
+@mock.patch('yardstick.benchmark.scenarios.availability.scenario_general.Director')
+class ScenarioGeneralTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.scenario_cfg = {
+ 'type': "general_scenario",
+ 'options': {
+ 'attackers':[{
+ 'fault_type': "general-attacker",
+ 'key': "kill-process"}],
+ 'monitors': [{
+ 'monitor_type': "general-monitor",
+ 'key': "service_status"}],
+ 'steps':[
+ {
+ 'actionKey': "kill-process",
+ 'actionType': "attacker",
+ 'index': 1},
+ {
+ 'actionKey': "service_status",
+ 'actionType': "monitor",
+ 'index': 2}]
+ }
+ }
+
+ def test_scenario_general_all_successful(self, mock_director):
+ ins = ScenarioGeneral(self.scenario_cfg, None)
+ ins.setup()
+ ins.run(None)
+ ins.teardown()
+
+ def test_scenario_general_exception(self, mock_director):
+ ins = ScenarioGeneral(self.scenario_cfg, None)
+ mock_obj = mock.Mock()
+ mock_obj.createActionPlayer.side_effect = KeyError('Wrong')
+ ins.director = mock_obj
+ ins.run(None)
+ ins.teardown()
+
+ def test_scenario_general_case_fail(self, mock_director):
+ ins = ScenarioGeneral(self.scenario_cfg, None)
+ mock_obj = mock.Mock()
+ mock_obj.verify.return_value = False
+ ins.director = mock_obj
+ ins.run(None)
+ ins.teardown() \ No newline at end of file
diff --git a/tests/unit/benchmark/scenarios/compute/cpuload_sample_output1.txt b/tests/unit/benchmark/scenarios/compute/cpuload_sample_output1.txt
index b1723ae17..723e64bcb 100644
--- a/tests/unit/benchmark/scenarios/compute/cpuload_sample_output1.txt
+++ b/tests/unit/benchmark/scenarios/compute/cpuload_sample_output1.txt
@@ -1,5 +1,9 @@
-Linux 3.13.0-68-generic (elxg482ls42) 11/30/2015 _x86_64_ (12 CPU)
+Linux 3.13.0-68-generic (elxg482ls42) 11/30/2015 _x86_64_ (1 CPU)
-04:53:04 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
-04:53:04 PM all 11.31 0.03 1.19 0.18 0.00 0.01 0.00 5.51 0.00 81.77
-04:53:04 PM 0 20.03 0.03 1.36 0.33 0.00 0.06 0.00 6.62 0.00 71.56
+04:34:26 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
+04:34:26 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
+04:34:26 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
+
+Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
+Average: all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
+Average: 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
diff --git a/tests/unit/benchmark/scenarios/compute/test_cpuload.py b/tests/unit/benchmark/scenarios/compute/test_cpuload.py
index 22c4419b2..77f2a02d8 100644
--- a/tests/unit/benchmark/scenarios/compute/test_cpuload.py
+++ b/tests/unit/benchmark/scenarios/compute/test_cpuload.py
@@ -33,7 +33,14 @@ class CPULoadTestCase(unittest.TestCase):
self.result = {}
def test_setup_mpstat_installed(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ options = {
+ "interval": 1,
+ "count": 1
+ }
+
+ args = {'options': options}
+
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (0, '', '')
l.setup()
@@ -42,7 +49,14 @@ class CPULoadTestCase(unittest.TestCase):
self.assertTrue(l.has_mpstat)
def test_setup_mpstat_not_installed(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ options = {
+ "interval": 1,
+ "count": 1
+ }
+
+ args = {'options': options}
+
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (127, '', '')
l.setup()
@@ -51,7 +65,14 @@ class CPULoadTestCase(unittest.TestCase):
self.assertFalse(l.has_mpstat)
def test_execute_command_success(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ options = {
+ "interval": 1,
+ "count": 1
+ }
+
+ args = {'options': options}
+
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (0, '', '')
l.setup()
@@ -61,7 +82,14 @@ class CPULoadTestCase(unittest.TestCase):
self.assertEqual(result, expected_result)
def test_execute_command_failed(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ options = {
+ "interval": 1,
+ "count": 1
+ }
+
+ args = {'options': options}
+
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (0, '', '')
l.setup()
@@ -70,7 +98,14 @@ class CPULoadTestCase(unittest.TestCase):
"cat /proc/loadavg")
def test_get_loadavg(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ options = {
+ "interval": 1,
+ "count": 1
+ }
+
+ args = {'options': options}
+
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (0, '', '')
l.setup()
@@ -82,44 +117,63 @@ class CPULoadTestCase(unittest.TestCase):
self.assertEqual(result, expected_result)
def test_get_cpu_usage_mpstat(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ options = {
+ "interval": 1,
+ "count": 1
+ }
+
+ args = {'options': options}
+
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (0, '', '')
l.setup()
- l.interval = 0
+ l.interval = 1
+ l.count = 1
mpstat_output = self._read_file("cpuload_sample_output1.txt")
mock_ssh.SSH().execute.return_value = (0, mpstat_output, '')
result = l._get_cpu_usage_mpstat()
expected_result = \
- {'mpstat':
- {'cpu':
- {'%gnice': '0.00',
- '%guest': '5.51',
- '%idle': '81.77',
- '%iowait': '0.18',
- '%irq': '0.00',
- '%nice': '0.03',
- '%soft': '0.01',
- '%steal': '0.00',
- '%sys': '1.19',
- '%usr': '11.31'},
- 'cpu0':
- {'%gnice': '0.00',
- '%guest': '6.62',
- '%idle': '71.56',
- '%iowait': '0.33',
- '%irq': '0.00',
- '%nice': '0.03',
- '%soft': '0.06',
- '%steal': '0.00',
- '%sys': '1.36',
- '%usr': '20.03'}}}
+ {"mpstat_minimum":
+ {"cpu": {"%steal": "0.00", "%usr": "0.00", "%gnice": "0.00",
+ "%idle": "100.00", "%guest": "0.00",
+ "%iowait": "0.00", "%sys": "0.00", "%soft": "0.00",
+ "%irq": "0.00", "%nice": "0.00"},
+ "cpu0": {"%steal": "0.00", "%usr": "0.00", "%gnice": "0.00",
+ "%idle": "100.00", "%guest": "0.00",
+ "%iowait": "0.00", "%sys": "0.00", "%soft": "0.00",
+ "%irq": "0.00", "%nice": "0.00"}},
+ "mpstat_average":
+ {"cpu": {"%steal": "0.00", "%usr": "0.00", "%gnice": "0.00",
+ "%idle": "100.00", "%guest": "0.00",
+ "%iowait": "0.00", "%sys": "0.00", "%soft": "0.00",
+ "%irq": "0.00", "%nice": "0.00"},
+ "cpu0": {"%steal": "0.00", "%usr": "0.00", "%gnice": "0.00",
+ "%idle": "100.00", "%guest": "0.00",
+ "%iowait": "0.00", "%sys": "0.00", "%soft": "0.00",
+ "%irq": "0.00", "%nice": "0.00"}},
+ "mpstat_maximun":
+ {"cpu": {"%steal": "0.00", "%usr": "0.00", "%gnice": "0.00",
+ "%idle": "100.00", "%guest": "0.00",
+ "%iowait": "0.00", "%sys": "0.00", "%soft": "0.00",
+ "%irq": "0.00", "%nice": "0.00"},
+ "cpu0": {"%steal": "0.00", "%usr": "0.00", "%gnice": "0.00",
+ "%idle": "100.00", "%guest": "0.00",
+ "%iowait": "0.00", "%sys": "0.00", "%soft": "0.00",
+ "%irq": "0.00", "%nice": "0.00"}}}
self.assertDictEqual(result, expected_result)
def test_get_cpu_usage(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ options = {
+ "interval": 0,
+ "count": 1
+ }
+
+ args = {'options': options}
+
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (0, '', '')
l.setup()
@@ -154,45 +208,16 @@ class CPULoadTestCase(unittest.TestCase):
'%nice': '0.03'}}}
self.assertDictEqual(result, expected_result)
+
+ def test_run_proc_stat(self, mock_ssh):
+ options = {
+ "interval": 1,
+ "count": 1
+ }
- def test_run_mpstat(self, mock_ssh):
- l = cpuload.CPULoad({'options': {'interval': 1}}, self.ctx)
- mock_ssh.SSH().execute.return_value = (0, '', '')
-
- mpstat_output = self._read_file("cpuload_sample_output1.txt")
- mock_ssh.SSH().execute.side_effect = \
- [(0, '', ''), (0, '1.50 1.45 1.51 3/813 14322', ''), (0, mpstat_output, '')]
-
- l.run(self.result)
-
- expected_result = {
- 'loadavg': ['1.50', '1.45', '1.51', '3/813', '14322'],
- 'mpstat':
- {'cpu': {'%gnice': '0.00',
- '%guest': '5.51',
- '%idle': '81.77',
- '%iowait': '0.18',
- '%irq': '0.00',
- '%nice': '0.03',
- '%soft': '0.01',
- '%steal': '0.00',
- '%sys': '1.19',
- '%usr': '11.31'},
- 'cpu0': {'%gnice': '0.00',
- '%guest': '6.62',
- '%idle': '71.56',
- '%iowait': '0.33',
- '%irq': '0.00',
- '%nice': '0.03',
- '%soft': '0.06',
- '%steal': '0.00',
- '%sys': '1.36',
- '%usr': '20.03'}}}
-
- self.assertDictEqual(self.result, expected_result)
+ args = {'options': options}
- def test_run_proc_stat(self, mock_ssh):
- l = cpuload.CPULoad({}, self.ctx)
+ l = cpuload.CPULoad(args, self.ctx)
mock_ssh.SSH().execute.return_value = (1, '', '')
l.setup()
diff --git a/tests/unit/benchmark/scenarios/networking/test_vsperf.py b/tests/unit/benchmark/scenarios/networking/test_vsperf.py
new file mode 100644
index 000000000..cb5c09ab3
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/networking/test_vsperf.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+
+# Copyright 2016 Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Unittest for yardstick.benchmark.scenarios.networking.vsperf.Vsperf
+
+import mock
+import unittest
+import os
+import subprocess
+
+from yardstick.benchmark.scenarios.networking import vsperf
+
+
+@mock.patch('yardstick.benchmark.scenarios.networking.vsperf.subprocess')
+@mock.patch('yardstick.benchmark.scenarios.networking.vsperf.ssh')
+@mock.patch("__builtin__.open", return_value=None)
+class VsperfTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.ctx = {
+ "host": {
+ "ip": "10.229.47.137",
+ "user": "ubuntu",
+ "password": "ubuntu",
+ },
+ }
+ self.args = {
+ 'options': {
+ 'testname': 'rfc2544_p2p_continuous',
+ 'traffic_type': 'continuous',
+ 'pkt_sizes': '64',
+ 'bidirectional': 'True',
+ 'iload': 100,
+ 'duration': 29,
+ 'trafficgen_port1': 'eth1',
+ 'trafficgen_port2': 'eth3',
+ 'external_bridge': 'br-ex',
+ 'conf-file': 'vsperf-yardstick.conf',
+ 'setup-script': 'setup_yardstick.sh',
+ },
+ 'sla': {
+ 'metrics': 'throughput_rx_fps',
+ 'throughput_rx_fps': 500000,
+ 'action': 'monitor',
+ }
+ }
+
+ def test_vsperf_setup(self, mock_open, mock_ssh, mock_subprocess):
+ p = vsperf.Vsperf(self.args, self.ctx)
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ mock_subprocess.call().execute.return_value = None
+
+ p.setup()
+ self.assertIsNotNone(p.client)
+ self.assertEqual(p.setup_done, True)
+
+ def test_vsperf_teardown(self, mock_open, mock_ssh, mock_subprocess):
+ p = vsperf.Vsperf(self.args, self.ctx)
+
+ # setup() specific mocks
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ mock_subprocess.call().execute.return_value = None
+
+ p.setup()
+ self.assertIsNotNone(p.client)
+ self.assertEqual(p.setup_done, True)
+
+ p.teardown()
+ self.assertEqual(p.setup_done, False)
+
+ def test_vsperf_run_ok(self, mock_open, mock_ssh, mock_subprocess):
+ p = vsperf.Vsperf(self.args, self.ctx)
+
+ # setup() specific mocks
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ mock_subprocess.call().execute.return_value = None
+
+ # run() specific mocks
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ mock_ssh.SSH().execute.return_value = (0, 'throughput_rx_fps\r\n14797660.000\r\n', '')
+
+ result = {}
+ p.run(result)
+
+ self.assertEqual(result['throughput_rx_fps'], '14797660.000')
+
+ def test_vsperf_run_falied_vsperf_execution(self, mock_open, mock_ssh, mock_subprocess):
+ p = vsperf.Vsperf(self.args, self.ctx)
+
+ # setup() specific mocks
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ mock_subprocess.call().execute.return_value = None
+
+ # run() specific mocks
+ mock_ssh.SSH().execute.return_value = (1, '', '')
+
+ result = {}
+ self.assertRaises(RuntimeError, p.run, result)
+
+ def test_vsperf_run_falied_csv_report(self, mock_open, mock_ssh, mock_subprocess):
+ p = vsperf.Vsperf(self.args, self.ctx)
+
+ # setup() specific mocks
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ mock_subprocess.call().execute.return_value = None
+
+ # run() specific mocks
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ mock_ssh.SSH().execute.return_value = (1, '', '')
+
+ result = {}
+ self.assertRaises(RuntimeError, p.run, result)
+
+
+def main():
+ unittest.main()
+
+if __name__ == '__main__':
+ main()
diff --git a/yardstick/benchmark/scenarios/availability/__init__.py b/yardstick/benchmark/scenarios/availability/__init__.py
index e69de29bb..c3b3aae30 100755
--- a/yardstick/benchmark/scenarios/availability/__init__.py
+++ b/yardstick/benchmark/scenarios/availability/__init__.py
@@ -0,0 +1,24 @@
+##############################################################################
+# Copyright (c) 2016 Juan Qiu and others
+# juan_ qiu@tongji.edu.cn
+# 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
+##############################################################################
+
+
+class ActionType:
+ ATTACKER = "attacker"
+ MONITOR = "monitor"
+ RESULTCHECKER = "resultchecker"
+ OPERATION = "operation"
+
+
+class Condition:
+ EQUAL = "eq"
+ GREATERTHAN = "gt"
+ GREATERTHANEQUAL = "gt_eq"
+ LESSTHAN = "lt"
+ LESSTHANEQUAL = "lt_eq"
+ IN = "in"
diff --git a/yardstick/benchmark/scenarios/availability/actionplayers.py b/yardstick/benchmark/scenarios/availability/actionplayers.py
new file mode 100644
index 000000000..420626413
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/actionplayers.py
@@ -0,0 +1,54 @@
+##############################################################################
+# Copyright (c) 2016 Juan Qiu and others
+# juan_ qiu@tongji.edu.cn
+# 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
+##############################################################################
+
+
+class ActionPlayer(object):
+ """
+ Abstract the action functions of attacker,
+ monitor, operation, resultchecker and mybe others in future
+ """
+
+ def action(self):
+ pass
+
+
+class AttackerPlayer(ActionPlayer):
+
+ def __init__(self, attacker):
+ self.underlyingAttacker = attacker
+
+ def action(self):
+ self.underlyingAttacker.inject_fault()
+
+
+class OperationPlayer(ActionPlayer):
+
+ def __init__(self, operation):
+ self.underlyingOperation = operation
+
+ def action(self):
+ self.underlyingOperation.run()
+
+
+class MonitorPlayer(ActionPlayer):
+
+ def __init__(self, monitor):
+ self.underlyingmonitor = monitor
+
+ def action(self):
+ self.underlyingmonitor.start_monitor()
+
+
+class ResultCheckerPlayer(ActionPlayer):
+
+ def __init__(self, resultChecker):
+ self.underlyingresultChecker = resultChecker
+
+ def action(self):
+ self.underlyingresultChecker.verify()
diff --git a/yardstick/benchmark/scenarios/availability/actionrollbackers.py b/yardstick/benchmark/scenarios/availability/actionrollbackers.py
new file mode 100644
index 000000000..4b732a10c
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/actionrollbackers.py
@@ -0,0 +1,45 @@
+##############################################################################
+# Copyright (c) 2016 Juan Qiu and others
+# juan_ qiu@tongji.edu.cn
+# 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
+
+LOG = logging.getLogger(__name__)
+
+
+class ActionRollbacker(object):
+ """
+ Abstract the rollback functions of attacker, operation
+ and mybe others in future
+ """
+
+ def rollback(self):
+ pass
+
+
+class AttackerRollbacker(ActionRollbacker):
+
+ def __init__(self, attacker):
+ self.underlyingAttacker = attacker
+
+ def rollback(self):
+ LOG.debug(
+ "\033[93m recovering attacker %s \033[0m"
+ % (self.underlyingAttacker.key))
+ self.underlyingAttacker.recover()
+
+
+class OperationRollbacker(ActionRollbacker):
+
+ def __init__(self, operation):
+ self.underlyingOperation = operation
+
+ def rollback(self):
+ LOG.debug(
+ "\033[93m rollback operation %s \033[0m"
+ % (self.underlyingOperation.key))
+ self.underlyingOperation.rollback()
diff --git a/yardstick/benchmark/scenarios/availability/director.py b/yardstick/benchmark/scenarios/availability/director.py
new file mode 100644
index 000000000..267933dd0
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/director.py
@@ -0,0 +1,106 @@
+##############################################################################
+# Copyright (c) 2016 Juan Qiu and others
+# juan_ qiu@tongji.edu.cn
+# 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
+
+from yardstick.benchmark.scenarios.availability.monitor import basemonitor
+from yardstick.benchmark.scenarios.availability.attacker import baseattacker
+from yardstick.benchmark.scenarios.availability.operation import baseoperation
+from yardstick.benchmark.scenarios.availability.result_checker \
+ import baseresultchecker
+from yardstick.benchmark.scenarios.availability import ActionType
+from yardstick.benchmark.scenarios.availability import actionplayers
+from yardstick.benchmark.scenarios.availability import actionrollbackers
+
+LOG = logging.getLogger(__name__)
+
+
+class Director(object):
+ """
+ Director is used to direct a test scenaio
+ including the creation of action players, test result verification
+ and rollback of actions.
+ """
+
+ def __init__(self, scenario_cfg, context_cfg):
+
+ # A stack store Rollbacker that will be called after
+ # all actionplayers finish.
+ self.executionSteps = []
+
+ self.scenario_cfg = scenario_cfg
+ self.context_cfg = context_cfg
+ nodes = self.context_cfg.get("nodes", None)
+ # setup attackers
+ if "attackers" in self.scenario_cfg["options"]:
+ LOG.debug("start init attackers...")
+ attacker_cfgs = self.scenario_cfg["options"]["attackers"]
+ self.attackerMgr = baseattacker.AttackerMgr()
+ self.attackerMgr.init_attackers(attacker_cfgs, nodes)
+ # setup monitors
+ if "monitors" in self.scenario_cfg["options"]:
+ LOG.debug("start init monitors...")
+ monitor_cfgs = self.scenario_cfg["options"]["monitors"]
+ self.monitorMgr = basemonitor.MonitorMgr()
+ self.monitorMgr.init_monitors(monitor_cfgs, nodes)
+ # setup operations
+ if "operations" in self.scenario_cfg["options"]:
+ LOG.debug("start init operations...")
+ operation_cfgs = self.scenario_cfg["options"]["operations"]
+ self.operationMgr = baseoperation.OperationMgr()
+ self.operationMgr.init_operations(operation_cfgs, nodes)
+ # setup result checker
+ if "resultCheckers" in self.scenario_cfg["options"]:
+ LOG.debug("start init resultCheckers...")
+ result_check_cfgs = self.scenario_cfg["options"]["resultCheckers"]
+ self.resultCheckerMgr = baseresultchecker.ResultCheckerMgr()
+ self.resultCheckerMgr.init_ResultChecker(result_check_cfgs, nodes)
+
+ def createActionPlayer(self, type, key):
+ LOG.debug(
+ "the type of current action is %s, the key is %s" % (type, key))
+ if type == ActionType.ATTACKER:
+ return actionplayers.AttackerPlayer(self.attackerMgr[key])
+ if type == ActionType.MONITOR:
+ return actionplayers.MonitorPlayer(self.monitorMgr[key])
+ if type == ActionType.RESULTCHECKER:
+ return actionplayers.ResultCheckerPlayer(
+ self.resultCheckerMgr[key])
+ if type == ActionType.OPERATION:
+ return actionplayers.OperationPlayer(self.operationMgr[key])
+ LOG.debug("something run when creatactionplayer")
+
+ def createActionRollbacker(self, type, key):
+ LOG.debug(
+ "the type of current action is %s, the key is %s" % (type, key))
+ if type == ActionType.ATTACKER:
+ return actionrollbackers.AttackerRollbacker(self.attackerMgr[key])
+ if type == ActionType.OPERATION:
+ return actionrollbackers.OperationRollbacker(
+ self.operationMgr[key])
+ LOG.debug("no rollbacker created for %s" % (key))
+
+ def verify(self):
+ result = True
+ if hasattr(self, 'monitorMgr'):
+ result &= self.monitorMgr.verify_SLA()
+ if hasattr(self, 'resultCheckerMgr'):
+ result &= self.resultCheckerMgr.verify()
+ if result:
+ LOG.debug("monitors are passed")
+ return result
+
+ def stopMonitors(self):
+ if "monitors" in self.scenario_cfg["options"]:
+ self.monitorMgr.wait_monitors()
+
+ def knockoff(self):
+ LOG.debug("knock off ....")
+ while self.executionSteps:
+ singleStep = self.executionSteps.pop()
+ singleStep.rollback()
diff --git a/yardstick/benchmark/scenarios/availability/result_checker/__init__.py b/yardstick/benchmark/scenarios/availability/result_checker/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/result_checker/__init__.py
diff --git a/yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py b/yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py
new file mode 100644
index 000000000..1bdb9f2c2
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/result_checker/baseresultchecker.py
@@ -0,0 +1,88 @@
+##############################################################################
+# Copyright (c) 2016 Juan Qiu and others
+# juan_ qiu@tongji.edu.cn
+# 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 pkg_resources
+import yaml
+import logging
+import os
+
+import yardstick.common.utils as utils
+
+LOG = logging.getLogger(__name__)
+
+resultchecker_conf_path = pkg_resources.resource_filename(
+ "yardstick.benchmark.scenarios.availability",
+ "result_checker_conf.yaml")
+
+
+class ResultCheckerMgr(object):
+
+ def __init__(self):
+ self._result_checker_list = []
+
+ def init_ResultChecker(self, resultchecker_cfgs, context):
+ LOG.debug("resultcheckerMgr confg: %s" % resultchecker_cfgs)
+
+ for cfg in resultchecker_cfgs:
+ resultchecker_type = cfg['checker_type']
+ resultchecker_cls = BaseResultChecker.get_resultchecker_cls(
+ resultchecker_type)
+ resultchecker_ins = resultchecker_cls(cfg, context)
+ resultchecker_ins.key = cfg['key']
+ resultchecker_ins.setup()
+ self._result_checker_list.append(resultchecker_ins)
+
+ def __getitem__(self, item):
+ for obj in self._result_checker_list:
+ if(obj.key == item):
+ return obj
+ raise KeyError("No such result checker instance of key - %s" % item)
+
+ def verify(self):
+ result = True
+ for obj in self._result_checker_list:
+ result &= obj.success
+ return result
+
+
+class BaseResultChecker(object):
+
+ resultchecker_cfgs = {}
+
+ def __init__(self, config, context):
+ if not BaseResultChecker.resultchecker_cfgs:
+ with open(resultchecker_conf_path) as stream:
+ BaseResultChecker.resultchecker_cfgs = yaml.load(stream)
+ self.actualResult = object()
+ self.expectedResult = object()
+ self.success = False
+
+ self._config = config
+ self._context = context
+ self.setup_done = False
+
+ @staticmethod
+ def get_resultchecker_cls(type):
+ '''return resultchecker instance of specified type'''
+ resultchecker_type = type
+ for checker_cls in utils.itersubclasses(BaseResultChecker):
+ if resultchecker_type == checker_cls.__result_checker__type__:
+ return checker_cls
+ raise RuntimeError("No such runner_type %s" % resultchecker_type)
+
+ def get_script_fullpath(self, path):
+ base_path = os.path.dirname(resultchecker_conf_path)
+ return os.path.join(base_path, path)
+
+ def setup(self):
+ pass
+
+ def verify(self):
+ if(self.actualResult == self.expectedResult):
+ self.success = True
+ return self.success
diff --git a/yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py b/yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py
new file mode 100644
index 000000000..70bf9aea6
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py
@@ -0,0 +1,107 @@
+##############################################################################
+# Copyright (c) 2016 Juan Qiu and others
+# juan_ qiu@tongji.edu.cn
+# 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
+
+from baseresultchecker import BaseResultChecker
+from yardstick.benchmark.scenarios.availability import Condition
+import yardstick.ssh as ssh
+from yardstick.benchmark.scenarios.availability.util import buildshellparams
+
+LOG = logging.getLogger(__name__)
+
+
+class GeneralResultChecker(BaseResultChecker):
+
+ __result_checker__type__ = "general-result-checker"
+
+ def setup(self):
+ LOG.debug("config:%s context:%s" % (self._config, self._context))
+ host = self._context.get(self._config['host'], None)
+ ip = host.get("ip", None)
+ user = host.get("user", "root")
+ key_filename = host.get("key_filename", "~/.ssh/id_rsa")
+
+ self.connection = ssh.SSH(user, ip, key_filename=key_filename)
+ self.connection.wait(timeout=600)
+ LOG.debug("ssh host success!")
+
+ self.key = self._config['key']
+ self.type = self._config['checker_type']
+ self.condition = self._config['condition']
+ self.expectedResult = self._config['expectedValue']
+ self.actualResult = object()
+
+ self.key = self._config['key']
+ if "parameter" in self._config:
+ parameter = self._config['parameter']
+ str = buildshellparams(parameter)
+ l = list(item for item in parameter.values())
+ self.shell_cmd = str.format(*l)
+
+ self.resultchecker_cfgs = BaseResultChecker.resultchecker_cfgs.get(
+ self.key)
+ self.verify_script = self.get_script_fullpath(
+ self.resultchecker_cfgs['verify_script'])
+
+ def verify(self):
+ if "parameter" in self._config:
+ exit_status, stdout, stderr = self.connection.execute(
+ self.shell_cmd,
+ stdin=open(self.verify_script, "r"))
+ LOG.debug("action script of the operation is: {0}"
+ .format(self.verify_script))
+ LOG.debug("action parameter the of operation is: {0}"
+ .format(self.shell_cmd))
+ else:
+ exit_status, stdout, stderr = self.connection.execute(
+ "/bin/bash -s ",
+ stdin=open(self.verify_script, "r"))
+ LOG.debug("action script of the operation is: {0}"
+ .format(self.verify_script))
+
+ LOG.debug("exit_status ,stdout : {0} ,{1}".format(exit_status, stdout))
+ if exit_status == 0 and stdout:
+ self.actualResult = stdout
+ LOG.debug("verifying resultchecker: {0}".format(self.key))
+ LOG.debug("verifying resultchecker,expected: {0}"
+ .format(self.expectedResult))
+ LOG.debug("verifying resultchecker,actual: {0}"
+ .format(self.actualResult))
+ LOG.debug("verifying resultchecker,condition: {0}"
+ .format(self.condition))
+ if (type(self.expectedResult) is int):
+ self.actualResult = int(self.actualResult)
+ if self.condition == Condition.EQUAL:
+ self.success = self.actualResult == self.expectedResult
+ elif self.condition == Condition.GREATERTHAN:
+ self.success = self.actualResult > self.expectedResult
+ elif self.condition == Condition.GREATERTHANEQUAL:
+ self.success = self.actualResult >= self.expectedResult
+ elif self.condition == Condition.LESSTHANEQUAL:
+ self.success = self.actualResult <= self.expectedResult
+ elif self.condition == Condition.LESSTHAN:
+ self.success = self.actualResult < self.expectedResult
+ elif self.condition == Condition.IN:
+ self.success = self.expectedResult in self.actualResult
+ else:
+ self.success = False
+ LOG.debug(
+ "error happened when resultchecker: {0} Invalid condition"
+ .format(self.key))
+ else:
+ self.success = False
+ LOG.debug(
+ "error happened when resultchecker: {0} verifying the result"
+ .format(self.key))
+ LOG.error(stderr)
+
+ LOG.debug(
+ "verifying resultchecker: {0},the result is : {1}"
+ .format(self.key, self.success))
+ return self.success
diff --git a/yardstick/benchmark/scenarios/availability/result_checker_conf.yaml b/yardstick/benchmark/scenarios/availability/result_checker_conf.yaml
new file mode 100644
index 000000000..638c39a6e
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/result_checker_conf.yaml
@@ -0,0 +1,11 @@
+---
+# sample config file for ha test
+#
+schema: "yardstick:task:0.1"
+
+process-checker:
+ verify_script: ha_tools/check_process_python.bash
+service-checker:
+ verify_script: ha_tools/check_service.bash
+nova-instance-checker:
+ verify_script: ha_tools/nova/show_instances.bash \ No newline at end of file
diff --git a/yardstick/benchmark/scenarios/availability/scenario_general.py b/yardstick/benchmark/scenarios/availability/scenario_general.py
new file mode 100644
index 000000000..0a128aa09
--- /dev/null
+++ b/yardstick/benchmark/scenarios/availability/scenario_general.py
@@ -0,0 +1,68 @@
+##############################################################################
+# Copyright (c) 2016 Juan Qiu and others
+# juan_ qiu@tongji.edu.cn
+# 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 traceback
+
+from yardstick.benchmark.scenarios import base
+from yardstick.benchmark.scenarios.availability.director import Director
+
+LOG = logging.getLogger(__name__)
+
+
+class ScenarioGeneral(base.Scenario):
+ """Support orchestrating general HA test scenarios."""
+
+ __scenario_type__ = "GeneralHA"
+
+ def __init__(self, scenario_cfg, context_cfg):
+ LOG.debug(
+ "scenario_cfg:%s context_cfg:%s" % (scenario_cfg, context_cfg))
+ self.scenario_cfg = scenario_cfg
+ self.context_cfg = context_cfg
+
+ def setup(self):
+ self.director = Director(self.scenario_cfg, self.context_cfg)
+
+ def run(self, args):
+ steps = self.scenario_cfg["options"]["steps"]
+ orderedSteps = sorted(steps, key=lambda x: x['index'])
+ for step in orderedSteps:
+ LOG.debug(
+ "\033[94m running step: {0} .... \033[0m"
+ .format(orderedSteps.index(step)+1))
+ try:
+ actionPlayer = self.director.createActionPlayer(
+ step['actionType'], step['actionKey'])
+ actionPlayer.action()
+ actionRollbacker = self.director.createActionRollbacker(
+ step['actionType'], step['actionKey'])
+ if actionRollbacker:
+ self.director.executionSteps.append(actionRollbacker)
+ except Exception, e:
+ LOG.debug(e.message)
+ traceback.print_exc()
+ LOG.debug(
+ "\033[91m exception when running step: {0} .... \033[0m"
+ .format(orderedSteps.index(step)))
+ break
+ finally:
+ pass
+
+ self.director.stopMonitors()
+ if self.director.verify():
+ LOG.debug(
+ "\033[92m congratulations, "
+ "the test cases scenario is pass! \033[0m")
+ else:
+ LOG.debug(
+ "\033[91m aoh,the test cases scenario failed,"
+ "please check the detail debug information! \033[0m")
+
+ def teardown(self):
+ self.director.knockoff()
diff --git a/yardstick/benchmark/scenarios/compute/cpuload.py b/yardstick/benchmark/scenarios/compute/cpuload.py
index d11bec5c3..f45313e91 100644
--- a/yardstick/benchmark/scenarios/compute/cpuload.py
+++ b/yardstick/benchmark/scenarios/compute/cpuload.py
@@ -36,13 +36,17 @@ class CPULoad(base.Scenario):
on the Linux host.
Parameters
- interval - Time interval to measure CPU usage. A value of 0
- indicates that processors statistics are to be
- reported for the time since system startup (boot)
+ interval - Time interval to measure CPU usage.
type: [int]
unit: seconds
- default: 0
+ default: 1
+
+ count (for mpstat only) - Number of CPU usage measurment.
+
+ type: [int]
+ unit: N/A
+ default: 1
"""
@@ -56,6 +60,7 @@ class CPULoad(base.Scenario):
self.context_cfg = context_cfg
self.setup_done = False
self.has_mpstat = False
+ self.has_count = False
def setup(self):
"""Scenario setup."""
@@ -77,10 +82,13 @@ class CPULoad(base.Scenario):
LOG.info("MPSTAT is installed")
self.has_mpstat = True
- if 'options' in self.scenario_cfg:
- self.interval = self.scenario_cfg['options'].get("interval", 0)
+ options = self.scenario_cfg['options']
+ self.interval = options.get("interval", 1)
+ if 'count' in options:
+ self.count = options.get("count", 1)
+ self.has_count = True
else:
- self.interval = 0
+ self.has_count = False
self.setup_done = True
@@ -99,15 +107,17 @@ class CPULoad(base.Scenario):
def _get_cpu_usage_mpstat(self):
"""Get processor usage using mpstat."""
- if self.interval > 0:
- cmd = "mpstat -P ON %s 1" % self.interval
+ if self.interval > 0 and self.has_count:
+ cmd = "mpstat -P ON %s %s" % (self.interval, self.count)
else:
- cmd = "mpstat -P ON"
+ cmd = "mpstat -P ON %s 1" % self.interval
result = self._execute_command(cmd)
fields = []
- mpstat = {}
+ maximum = {}
+ minimum = {}
+ average = {}
time_marker = re.compile("^([0-9]+):([0-9]+):([0-9]+)$")
ampm_marker = re.compile("(AM|PM)$")
@@ -117,7 +127,6 @@ class CPULoad(base.Scenario):
line = row.split()
if line and re.match(time_marker, line[0]):
-
if re.match(ampm_marker, line[1]):
del line[:2]
else:
@@ -134,11 +143,45 @@ class CPULoad(base.Scenario):
cpu = 'cpu' if line[0] == 'all' else 'cpu' + line[0]
values = line[1:]
if values and len(values) == len(fields):
- mpstat[cpu] = dict(zip(fields, values))
+ temp_dict = dict(zip(fields, values))
+ if cpu not in maximum:
+ maximum[cpu] = temp_dict
+ else:
+ for item in temp_dict:
+ if float(maximum[cpu][item]) <\
+ float(temp_dict[item]):
+ maximum[cpu][item] = temp_dict[item]
+
+ if cpu not in minimum:
+ minimum[cpu] = temp_dict
+ else:
+ for item in temp_dict:
+ if float(minimum[cpu][item]) >\
+ float(temp_dict[item]):
+ minimum[cpu][item] = temp_dict[item]
else:
raise RuntimeError("mpstat: parse error", fields, line)
- return {'mpstat': mpstat}
+ elif line and line[0] == 'Average:':
+ del line[:1]
+ if line[0] == 'CPU':
+ # header fields
+ fields = line[1:]
+ if len(fields) != CPULoad.MPSTAT_FIELD_SIZE:
+ raise RuntimeError("mpstat average: unexpected field\
+ size", fields)
+ else:
+ # value fields
+ cpu = 'cpu' if line[0] == 'all' else 'cpu' + line[0]
+ values = line[1:]
+ if values and len(values) == len(fields):
+ average[cpu] = dict(zip(fields, values))
+ else:
+ raise RuntimeError("mpstat average: parse error",
+ fields, line)
+
+ return {'mpstat_maximun': maximum, 'mpstat_minimum': minimum,
+ 'mpstat_average': average}
def _get_cpu_usage(self):
"""Get processor usage from /proc/stat."""
diff --git a/yardstick/benchmark/scenarios/networking/ping.py b/yardstick/benchmark/scenarios/networking/ping.py
index 3af354850..08755a08b 100644
--- a/yardstick/benchmark/scenarios/networking/ping.py
+++ b/yardstick/benchmark/scenarios/networking/ping.py
@@ -41,11 +41,17 @@ class Ping(base.Scenario):
user = host.get('user', 'ubuntu')
ip = host.get('ip', None)
key_filename = host.get('key_filename', '/root/.ssh/id_rsa')
- password = host.get('password', 'root')
+ password = host.get('password', None)
+
+ if password is not None:
+ LOG.info("Log in via pw, user:%s, host:%s, pw:%s",
+ user, ip, password)
+ self.connection = ssh.SSH(user, ip, password=password)
+ else:
+ LOG.info("Log in via key, user:%s, host:%s, key_filename:%s",
+ user, ip, key_filename)
+ self.connection = ssh.SSH(user, ip, key_filename=key_filename)
- LOG.info("user:%s, host:%s, key_filename:%s", user, ip, key_filename)
- self.connection = ssh.SSH(user, ip, key_filename=key_filename,
- password=password)
self.connection.wait()
def run(self, result):
diff --git a/yardstick/benchmark/scenarios/networking/vsperf.py b/yardstick/benchmark/scenarios/networking/vsperf.py
new file mode 100644
index 000000000..d3123083a
--- /dev/null
+++ b/yardstick/benchmark/scenarios/networking/vsperf.py
@@ -0,0 +1,229 @@
+# Copyright 2016 Intel Corporation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+""" Vsperf specific scenario definition """
+
+import logging
+import os
+import subprocess
+import csv
+
+import yardstick.ssh as ssh
+from yardstick.benchmark.scenarios import base
+
+LOG = logging.getLogger(__name__)
+
+
+class Vsperf(base.Scenario):
+ """Execute vsperf with defined parameters
+
+ Parameters:
+ traffic_type - to specify the type of traffic executed by traffic generator
+ the valid values are "rfc2544", "continuous", "back2back"
+ type: string
+ default: "rfc2544"
+ pkt_sizes - a packet size for which test should be executed;
+ Multiple packet sizes can be tested by modification of Sequence runner
+ section inside TC YAML definition.
+ type: string
+ default: "64"
+ duration - sets duration for which traffic will be generated
+ type: int
+ default: 30
+ bidirectional - speficies if traffic will be uni (False) or bi-directional
+ (True)
+ type: string
+ default: False
+ iload - specifies frame rate
+ type: string
+ default: 100
+ rfc2544_trials - the number of trials performed for each packet size
+ type: string
+ default: NA
+ multistream - the number of simulated streams
+ type: string
+ default: 0 (disabled)
+ stream_type - specifies network layer used for multistream simulation
+ the valid values are "L4", "L3" and "L2"
+ type: string
+ default: "L4"
+ conf-file - path to the vsperf configuration file, which will be uploaded
+ to the VM
+ type: string
+ default: NA
+ setup-script - path to the setup script, which will be executed during
+ setup and teardown phases
+ type: string
+ default: NA
+ trafficgen_port1 - specifies device name of 1st interface connected to
+ the trafficgen
+ type: string
+ default: NA
+ trafficgen_port2 - specifies device name of 2nd interface connected to
+ the trafficgen
+ type: string
+ default: NA
+ external_bridge - specifies name of external bridge configured in OVS
+ type: string
+ default: "br-ex"
+
+ """
+ __scenario_type__ = "Vsperf"
+
+ VSPERF_CONF = '~/vsperf-yardstick.conf'
+
+ def __init__(self, scenario_cfg, context_cfg):
+ self.scenario_cfg = scenario_cfg
+ self.context_cfg = context_cfg
+ self.setup_done = False
+ self.client = None
+ self.tg_port1 = self.scenario_cfg['options'].get('trafficgen_port1',
+ None)
+ self.tg_port2 = self.scenario_cfg['options'].get('trafficgen_port2',
+ None)
+ self.br_ex = self.scenario_cfg['options'].get('external_bridge',
+ 'br-ex')
+ self.vsperf_conf = os.path.expanduser(
+ self.scenario_cfg['options'].get('conf-file', Vsperf.VSPERF_CONF))
+ self.setup_script = self.scenario_cfg['options'].get('setup-script',
+ None)
+ if self.setup_script:
+ self.setup_script = os.path.expanduser(self.setup_script)
+
+ def setup(self):
+ '''scenario setup'''
+ vsperf = self.context_cfg['host']
+ vsperf_user = vsperf.get('user', 'ubuntu')
+ vsperf_password = vsperf.get('password', 'ubuntu')
+ vsperf_ip = vsperf.get('ip', None)
+
+ # add trafficgen interfaces to the external bridge
+ if self.tg_port1:
+ subprocess.call('sudo bash -c "ovs-vsctl add-port %s %s"' %
+ (self.br_ex, self.tg_port1), shell=True)
+ if self.tg_port2:
+ subprocess.call('sudo bash -c "ovs-vsctl add-port %s %s"' %
+ (self.br_ex, self.tg_port2), shell=True)
+
+ # copy vsperf conf to VM
+ LOG.info("user:%s, host:%s", vsperf_user, vsperf_ip)
+ self.client = ssh.SSH(vsperf_user, vsperf_ip,
+ password=vsperf_password)
+ # traffic generation could last long
+ self.client.wait(timeout=1800)
+
+ # copy script to host
+ self.client.run("cat > ~/vsperf.conf",
+ stdin=open(self.vsperf_conf, "rb"))
+
+ # execute external setup script
+ if self.setup_script:
+ cmd = "%s setup" % (self.setup_script)
+ LOG.info("Execute setup script \"%s\"", cmd)
+ subprocess.call(cmd, shell=True)
+
+ self.setup_done = True
+
+ def run(self, result):
+ """ execute the vsperf benchmark and return test results
+ within result dictionary
+ """
+ def add_test_params(options, option, default_value):
+ """return parameter and its value as a string to be passed
+ to the VSPERF inside --test-params argument
+
+ Parameters:
+ options - dictionary with scenario options
+ option - a name of option to be added to the string
+ default_value - value to be used in case that option
+ is not defined inside scenario options
+ """
+ if option in options:
+ return "%s=%s" % (option, options[option])
+ elif default_value is not None:
+ return "%s=%s" % (option, default_value)
+ else:
+ return None
+
+ if not self.setup_done:
+ self.setup()
+
+ # remove results from previous tests
+ self.client.execute("rm -rf /tmp/results*")
+
+ # get vsperf options
+ options = self.scenario_cfg['options']
+ test_params = []
+ test_params.append(add_test_params(options, "traffic_type", "rfc2544"))
+ test_params.append(add_test_params(options, "pkt_sizes", "64"))
+ test_params.append(add_test_params(options, "duration", None))
+ test_params.append(add_test_params(options, "bidirectional", "False"))
+ test_params.append(add_test_params(options, "iload", 100))
+ test_params.append(add_test_params(options, "rfc2544_trials", None))
+ test_params.append(add_test_params(options, "multistream", None))
+ test_params.append(add_test_params(options, "stream_type", None))
+
+ # execute vsperf
+ cmd = "source ~/vsperfenv/bin/activate ; cd vswitchperf ; "
+ cmd += "./vsperf --mode trafficgen --conf-file ~/vsperf.conf "
+ cmd += "--test-params=\"%s\"" % (';'.join(filter(None, test_params)))
+ LOG.debug("Executing command: %s", cmd)
+ status, stdout, stderr = self.client.execute(cmd)
+
+ if status:
+ raise RuntimeError(stderr)
+
+ # get test results
+ cmd = "cat /tmp/results*/result.csv"
+ LOG.debug("Executing command: %s", cmd)
+ status, stdout, stderr = self.client.execute(cmd)
+
+ if status:
+ raise RuntimeError(stderr)
+
+ # convert result.csv to JSON format
+ reader = csv.DictReader(stdout.split('\r\n'))
+ result.update(reader.next())
+
+ # sla check; go through all defined SLAs and check if values measured
+ # by VSPERF are higher then those defined by SLAs
+ if 'sla' in self.scenario_cfg and \
+ 'metrics' in self.scenario_cfg['sla']:
+ for metric in self.scenario_cfg['sla']['metrics'].split(','):
+ assert metric in result, \
+ '%s is not collected by VSPERF' % (metric)
+ assert metric in self.scenario_cfg['sla'], \
+ '%s is not defined in SLA' % (metric)
+ vs_res = float(result[metric])
+ sla_res = float(self.scenario_cfg['sla'][metric])
+ assert vs_res >= sla_res, \
+ 'VSPERF_%s(%f) < SLA_%s(%f)' % \
+ (metric, vs_res, metric, sla_res)
+
+ def teardown(self):
+ """cleanup after the test execution"""
+ # remove trafficgen interfaces from the external bridge
+ if self.tg_port1:
+ subprocess.call('sudo bash -c "ovs-vsctl del-port %s %s"' %
+ (self.br_ex, self.tg_port1), shell=True)
+ if self.tg_port2:
+ subprocess.call('sudo bash -c "ovs-vsctl del-port %s %s"' %
+ (self.br_ex, self.tg_port2), shell=True)
+
+ # execute external setup script
+ if self.setup_script:
+ cmd = "%s teardown" % (self.setup_script)
+ LOG.info("Execute setup script \"%s\"", cmd)
+ subprocess.call(cmd, shell=True)
+
+ self.setup_done = False