aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dashboard/KVMFORNFV-Cyclictest1090
-rw-r--r--samples/nstat.yaml35
-rwxr-xr-xtests/ci/yardstick-verify10
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc076.yaml56
-rw-r--r--tests/unit/benchmark/contexts/test_node.py96
-rw-r--r--tests/unit/benchmark/core/test_task.py24
-rw-r--r--tests/unit/benchmark/scenarios/networking/test_nstat.py118
-rwxr-xr-xtools/ubuntu-server-cloudimg-dpdk-modify.sh3
-rwxr-xr-xtools/ubuntu-server-cloudimg-modify.sh3
-rw-r--r--yardstick/benchmark/contexts/node.py82
-rw-r--r--yardstick/benchmark/core/task.py26
-rw-r--r--yardstick/benchmark/scenarios/networking/nstat.py130
-rw-r--r--yardstick/cmd/commands/task.py15
-rw-r--r--yardstick/common/utils.py5
-rw-r--r--yardstick/dispatcher/file.py5
15 files changed, 1160 insertions, 538 deletions
diff --git a/dashboard/KVMFORNFV-Cyclictest b/dashboard/KVMFORNFV-Cyclictest
index 36c1ec778..1a82c5466 100644
--- a/dashboard/KVMFORNFV-Cyclictest
+++ b/dashboard/KVMFORNFV-Cyclictest
@@ -1,517 +1,573 @@
-{
- "id": 42,
- "title": "KVMFORNFV-Cyclictest",
- "tags": [
- "kvmfornfv-cyclictest"
- ],
- "style": "dark",
- "timezone": "browser",
- "editable": true,
- "hideControls": false,
- "sharedCrosshair": false,
- "rows": [
- {
- "collapse": false,
- "editable": true,
- "height": "",
- "panels": [
- {
- "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><center>OPNFV_KVMFORNFV_Cyclictest - Real time benchmark</center> </a></h5>\n<center>\n<p>Cyclictest is used to test the guest timer latency with idle host/guest,Host memory stress and Host CPU stress.\nFor more information see <a style=\"color:#31A7D3\"; href=\"https://wiki.opnfv.org/display/kvm/KVM4NFV+Test++Environment\">Cyclictest</a></p>\n</center>\n\n\n",
- "editable": true,
- "error": false,
- "id": 6,
- "isNew": true,
- "links": [],
- "mode": "html",
- "span": 12,
- "title": "",
- "type": "text"
- }
- ],
- "title": "New row"
- },
- {
- "collapse": false,
- "editable": true,
- "height": "",
- "panels": [
- {
- "content": "",
- "editable": true,
- "error": false,
- "id": 9,
- "isNew": true,
- "links": [],
- "mode": "markdown",
- "span": 12,
- "style": {},
- "title": "Test Case Execution",
- "type": "text"
- }
- ],
- "title": "New row"
- },
- {
- "collapse": false,
- "editable": true,
- "height": "300px",
- "panels": [
- {
- "aliasColors": {
- "kvmfornfv_cyclictest_idle_idle.avg": "#7EB26D",
- "kvmfornfv_cyclictest_idle_idle.max": "#6ED0E0",
- "kvmfornfv_cyclictest_idle_idle.min": "#EAB839"
- },
- "bars": false,
- "datasource": "yardstick-vtc",
- "decimals": null,
- "editable": true,
- "error": false,
- "fill": 0,
- "grid": {
- "threshold1": null,
- "threshold1Color": "rgba(216, 200, 27, 0.27)",
- "threshold2": null,
- "threshold2Color": "rgba(234, 112, 112, 0.22)"
- },
- "id": 10,
- "isNew": true,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "max": true,
- "min": true,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 2,
- "links": [],
- "minSpan": 12,
- "nullPointMode": "connected",
- "percentage": false,
- "pointradius": 2,
- "points": true,
- "renderer": "flot",
- "seriesOverrides": [
- {
- "alias": "kvmfornfv_cyclictest_idle_idle.min",
- "yaxis": 1
- }
- ],
- "span": 12,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "dsType": "influxdb",
- "groupBy": [],
- "measurement": "kvmfornfv_cyclictest_idle_idle",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "avg"
- ],
- "type": "field"
- }
- ],
- [
- {
- "params": [
- "max"
- ],
- "type": "field"
- }
- ],
- [
- {
- "params": [
- "min"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "timeFrom": null,
- "timeShift": null,
- "title": "kvmfornfv_cyclictest_idle_idle",
- "tooltip": {
- "msResolution": true,
- "shared": true,
- "sort": 0,
- "value_type": "cumulative"
- },
- "type": "graph",
- "xaxis": {
- "show": true
- },
- "yaxes": [
- {
- "format": "µs",
- "label": "Latency",
- "logBase": 10,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": false
- }
- ]
- },
- {
- "aliasColors": {
- "kvmfornfv_cyclictest_idle_idle.avg": "#7EB26D"
- },
- "bars": false,
- "datasource": "yardstick-vtc",
- "decimals": null,
- "editable": true,
- "error": false,
- "fill": 2,
- "grid": {
- "threshold1": 100,
- "threshold1Color": "rgb(227, 225, 213)",
- "threshold2": null,
- "threshold2Color": "rgba(199, 177, 177, 0)",
- "thresholdLine": true
- },
- "hideTimeOverride": false,
- "id": 11,
- "isNew": true,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "hideEmpty": false,
- "hideZero": false,
- "max": true,
- "min": true,
- "rightSide": false,
- "show": true,
- "sideWidth": 100,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 2,
- "links": [],
- "minSpan": 5,
- "nullPointMode": "connected",
- "percentage": false,
- "pointradius": 2,
- "points": true,
- "renderer": "flot",
- "seriesOverrides": [],
- "span": 6,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "dsType": "influxdb",
- "groupBy": [],
- "measurement": "kvmfornfv_cyclictest_idle_idle",
- "policy": "default",
- "query": "SELECT \"avg\" FROM \"kvmfornfv_cyclictest_idle_idle\" WHERE $timeFilter",
- "rawQuery": true,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "avg"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "timeFrom": null,
- "timeShift": null,
- "title": "AVG Graph",
- "tooltip": {
- "msResolution": true,
- "shared": true,
- "sort": 0,
- "value_type": "cumulative"
- },
- "type": "graph",
- "xaxis": {
- "show": true
- },
- "yaxes": [
- {
- "format": "µs",
- "label": "Latency",
- "logBase": 1024,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": "",
- "logBase": 1,
- "max": null,
- "min": null,
- "show": false
- }
- ]
- },
- {
- "aliasColors": {
- "kvmfornfv_cyclictest_idle_idle.min": "#EAB839"
- },
- "bars": false,
- "datasource": "yardstick-vtc",
- "editable": true,
- "error": false,
- "fill": 2,
- "grid": {
- "threshold1": 50,
- "threshold1Color": "#ebe9d9",
- "threshold2": null,
- "threshold2Color": "#e9d8d8",
- "thresholdLine": true
- },
- "id": 12,
- "isNew": true,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "max": true,
- "min": true,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 2,
- "links": [],
- "minSpan": 5,
- "nullPointMode": "connected",
- "percentage": false,
- "pointradius": 2,
- "points": true,
- "renderer": "flot",
- "seriesOverrides": [],
- "span": 6,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "dsType": "influxdb",
- "groupBy": [],
- "measurement": "kvmfornfv_cyclictest_idle_idle",
- "policy": "default",
- "query": "SELECT \"min\" FROM \"kvmfornfv_cyclictest_idle_idle\" WHERE $timeFilter",
- "rawQuery": false,
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "min"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "timeFrom": null,
- "timeShift": null,
- "title": "MIN Graph",
- "tooltip": {
- "msResolution": true,
- "shared": true,
- "sort": 0,
- "value_type": "cumulative"
- },
- "type": "graph",
- "xaxis": {
- "show": true
- },
- "yaxes": [
- {
- "format": "µs",
- "label": "Latency",
- "logBase": 1024,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": false
- }
- ]
- },
- {
- "aliasColors": {
- "kvmfornfv_cyclictest_idle_idle.max": "#6ED0E0"
- },
- "bars": false,
- "datasource": "yardstick-vtc",
- "editable": true,
- "error": false,
- "fill": 2,
- "grid": {
- "threshold1": 1000,
- "threshold1Color": "#e9e7d6",
- "threshold2": null,
- "threshold2Color": "rgba(234, 112, 112, 0.22)",
- "thresholdLine": true
- },
- "id": 13,
- "isNew": true,
- "legend": {
- "alignAsTable": true,
- "avg": false,
- "current": true,
- "max": true,
- "min": true,
- "rightSide": false,
- "show": true,
- "total": false,
- "values": true
- },
- "lines": true,
- "linewidth": 2,
- "links": [],
- "minSpan": 5,
- "nullPointMode": "connected",
- "percentage": false,
- "pointradius": 2,
- "points": true,
- "renderer": "flot",
- "seriesOverrides": [],
- "span": 6,
- "stack": false,
- "steppedLine": false,
- "targets": [
- {
- "dsType": "influxdb",
- "groupBy": [],
- "hide": false,
- "measurement": "kvmfornfv_cyclictest_idle_idle",
- "policy": "default",
- "refId": "A",
- "resultFormat": "time_series",
- "select": [
- [
- {
- "params": [
- "max"
- ],
- "type": "field"
- }
- ]
- ],
- "tags": []
- }
- ],
- "timeFrom": null,
- "timeShift": null,
- "title": "MAX Graph",
- "tooltip": {
- "msResolution": true,
- "shared": true,
- "sort": 0,
- "value_type": "cumulative"
- },
- "transparent": false,
- "type": "graph",
- "xaxis": {
- "show": true
- },
- "yaxes": [
- {
- "format": "µs",
- "label": "Latency",
- "logBase": 1024,
- "max": null,
- "min": null,
- "show": true
- },
- {
- "format": "short",
- "label": null,
- "logBase": 1,
- "max": null,
- "min": null,
- "show": false
- }
- ]
- }
- ],
- "title": "Row"
- }
- ],
- "time": {
- "from": "now-7d",
- "to": "now"
- },
- "timepicker": {
- "refresh_intervals": [
- "5s",
- "10s",
- "30s",
- "1m",
- "5m",
- "15m",
- "30m",
- "1h",
- "2h",
- "1d"
- ],
- "time_options": [
- "5m",
- "15m",
- "1h",
- "6h",
- "12h",
- "24h",
- "2d",
- "7d",
- "30d"
- ]
- },
- "templating": {
- "list": []
- },
- "annotations": {
- "list": []
- },
- "refresh": "1d",
- "schemaVersion": 12,
- "version": 1,
- "links": [],
- "gnetId": null
-}
+{
+ "id": 42,
+ "title": "KVMFORNFV-Cyclictest",
+ "tags": [
+ "kvmfornfv-cyclictest"
+ ],
+ "style": "dark",
+ "timezone": "browser",
+ "editable": true,
+ "hideControls": false,
+ "sharedCrosshair": false,
+ "rows": [
+ {
+ "collapse": false,
+ "editable": true,
+ "height": "",
+ "panels": [
+ {
+ "content": "<h5 style=\"font-family:Verdana\"> <a style=\"color:#31A7D3\"><center>OPNFV_KVMFORNFV_Cyclictest - Real time benchmark</center> </a></h5>\n<center>\n<p>cyclictest used to test the guest timer latency with idle host/guest,Host memory stress and Host CPU stress.\nFor more information see <a style=\"color:#31A7D3\"; href=\"https://wiki.opnfv.org/display/kvm/KVM4NFV+Test++Environment\">Cyclictest</a></p>\n</center>\n\n\n",
+ "editable": true,
+ "error": false,
+ "id": 6,
+ "isNew": true,
+ "links": [],
+ "mode": "html",
+ "span": 12,
+ "title": "",
+ "type": "text"
+ }
+ ],
+ "title": "New row"
+ },
+ {
+ "collapse": false,
+ "editable": true,
+ "height": "",
+ "panels": [
+ {
+ "content": "",
+ "editable": true,
+ "error": false,
+ "id": 9,
+ "isNew": true,
+ "links": [],
+ "mode": "markdown",
+ "span": 12,
+ "style": {},
+ "title": "Test Case Execution",
+ "type": "text"
+ }
+ ],
+ "title": "New row"
+ },
+ {
+ "collapse": false,
+ "editable": true,
+ "height": "300px",
+ "panels": [
+ {
+ "aliasColors": {
+ "kvmfornfv_cyclictest_idle_idle.avg": "#7EB26D",
+ "kvmfornfv_cyclictest_idle_idle.max": "#6ED0E0",
+ "kvmfornfv_cyclictest_idle_idle.min": "#EAB839"
+ },
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "decimals": null,
+ "editable": true,
+ "error": false,
+ "fill": 0,
+ "grid": {
+ "threshold1": null,
+ "threshold1Color": "rgba(216, 200, 27, 0.27)",
+ "threshold2": null,
+ "threshold2Color": "rgba(234, 112, 112, 0.22)"
+ },
+ "id": 10,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 12,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 2,
+ "points": true,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "kvmfornfv_cyclictest_idle_idle.min",
+ "yaxis": 1
+ }
+ ],
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [],
+ "measurement": "kvmfornfv_cyclictest_idle_idle",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "avg"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "max"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "min"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "kvmfornfv_cyclictest_idle_idle",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "show": true
+ },
+ "yaxes": [
+ {
+ "format": "µs",
+ "label": "Latency",
+ "logBase": 10,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {
+ "kvmfornfv_cyclictest_idle_idle.avg": "#7EB26D"
+ },
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "decimals": null,
+ "editable": true,
+ "error": false,
+ "fill": 2,
+ "grid": {
+ "threshold1": 100,
+ "threshold1Color": "rgb(227, 225, 213)",
+ "threshold2": null,
+ "threshold2Color": "rgba(199, 177, 177, 0)",
+ "thresholdLine": true
+ },
+ "hideTimeOverride": false,
+ "id": 11,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "sideWidth": 100,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 12,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 2,
+ "points": true,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "kvmfornfv_cyclictest_cpustress_idle",
+ "yaxis": 1
+ }
+ ],
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [],
+ "measurement": "kvmfornfv_cyclictest_cpustress_idle",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "avg"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "max"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "min"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "kvmfornfv_cyclictest_cpustress_idle",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "show": true
+ },
+ "yaxes": [
+ {
+ "format": "µs",
+ "label": "Latency",
+ "logBase": 1024,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": "",
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {
+ "kvmfornfv_cyclictest_idle_idle.min": "#EAB839"
+ },
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fill": 2,
+ "grid": {
+ "threshold1": 50,
+ "threshold1Color": "#ebe9d9",
+ "threshold2": null,
+ "threshold2Color": "#e9d8d8",
+ "thresholdLine": true
+ },
+ "id": 12,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 12,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 2,
+ "points": true,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "kvmfornfv_cyclictest_memorystress_idle.min",
+ "yaxis": 1
+ }
+ ],
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [],
+ "measurement": "kvmfornfv_cyclictest_memorystress_idle",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "min"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "max"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "avg"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "kvmfornfv_cyclictest_memorystress_idle",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "type": "graph",
+ "xaxis": {
+ "show": true
+ },
+ "yaxes": [
+ {
+ "format": "µs",
+ "label": "Latency",
+ "logBase": 1024,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ },
+ {
+ "aliasColors": {
+ "kvmfornfv_cyclictest_idle_idle.max": "#6ED0E0"
+ },
+ "bars": false,
+ "datasource": "yardstick-vtc",
+ "editable": true,
+ "error": false,
+ "fill": 2,
+ "grid": {
+ "threshold1": 1000,
+ "threshold1Color": "#e9e7d6",
+ "threshold2": null,
+ "threshold2Color": "rgba(234, 112, 112, 0.22)",
+ "threshold3": 50,
+ "threshold3Color": "#e9e7d6",
+ "thresholdLine": true
+ },
+ "id": 13,
+ "isNew": true,
+ "legend": {
+ "alignAsTable": true,
+ "avg": false,
+ "current": true,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "minSpan": 12,
+ "nullPointMode": "connected",
+ "percentage": false,
+ "pointradius": 2,
+ "points": true,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "dsType": "influxdb",
+ "groupBy": [],
+ "hide": false,
+ "measurement": "kvmfornfv_cyclictest_iostress_idle",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "min"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "max"
+ ],
+ "type": "field"
+ }
+ ],
+ [
+ {
+ "params": [
+ "avg"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "kvmfornfv_cyclictest_iostress_idle",
+ "tooltip": {
+ "msResolution": true,
+ "shared": true,
+ "sort": 0,
+ "value_type": "cumulative"
+ },
+ "transparent": false,
+ "type": "graph",
+ "xaxis": {
+ "show": true
+ },
+ "yaxes": [
+ {
+ "format": "µs",
+ "label": "Latency",
+ "logBase": 1024,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "title": "Row"
+ }
+ ],
+ "time": {
+ "from": "now-7d",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "templating": {
+ "list": []
+ },
+ "annotations": {
+ "list": []
+ },
+ "refresh": "1d",
+ "schemaVersion": 12,
+ "version": 10,
+ "links": [],
+ "gnetId": null
+}
diff --git a/samples/nstat.yaml b/samples/nstat.yaml
new file mode 100644
index 000000000..0a5aa80c9
--- /dev/null
+++ b/samples/nstat.yaml
@@ -0,0 +1,35 @@
+---
+
+schema: "yardstick:task:0.1"
+
+description: >
+ Sample benchmark task config file;
+ Monitor network metrics provided by the kernel in a host and calculate
+ IP datagram error rate, ICMP message error rate, TCP segment error rate and
+ UDP datagram error rate.
+
+scenarios:
+-
+ type: Nstat
+ options:
+ duration: 60
+
+ host: poseidon.demo
+
+ runner:
+ type: Iteration
+ iterations: 1
+
+context:
+ name: demo
+ image: yardstick-image
+ flavor: yardstick-flavor
+ user: ubuntu
+
+ servers:
+ poseidon:
+ floating_ip: true
+
+ networks:
+ test:
+ cidr: '10.0.1.0/24'
diff --git a/tests/ci/yardstick-verify b/tests/ci/yardstick-verify
index f9d98a4da..575bdc821 100755
--- a/tests/ci/yardstick-verify
+++ b/tests/ci/yardstick-verify
@@ -146,11 +146,11 @@ report(){
\"version\":\"$(basename ${YARDSTICK_BRANCH})\",
\"scenario\":\"${DEPLOY_SCENARIO}\",
\"description\": \"yardstick ci scenario status\",
- \"criteria\":\"$1\",
- \"start_date\":\"$2\",
- \"stop_date\":\"$3\",
+ \"criteria\":\"${1}\",
+ \"start_date\":\"${2}\",
+ \"stop_date\":\"${3}\",
\"details\":\"\"}" \
- ${DISPATCHER_HTTP_TARGET}
+ "${DISPATCHER_HTTP_TARGET}"
}
run_test()
@@ -220,7 +220,7 @@ EOF
scenario_status="FAILED"
fi
- report $scenario_status $start_date $stop_date
+ report "${scenario_status}" "${start_date}" "${stop_date}"
if [ $failed -gt 0 ]; then
echo "---------------------------"
diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc076.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc076.yaml
new file mode 100644
index 000000000..c23ee97c2
--- /dev/null
+++ b/tests/opnfv/test_cases/opnfv_yardstick_tc076.yaml
@@ -0,0 +1,56 @@
+---
+
+schema: "yardstick:task:0.1"
+
+description: >
+ Yardstick TC076 config file;
+ Monitor network metrics provided by the kernel in a host and calculate
+ IP datagram error rate, ICMP message error rate, TCP segment error rate and
+ UDP datagram error rate.
+
+scenarios:
+-
+ type: Ping
+ run_in_background: true
+ options:
+ packetsize: 200
+
+ host: demeter.yardstick-TC076
+ target: poseidon.yardstick-TC076
+
+-
+ type: Nstat
+ options:
+ duration: 300
+
+ host: poseidon.yardstick-TC076
+
+ runner:
+ type: Iteration
+ iterations: 1
+
+ sla:
+ IP_datagram_error_rate: 0.01
+ action: monitor
+
+context:
+ name: yardstick-TC076
+ image: yardstick-image
+ 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/unit/benchmark/contexts/test_node.py b/tests/unit/benchmark/contexts/test_node.py
index 64fe4a566..53a8ffa93 100644
--- a/tests/unit/benchmark/contexts/test_node.py
+++ b/tests/unit/benchmark/contexts/test_node.py
@@ -14,6 +14,7 @@
from __future__ import absolute_import
import os
import unittest
+import mock
from yardstick.benchmark.contexts import node
@@ -123,3 +124,98 @@ class NodeContextTestCase(unittest.TestCase):
curr_path = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(curr_path, filename)
return file_path
+
+ prefix = 'yardstick.benchmark.contexts.node'
+
+ @mock.patch('{}.NodeContext._execute_script'.format(prefix))
+ def test_deploy(self, execute_script_mock):
+ obj = node.NodeContext()
+ obj.env = {
+ 'setup': [
+ {'node5': {}}
+ ]
+ }
+ obj.deploy()
+ self.assertTrue(execute_script_mock.called)
+
+ @mock.patch('{}.NodeContext._execute_script'.format(prefix))
+ def test_undeploy(self, execute_script_mock):
+ obj = node.NodeContext()
+ obj.env = {
+ 'teardown': [
+ {'node5': {}}
+ ]
+ }
+ obj.undeploy()
+ self.assertTrue(execute_script_mock.called)
+
+ @mock.patch('{}.ssh.SSH._put_file_shell'.format(prefix))
+ @mock.patch('{}.ssh.SSH.execute'.format(prefix))
+ def test_execute_remote_script(self, execute_mock, put_file_mock):
+ obj = node.NodeContext()
+ obj.env = {'prefix': 'yardstick.benchmark.scenarios.compute'}
+ node_name_args = 'node5'
+ obj.nodes = [{
+ 'name': node_name_args,
+ 'user': 'ubuntu',
+ 'ip': '10.10.10.10',
+ 'pwd': 'ubuntu',
+ }]
+
+ info = {'script': 'computecapacity.bash'}
+ execute_mock.return_value = (0, '', '')
+ obj._execute_remote_script('node5', info)
+
+ self.assertTrue(put_file_mock.called)
+ self.assertTrue(execute_mock.called)
+
+ @mock.patch('{}.NodeContext._execute_local_script'.format(prefix))
+ def test_execute_script_local(self, local_execute_mock):
+ node_name = 'local'
+ info = {}
+ node.NodeContext()._execute_script(node_name, info)
+ self.assertTrue(local_execute_mock.called)
+
+ @mock.patch('{}.NodeContext._execute_remote_script'.format(prefix))
+ def test_execute_script_remote(self, remote_execute_mock):
+ node_name = 'node5'
+ info = {}
+ node.NodeContext()._execute_script(node_name, info)
+ self.assertTrue(remote_execute_mock.called)
+
+ def test_get_script(self):
+ script_args = 'hello.bash'
+ info_args = {
+ 'script': script_args
+ }
+ script, options = node.NodeContext()._get_script(info_args)
+ self.assertEqual(script_args, script)
+ self.assertEqual('', options)
+
+ def test_node_info(self):
+ node_name_args = 'node5'
+ obj = node.NodeContext()
+ obj.nodes = [{'name': node_name_args, 'check': node_name_args}]
+ node_info = obj._get_node_info(node_name_args)
+ self.assertEqual(node_info.get('check'), node_name_args)
+
+ @mock.patch('{}.ssh.SSH.wait'.format(prefix))
+ def test_get_client(self, wait_mock):
+ node_name_args = 'node5'
+ obj = node.NodeContext()
+ obj.nodes = [{
+ 'name': node_name_args,
+ 'user': 'ubuntu',
+ 'ip': '10.10.10.10',
+ 'pwd': 'ubuntu',
+ }]
+ obj._get_client(node_name_args)
+ self.assertTrue(wait_mock.called)
+
+
+def main():
+ unittest.main()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/unit/benchmark/core/test_task.py b/tests/unit/benchmark/core/test_task.py
index c56e21047..cd7ffdebb 100644
--- a/tests/unit/benchmark/core/test_task.py
+++ b/tests/unit/benchmark/core/test_task.py
@@ -155,6 +155,30 @@ class TaskTestCase(unittest.TestCase):
self.assertEqual(task_args_fnames[0], None)
self.assertEqual(task_args_fnames[1], None)
+ def test_change_server_name_host_str(self):
+ scenario = {'host': 'demo'}
+ suffix = '-8'
+ task.change_server_name(scenario, suffix)
+ self.assertTrue(scenario['host'], 'demo-8')
+
+ def test_change_server_name_host_dict(self):
+ scenario = {'host': {'name': 'demo'}}
+ suffix = '-8'
+ task.change_server_name(scenario, suffix)
+ self.assertTrue(scenario['host']['name'], 'demo-8')
+
+ def test_change_server_name_target_str(self):
+ scenario = {'target': 'demo'}
+ suffix = '-8'
+ task.change_server_name(scenario, suffix)
+ self.assertTrue(scenario['target'], 'demo-8')
+
+ def test_change_server_name_target_dict(self):
+ scenario = {'target': {'name': 'demo'}}
+ suffix = '-8'
+ task.change_server_name(scenario, suffix)
+ self.assertTrue(scenario['target']['name'], 'demo-8')
+
def _get_file_abspath(self, filename):
curr_path = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(curr_path, filename)
diff --git a/tests/unit/benchmark/scenarios/networking/test_nstat.py b/tests/unit/benchmark/scenarios/networking/test_nstat.py
new file mode 100644
index 000000000..87a766302
--- /dev/null
+++ b/tests/unit/benchmark/scenarios/networking/test_nstat.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# Unittest for yardstick.benchmark.scenarios.networking.nstat.Nstat
+
+from __future__ import absolute_import
+
+import unittest
+
+import mock
+
+from yardstick.benchmark.scenarios.networking import nstat
+
+@mock.patch('yardstick.benchmark.scenarios.networking.nstat.ssh')
+class NstatTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.ctx = {
+ "host": {
+ "ip": "192.168.50.28",
+ "user": "root",
+ "key_filename": "mykey.key"
+ }
+ }
+
+ def test_nstat_successful_setup(self, mock_ssh):
+
+ n = nstat.Nstat({}, self.ctx)
+ n.setup()
+
+ mock_ssh.SSH().execute.return_value = (0, '', '')
+ self.assertIsNotNone(n.client)
+ self.assertEqual(n.setup_done, True)
+
+ def test_nstat_successful_no_sla(self, mock_ssh):
+
+ options = {
+ "duration": 60
+ }
+ args = {
+ "options": options,
+ }
+ n = nstat.Nstat(args, self.ctx)
+ result = {}
+
+ sample_output = '#kernel\nIpInReceives 1837 0.0\nIpInHdrErrors 0 0.0\nIpInAddrErrors 2 0.0\nIcmpInMsgs 319 0.0\nIcmpInErrors 0 0.0\nTcpInSegs 36 0.0\nTcpInErrs 0 0.0\nUdpInDatagrams 1318 0.0\nUdpInErrors 0 0.0\n'
+
+ mock_ssh.SSH().execute.return_value = (0, sample_output, '')
+
+ n.run(result)
+ expected_result = {"TcpInErrs": 0, "UdpInDatagrams": 1318,
+ "Tcp_segment_error_rate": 0.0, "IpInAddrErrors": 2,
+ "IpInHdrErrors": 0, "IcmpInErrors": 0, "IpErrors": 2,
+ "TcpInSegs": 36, "IpInReceives": 1837, "IcmpInMsgs": 319,
+ "IP_datagram_error_rate": 0.001, "Udp_datagram_error_rate": 0.0,
+ "Icmp_message_error_rate": 0.0, "UdpInErrors": 0}
+ self.assertEqual(result, expected_result)
+
+ def test_nstat_successful_sla(self, mock_ssh):
+
+ options = {
+ "duration": 60
+ }
+ sla = {
+ "IP_datagram_error_rate": 0.1
+ }
+ args = {
+ "options": options,
+ "sla": sla
+ }
+ n = nstat.Nstat(args, self.ctx)
+ result = {}
+
+ sample_output = '#kernel\nIpInReceives 1837 0.0\nIpInHdrErrors 0 0.0\nIpInAddrErrors 2 0.0\nIcmpInMsgs 319 0.0\nIcmpInErrors 0 0.0\nTcpInSegs 36 0.0\nTcpInErrs 0 0.0\nUdpInDatagrams 1318 0.0\nUdpInErrors 0 0.0\n'
+
+ mock_ssh.SSH().execute.return_value = (0, sample_output, '')
+
+ n.run(result)
+ expected_result = {"TcpInErrs": 0, "UdpInDatagrams": 1318,
+ "Tcp_segment_error_rate": 0.0, "IpInAddrErrors": 2,
+ "IpInHdrErrors": 0, "IcmpInErrors": 0, "IpErrors": 2,
+ "TcpInSegs": 36, "IpInReceives": 1837, "IcmpInMsgs": 319,
+ "IP_datagram_error_rate": 0.001, "Udp_datagram_error_rate": 0.0,
+ "Icmp_message_error_rate": 0.0, "UdpInErrors": 0}
+ self.assertEqual(result, expected_result)
+
+ def test_nstat_unsuccessful_cmd_error(self, mock_ssh):
+
+ options = {
+ "duration": 60
+ }
+ sla = {
+ "IP_datagram_error_rate": 0.1
+ }
+ args = {
+ "options": options,
+ "sla": sla
+ }
+ n = nstat.Nstat(args, self.ctx)
+ result = {}
+
+ mock_ssh.SSH().execute.return_value = (1, '', 'FOOBAR')
+ self.assertRaises(RuntimeError, n.run, result)
+
+
+def main():
+ unittest.main()
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/ubuntu-server-cloudimg-dpdk-modify.sh b/tools/ubuntu-server-cloudimg-dpdk-modify.sh
index aa4e252ea..9a3857ee3 100755
--- a/tools/ubuntu-server-cloudimg-dpdk-modify.sh
+++ b/tools/ubuntu-server-cloudimg-dpdk-modify.sh
@@ -63,10 +63,13 @@ linuxheadersversion=`echo ls boot/vmlinuz* | cut -d- -f2-`
apt-get update
apt-get install -y \
+ bc \
fio \
gcc \
git \
iperf3 \
+ iproute2 \
+ ethtool \
linux-tools-common \
linux-tools-generic \
lmbench \
diff --git a/tools/ubuntu-server-cloudimg-modify.sh b/tools/ubuntu-server-cloudimg-modify.sh
index 49c842c97..c0ae774ef 100755
--- a/tools/ubuntu-server-cloudimg-modify.sh
+++ b/tools/ubuntu-server-cloudimg-modify.sh
@@ -58,10 +58,13 @@ bootcmd:
EOF
fi
apt-get install -y \
+ bc \
fio \
git \
gcc \
iperf3 \
+ ethtool \
+ iproute2 \
linux-tools-common \
linux-tools-generic \
lmbench \
diff --git a/yardstick/benchmark/contexts/node.py b/yardstick/benchmark/contexts/node.py
index c7ed3b3f1..6fa9aa99a 100644
--- a/yardstick/benchmark/contexts/node.py
+++ b/yardstick/benchmark/contexts/node.py
@@ -8,14 +8,18 @@
##############################################################################
from __future__ import absolute_import
-import logging
import errno
+import subprocess
import os
import collections
+import logging
+
import yaml
+import pkg_resources
+from yardstick import ssh
from yardstick.benchmark.contexts.base import Context
-from yardstick.definitions import YARDSTICK_ROOT_PATH
+from yardstick.common.constants import YARDSTICK_ROOT_PATH
LOG = logging.getLogger(__name__)
@@ -32,6 +36,7 @@ class NodeContext(Context):
self.controllers = []
self.computes = []
self.baremetals = []
+ self.env = {}
super(NodeContext, self).__init__()
def read_config_file(self):
@@ -69,13 +74,20 @@ class NodeContext(Context):
LOG.debug("Computes: %r", self.computes)
LOG.debug("BareMetals: %r", self.baremetals)
+ self.env = attrs.get('env', {})
+ LOG.debug("Env: %r", self.env)
+
def deploy(self):
- """don't need to deploy"""
- pass
+ setups = self.env.get('setup', [])
+ for setup in setups:
+ for host, info in setup.items():
+ self._execute_script(host, info)
def undeploy(self):
- """don't need to undeploy"""
- pass
+ teardowns = self.env.get('teardown', [])
+ for teardown in teardowns:
+ for host, info in teardown.items():
+ self._execute_script(host, info)
def _get_server(self, attr_name):
"""lookup server info by name from context
@@ -106,3 +118,61 @@ class NodeContext(Context):
node["name"] = attr_name
return node
+
+ def _execute_script(self, node_name, info):
+ if node_name == 'local':
+ self._execute_local_script(info)
+ else:
+ self._execute_remote_script(node_name, info)
+
+ def _execute_remote_script(self, node_name, info):
+ prefix = self.env.get('prefix', '')
+ script, options = self._get_script(info)
+
+ script_file = pkg_resources.resource_filename(prefix, script)
+
+ self._get_client(node_name)
+ self.client._put_file_shell(script_file, '~/{}'.format(script))
+
+ cmd = 'sudo bash {} {}'.format(script, options)
+ status, stdout, stderr = self.client.execute(cmd)
+ if status:
+ raise RuntimeError(stderr)
+
+ def _execute_local_script(self, info):
+ script, options = self._get_script(info)
+ script = os.path.join(YARDSTICK_ROOT_PATH, script)
+ cmd = ['bash', script, options]
+
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+ LOG.debug('\n%s', p.communicate()[0])
+
+ def _get_script(self, info):
+ return info.get('script'), info.get('options', '')
+
+ def _get_client(self, node_name):
+ node = self._get_node_info(node_name.strip())
+
+ if node is None:
+ raise SystemExit('No such node')
+
+ user = node.get('user', 'ubuntu')
+ ssh_port = node.get("ssh_port", ssh.DEFAULT_PORT)
+ ip = node.get('ip')
+ pwd = node.get('password')
+ key_fname = node.get('key_filename', '/root/.ssh/id_rsa')
+
+ if pwd is not None:
+ LOG.debug("Log in via pw, user:%s, host:%s, password:%s",
+ user, ip, pwd)
+ self.client = ssh.SSH(user, ip, password=pwd, port=ssh_port)
+ else:
+ LOG.debug("Log in via key, user:%s, host:%s, key_filename:%s",
+ user, ip, key_fname)
+ self.client = ssh.SSH(user, ip, key_filename=key_fname,
+ port=ssh_port)
+
+ self.client.wait(timeout=600)
+
+ def _get_node_info(self, name):
+ return next((n for n in self.nodes if n['name'].strip() == name))
diff --git a/yardstick/benchmark/core/task.py b/yardstick/benchmark/core/task.py
index 87d70f42f..522ad4d23 100644
--- a/yardstick/benchmark/core/task.py
+++ b/yardstick/benchmark/core/task.py
@@ -85,7 +85,7 @@ class Task(object): # pragma: no cover
# (hide it for exit handler)
Context.list = []
else:
- for context in Context.list:
+ for context in Context.list[::-1]:
context.undeploy()
Context.list = []
one_task_end_time = time.time()
@@ -348,17 +348,23 @@ def atexit_handler():
if len(Context.list) > 0:
print("Undeploying all contexts")
- for context in Context.list:
+ for context in Context.list[::-1]:
context.undeploy()
def is_ip_addr(addr):
"""check if string addr is an IP address"""
try:
+ addr = addr.get('public_ip_attr', addr.get('private_ip_attr'))
+ except AttributeError:
+ pass
+
+ try:
ipaddress.ip_address(addr.encode('utf-8'))
- return True
except ValueError:
return False
+ else:
+ return True
def _is_same_heat_context(host_attr, target_attr):
@@ -499,14 +505,24 @@ def check_environment():
def change_server_name(scenario, suffix):
try:
- scenario['host'] += suffix
+ host = scenario['host']
except KeyError:
pass
+ else:
+ try:
+ host['name'] += suffix
+ except TypeError:
+ scenario['host'] += suffix
try:
- scenario['target'] += suffix
+ target = scenario['target']
except KeyError:
pass
+ else:
+ try:
+ target['name'] += suffix
+ except TypeError:
+ scenario['target'] += suffix
try:
key = 'targets'
diff --git a/yardstick/benchmark/scenarios/networking/nstat.py b/yardstick/benchmark/scenarios/networking/nstat.py
new file mode 100644
index 000000000..df96dbda7
--- /dev/null
+++ b/yardstick/benchmark/scenarios/networking/nstat.py
@@ -0,0 +1,130 @@
+##############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+from __future__ import print_function
+from __future__ import absolute_import
+
+import time
+import logging
+
+import yardstick.ssh as ssh
+from yardstick.benchmark.scenarios import base
+
+LOG = logging.getLogger(__name__)
+
+PRECISION = 3
+
+
+class Nstat(base.Scenario):
+ """Use nstat to monitor network metrics and measure IP datagram error rate
+ and etc.
+ """
+
+ __scenario_type__ = "Nstat"
+
+ def __init__(self, scenario_cfg, context_cfg):
+ """Scenario construction"""
+ self.scenario_cfg = scenario_cfg
+ self.context_cfg = context_cfg
+ self.setup_done = False
+
+ def setup(self):
+ """scenario setup"""
+ host = self.context_cfg["host"]
+ user = host.get("user", "ubuntu")
+ ssh_port = host.get("ssh_port", ssh.DEFAULT_PORT)
+ ip = host.get("ip", None)
+ key_filename = host.get('key_filename', "~/.ssh/id_rsa")
+
+ LOG.info("user:%s, host:%s", user, ip)
+ self.client = ssh.SSH(user, ip, key_filename=key_filename,
+ port=ssh_port)
+ self.client.wait(timeout=600)
+
+ self.setup_done = True
+
+ def match(self, key, field, line, results):
+ """match data in the output"""
+ if key in line:
+ results[key] = int(line.split()[field])
+
+ def calculate_error_rate(self, x, y):
+ """calculate error rate"""
+ try:
+ return round(float(x) / float(y), PRECISION)
+ except ZeroDivisionError:
+ # If incoming Errors is non-zero, but incoming data is zero
+ # consider it as 100% error rate
+ if x:
+ return 1
+ else:
+ return 0
+
+ def process_output(self, out):
+ """process output"""
+ results = {}
+ for line in out.splitlines():
+ self.match('IpInReceives', 1, line, results)
+ self.match('IpInHdrErrors', 1, line, results)
+ self.match('IpInAddrErrors', 1, line, results)
+ self.match('IcmpInMsgs', 1, line, results)
+ self.match('IcmpInErrors', 1, line, results)
+ self.match('TcpInSegs', 1, line, results)
+ self.match('TcpInErrs', 1, line, results)
+ self.match('UdpInDatagrams', 1, line, results)
+ self.match('UdpInErrors', 1, line, results)
+ results['IpErrors'] = \
+ results['IpInHdrErrors'] + results['IpInAddrErrors']
+ results['IP_datagram_error_rate'] = \
+ self.calculate_error_rate(results['IpErrors'],
+ results['IpInReceives'])
+ results['Icmp_message_error_rate'] = \
+ self.calculate_error_rate(results['IcmpInErrors'],
+ results['IcmpInMsgs'])
+ results['Tcp_segment_error_rate'] = \
+ self.calculate_error_rate(results['TcpInErrs'],
+ results['TcpInSegs'])
+ results['Udp_datagram_error_rate'] = \
+ self.calculate_error_rate(results['UdpInErrors'],
+ results['UdpInDatagrams'])
+ return results
+
+ def run(self, result):
+ """execute the benchmark"""
+
+ if not self.setup_done:
+ self.setup()
+
+ options = self.scenario_cfg['options']
+ duration = options.get('duration', 60)
+
+ time.sleep(duration)
+
+ cmd = "nstat -z"
+
+ LOG.debug("Executing command: %s", cmd)
+ status, stdout, stderr = self.client.execute(cmd)
+
+ if status:
+ raise RuntimeError(stderr)
+
+ results = self.process_output(stdout)
+
+ result.update(results)
+
+ if "sla" in self.scenario_cfg:
+ sla_error = ""
+ for i, rate in result.items():
+ if i not in self.scenario_cfg['sla']:
+ continue
+ sla_rate = float(self.scenario_cfg['sla'][i])
+ rate = float(rate)
+ if rate > sla_rate:
+ sla_error += "%s rate %f > sla:%s_rate(%f); " % \
+ (i, rate, i, sla_rate)
+ assert sla_error == "", sla_error
diff --git a/yardstick/cmd/commands/task.py b/yardstick/cmd/commands/task.py
index 57c2b1526..16a4db291 100644
--- a/yardstick/cmd/commands/task.py
+++ b/yardstick/cmd/commands/task.py
@@ -14,7 +14,7 @@ from __future__ import absolute_import
from yardstick.benchmark.core.task import Task
from yardstick.common.utils import cliargs
from yardstick.common.utils import write_json_to_file
-from yardstick.common import constants as consts
+from yardstick.common.utils import read_json_from_file
from yardstick.cmd.commands import change_osloobj_to_paras
output_file_default = "/tmp/yardstick.out"
@@ -24,7 +24,7 @@ class TaskCommands(object):
"""Task commands.
Set of commands to manage benchmark tasks.
- """
+ """
@cliargs("inputfile", type=str, help="path to task or suite file", nargs=1)
@cliargs("--task-args", dest="task_args",
@@ -44,18 +44,25 @@ class TaskCommands(object):
action="store_true")
def do_start(self, args, **kwargs):
param = change_osloobj_to_paras(args)
+ self.output_file = param.output_file
self._init_result_file()
try:
Task().start(param, **kwargs)
+ self._finish()
except Exception as e:
self._write_error_data(e)
def _init_result_file(self):
data = {'status': 0, 'result': []}
- write_json_to_file(consts.DEFAULT_OUTPUT_FILE, data)
+ write_json_to_file(self.output_file, data)
+
+ def _finish(self):
+ result = read_json_from_file(self.output_file).get('result')
+ data = {'status': 1, 'result': result}
+ write_json_to_file(self.output_file, data)
def _write_error_data(self, error):
data = {'status': 2, 'result': str(error)}
- write_json_to_file(consts.DEFAULT_OUTPUT_FILE, data)
+ write_json_to_file(self.output_file, data)
diff --git a/yardstick/common/utils.py b/yardstick/common/utils.py
index 174ac0a5a..04536190b 100644
--- a/yardstick/common/utils.py
+++ b/yardstick/common/utils.py
@@ -148,6 +148,11 @@ def get_neutron_client():
return neutron_client
+def read_json_from_file(path):
+ with open(path, 'r') as f:
+ return jsonutils.load(f)
+
+
def write_json_to_file(path, data, mode='w'):
with open(path, mode) as f:
jsonutils.dump(data, f)
diff --git a/yardstick/dispatcher/file.py b/yardstick/dispatcher/file.py
index 8d3c3693d..6fc81d419 100644
--- a/yardstick/dispatcher/file.py
+++ b/yardstick/dispatcher/file.py
@@ -39,5 +39,8 @@ class FileDispatcher(DispatchBase):
def flush_result_data(self):
file_path = self.conf.get('file_path', consts.DEFAULT_OUTPUT_FILE)
- data = {'status': 1, 'result': self.result}
+ res = utils.read_json_from_file(file_path).get('result')
+ res.extend(self.result)
+
+ data = {'status': 0, 'result': res}
utils.write_json_to_file(file_path, data)