diff options
28 files changed, 2785 insertions, 31 deletions
diff --git a/dashboard/Yardstick-TC002-1456495853488 b/dashboard/Yardstick-TC002-1456495853488 index eb8c27d43..8bf10f445 100644 --- a/dashboard/Yardstick-TC002-1456495853488 +++ b/dashboard/Yardstick-TC002-1456495853488 @@ -1038,6 +1038,121 @@ "type": "table", "repeatIteration": 1456495841616, "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": { + "selected": true, + "text": "zte-pod1", + "value": "zte\\-pod1" + } + }, + "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": "24h", + "title": "$POD", + "transform": "table", + "transparent": false, + "type": "table", + "repeatIteration": 1456495841616, + "repeatPanelId": 2 } ], "showTitle": false, @@ -2053,6 +2168,174 @@ ], "repeatIteration": 1456495841616, "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": { + "selected": true, + "text": "zte-pod1", + "value": "zte\\-pod1" + } + }, + "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": 1456495841616, + "repeatPanelId": 3 } ], "showTitle": false, @@ -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-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", @@ -2116,7 +2400,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, @@ -2154,6 +2438,11 @@ "value": "orange\\-fr\\-pod2" }, { + "selected": true, + "text": "zte-pod1", + "value": "zte\\-pod1" + }, + { "selected": false, "text": "unknown", "value": "unknown" @@ -2241,4 +2530,4 @@ "schemaVersion": 8, "version": 113, "links": [] -}
\ No newline at end of file +} diff --git a/dashboard/Yardstick-TC005-1456495868837 b/dashboard/Yardstick-TC005-1456495868837 index c9719860e..e5b29d3dd 100644 --- a/dashboard/Yardstick-TC005-1456495868837 +++ b/dashboard/Yardstick-TC005-1456495868837 @@ -837,6 +837,113 @@ "type": "table", "repeatIteration": 1456495861692, "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_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": "24h", + "title": "$POD", + "transform": "timeseries_to_rows", + "type": "table", + "repeatIteration": 1456495861692, + "repeatPanelId": 5 } ], "title": "New row" @@ -1629,6 +1736,137 @@ ], "repeatIteration": 1456495861692, "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_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": "10d", + "timeShift": null, + "title": "$POD", + "tooltip": { + "shared": true, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "repeatIteration": 1456495861692, + "repeatPanelId": 7 } ], "title": "New row" @@ -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-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", @@ -1688,7 +1927,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, @@ -1726,6 +1965,11 @@ "value": "orange\\-fr\\-pod2" }, { + "selected": true, + "text": "zte-pod1", + "value": "zte\\-pod1" + }, + { "selected": false, "text": "unknown", "value": "unknown" @@ -1808,4 +2052,4 @@ "schemaVersion": 8, "version": 9, "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/tests/opnfv/test_cases/opnfv_yardstick_tc004.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc004.yaml new file mode 100644 index 000000000..2d10e4073 --- /dev/null +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc004.yaml @@ -0,0 +1,85 @@ +--- +# Yardstick TC004 config file +# Measure cache hit/miss ratio and usage, network throughput and latency. +# 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 cache hit/miss ration, cache usage statistics and +# network latency are recorded/measured using cachestat and ping, respectively. + +schema: "yardstick:task:0.1" + +scenarios: +- + type: CACHEstat + run_in_background: true + + options: + interval: 1 + + host: demeter.yardstick +- + type: CACHEstat + run_in_background: true + + options: + interval: 1 + + host: poseidon.yardstick +- + type: Ping + run_in_background: true + + options: + packetsize: 100 + + host: demeter.yardstick + target: poseidon.yardstick + + 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 + target: poseidon.yardstick + + runner: + type: Iteration + iterations: 2 + interval: 1 + + sla: + max_ppm: 1000 + action: monitor +{% endfor %} + +context: + name: yardstick + 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_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/unit/benchmark/scenarios/availability/test_baseoperation.py b/tests/unit/benchmark/scenarios/availability/test_baseoperation.py new file mode 100644 index 000000000..8c341913f --- /dev/null +++ b/tests/unit/benchmark/scenarios/availability/test_baseoperation.py @@ -0,0 +1,82 @@ +#!/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.operation.baseoperation + +import mock +import unittest + +from yardstick.benchmark.scenarios.availability.operation import baseoperation + +@mock.patch('yardstick.benchmark.scenarios.availability.operation.baseoperation.BaseOperation') +class OperationMgrTestCase(unittest.TestCase): + + def setUp(self): + config = { + 'operation_type': 'general-operation', + 'key' : 'service_status' + } + + self.operation_configs = [] + self.operation_configs.append(config) + + def test_all_successful(self, mock_operation): + mgr_ins = baseoperation.OperationMgr() + mgr_ins.init_operations(self.operation_configs, None) + operation_ins = mgr_ins["service_status"] + mgr_ins.rollback() + + def test_getitem_fail(self, mock_operation): + mgr_ins = baseoperation.OperationMgr() + mgr_ins.init_operations(self.operation_configs, None) + with self.assertRaises(KeyError): + operation_ins = mgr_ins["operation-not-exist"] + + +class TestOperation(baseoperation.BaseOperation): + __operation__type__ = "test-operation" + + def setup(self): + pass + + def run(self): + pass + + def rollback(self): + pass + + +class BaseOperationTestCase(unittest.TestCase): + + def setUp(self): + self.config = { + 'operation_type': 'general-operation', + 'key' : 'service_status' + } + + def test_all_successful(self): + base_ins = baseoperation.BaseOperation(self.config, None) + base_ins.setup() + base_ins.run() + base_ins.rollback() + + def test_get_script_fullpath(self): + base_ins = baseoperation.BaseOperation(self.config, None) + base_ins.get_script_fullpath("ha_tools/test.bash"); + + def test_get_operation_cls_successful(self): + base_ins = baseoperation.BaseOperation(self.config, None) + operation_ins = base_ins.get_operation_cls("test-operation") + + def test_get_operation_cls_fail(self): + base_ins = baseoperation.BaseOperation(self.config, None) + with self.assertRaises(RuntimeError): + operation_ins = base_ins.get_operation_cls("operation-not-exist") 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_operation_general.py b/tests/unit/benchmark/scenarios/availability/test_operation_general.py new file mode 100644 index 000000000..6713733a8 --- /dev/null +++ b/tests/unit/benchmark/scenarios/availability/test_operation_general.py @@ -0,0 +1,67 @@ +#!/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.operation +# .operation_general + +import mock +import unittest +from yardstick.benchmark.scenarios.availability.operation import operation_general + +@mock.patch('yardstick.benchmark.scenarios.availability.operation.' + 'operation_general.ssh') +@mock.patch('yardstick.benchmark.scenarios.availability.operation.' + 'operation_general.open') +class GeneralOperaionTestCase(unittest.TestCase): + + def setUp(self): + host = { + "ip": "10.20.0.5", + "user": "root", + "key_filename": "/root/.ssh/id_rsa" + } + self.context = {"node1": host} + self.operation_cfg = { + 'operation_type': 'general-operation', + 'action_parameter': {'ins_cup': 2}, + 'rollback_parameter': {'ins_id': 'id123456'}, + 'key': 'nova-create-instance', + 'host': 'node1', + } + self.operation_cfg_noparam = { + 'operation_type': 'general-operation', + 'key': 'nova-create-instance', + 'host': 'node1', + } + + def test__operation_successful(self, mock_open, mock_ssh): + ins = operation_general.GeneralOperaion(self.operation_cfg, + self.context); + mock_ssh.SSH().execute.return_value = (0, "success", '') + ins.setup() + ins.run() + ins.rollback() + + def test__operation_successful_noparam(self, mock_open, mock_ssh): + ins = operation_general.GeneralOperaion(self.operation_cfg_noparam, + self.context); + mock_ssh.SSH().execute.return_value = (0, "success", '') + ins.setup() + ins.run() + ins.rollback() + + def test__operation_fail(self, mock_open, mock_ssh): + ins = operation_general.GeneralOperaion(self.operation_cfg, + self.context); + mock_ssh.SSH().execute.return_value = (1, "failed", '') + ins.setup() + ins.run() + ins.rollback() 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/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..fdad0fe95 100755 --- a/yardstick/benchmark/scenarios/availability/__init__.py +++ b/yardstick/benchmark/scenarios/availability/__init__.py @@ -0,0 +1,25 @@ +############################################################################## +# 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" + RESULTCOMPARER = "comparer" + 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/operation/__init__.py b/yardstick/benchmark/scenarios/availability/operation/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation/__init__.py diff --git a/yardstick/benchmark/scenarios/availability/operation/baseoperation.py b/yardstick/benchmark/scenarios/availability/operation/baseoperation.py new file mode 100644 index 000000000..e776e87ae --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation/baseoperation.py @@ -0,0 +1,81 @@ +############################################################################## +# 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__) + +operation_conf_path = pkg_resources.resource_filename( + "yardstick.benchmark.scenarios.availability", + "operation_conf.yaml") + + +class OperationMgr(object): + + def __init__(self): + self._operation_list = [] + + def init_operations(self, operation_cfgs, context): + LOG.debug("operationMgr confg: %s" % operation_cfgs) + for cfg in operation_cfgs: + operation_type = cfg['operation_type'] + operation_cls = BaseOperation.get_operation_cls(operation_type) + operation_ins = operation_cls(cfg, context) + operation_ins.key = cfg['key'] + operation_ins.setup() + self._operation_list.append(operation_ins) + + def __getitem__(self, item): + for obj in self._operation_list: + if(obj.key == item): + return obj + raise KeyError("No such operation instance of key - %s" % item) + + def rollback(self): + for _instance in self._operation_list: + _instance.rollback() + + +class BaseOperation(object): + + operation_cfgs = {} + + def __init__(self, config, context): + if not BaseOperation.operation_cfgs: + with open(operation_conf_path) as stream: + BaseOperation.operation_cfgs = yaml.load(stream) + self.key = '' + self._config = config + self._context = context + + @staticmethod + def get_operation_cls(type): + '''return operation instance of specified type''' + operation_type = type + for operation_cls in utils.itersubclasses(BaseOperation): + if operation_type == operation_cls.__operation__type__: + return operation_cls + raise RuntimeError("No such runner_type %s" % operation_type) + + def get_script_fullpath(self, path): + base_path = os.path.dirname(operation_conf_path) + return os.path.join(base_path, path) + + def setup(self): + pass + + def run(self): + pass + + def rollback(self): + pass diff --git a/yardstick/benchmark/scenarios/availability/operation/operation_general.py b/yardstick/benchmark/scenarios/availability/operation/operation_general.py new file mode 100644 index 000000000..d41371629 --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation/operation_general.py @@ -0,0 +1,77 @@ +############################################################################## +# 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 baseoperation import BaseOperation +import yardstick.ssh as ssh +from yardstick.benchmark.scenarios.availability.util import buildshellparams + +LOG = logging.getLogger(__name__) + + +class GeneralOperaion(BaseOperation): + + __operation__type__ = "general-operation" + + 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'] + + if "action_parameter" in self._config: + actionParameter = self._config['action_parameter'] + str = buildshellparams(actionParameter) + l = list(item for item in actionParameter.values()) + self.action_param = str.format(*l) + + if "rollback_parameter" in self._config: + rollbackParameter = self._config['rollback_parameter'] + str = buildshellparams(rollbackParameter) + l = list(item for item in rollbackParameter.values()) + self.rollback_param = str.format(*l) + + self.operation_cfgs = BaseOperation.operation_cfgs.get(self.key) + self.action_script = self.get_script_fullpath( + self.operation_cfgs['action_script']) + self.rollback_script = self.get_script_fullpath( + self.operation_cfgs['rollback_script']) + + def run(self): + if "action_parameter" in self._config: + exit_status, stdout, stderr = self.connection.execute( + self.action_param, + stdin=open(self.action_script, "r")) + else: + exit_status, stdout, stderr = self.connection.execute( + "/bin/sh -s ", + stdin=open(self.action_script, "r")) + + if exit_status == 0: + LOG.debug("success,the operation's output is: {0}".format(stdout)) + else: + LOG.error( + "the operation's error, stdout:%s, stderr:%s" % + (stdout, stderr)) + + def rollback(self): + if "rollback_parameter" in self._config: + exit_status, stdout, stderr = self.connection.execute( + self.rollback_param, + stdin=open(self.rollback_script, "r")) + else: + exit_status, stdout, stderr = self.connection.execute( + "/bin/sh -s ", + stdin=open(self.rollback_script, "r")) diff --git a/yardstick/benchmark/scenarios/availability/operation_conf.yaml b/yardstick/benchmark/scenarios/availability/operation_conf.yaml new file mode 100644 index 000000000..78c996d05 --- /dev/null +++ b/yardstick/benchmark/scenarios/availability/operation_conf.yaml @@ -0,0 +1,16 @@ +--- +# sample config file for ha test +# +schema: "yardstick:task:0.1" + +nova-create-instance: + action_script: ha_tools/nova/create_instance_from_image.bash + rollback_script: ha_tools/nova/delete_instance.bash + +swift_upload_file: + action_script: ha_tools/swift/upload.bash + rollback_script: ha_tools/swift/delete.bash + +swift_download_file: + action_script: ha_tools/swift/download.bash + rollback_script: ha_tools/file/remove_file.bash
\ No newline at end of file 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/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 |