summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xci/create_glance_image.sh15
-rwxr-xr-xci/daily.sh8
-rwxr-xr-xci/generate-admin-rc.sh25
-rwxr-xr-xci/generate-environment.sh10
-rwxr-xr-xci/start_job.sh1
-rw-r--r--docker-compose/create-compose.py13
-rw-r--r--docker-compose/docker-compose.yaml3
-rw-r--r--docker/storperf-master/storperf/db/graphite_db.py7
-rw-r--r--docker/storperf-master/storperf/db/test_results_db.py11
-rw-r--r--docker/storperf-master/storperf/storperf_master.py20
-rw-r--r--docker/storperf-master/storperf/test_executor.py7
-rw-r--r--docker/storperf-master/storperf/utilities/data_handler.py12
-rw-r--r--docker/storperf-master/storperf/workloads/_base_workload.py2
-rw-r--r--docker/storperf-master/tests/db_tests/graphite_db_test.py5
-rw-r--r--docker/storperf-master/tests/utilities_tests/data_handler_test.py3
-rw-r--r--docker/storperf-reporting/src/templates/plot_multi_data.html55
-rw-r--r--docs/release/release-notes/release-notes.rst88
-rw-r--r--docs/testing/user/index.rst4
18 files changed, 188 insertions, 101 deletions
diff --git a/ci/create_glance_image.sh b/ci/create_glance_image.sh
index e99de8c..9181a05 100755
--- a/ci/create_glance_image.sh
+++ b/ci/create_glance_image.sh
@@ -8,9 +8,12 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
+cd "$(dirname "$0")" || exit
+mkdir -p job
+
ARCH="${ARCH:-$(uname -m)}"
-IMAGE_NAME="Ubuntu 16.04 ${ARCH}"
+IMAGE_NAME="Ubuntu 17.04 ${ARCH}"
echo "Checking for ${IMAGE_NAME} in Glance"
@@ -21,14 +24,14 @@ then
case "${ARCH}" in
aarch64)
- FILE=ubuntu-16.04-server-cloudimg-arm64-uefi1.img
+ FILE=ubuntu-17.04-server-cloudimg-arm64.img
PROPERTIES="--property hw_firmware_type=uefi --property hw_video_model=vga"
;;
armhf)
- FILE=ubuntu-16.04-server-cloudimg-armhf-disk1.img
+ FILE=ubuntu-17.04-server-cloudimg-armhf.img
;;
x86_64)
- FILE=ubuntu-16.04-server-cloudimg-amd64-disk1.img
+ FILE=ubuntu-17.04-server-cloudimg-amd64.img
;;
*)
echo "Unsupported architecture: ${ARCH}"
@@ -36,10 +39,12 @@ then
;;
esac
- wget --continue -q "https://cloud-images.ubuntu.com/releases/16.04/release/${FILE}"
+ wget --continue -q "https://cloud-images.ubuntu.com/releases/17.04/release/${FILE}"
openstack image create "${IMAGE_NAME}" --disk-format qcow2 --public \
${PROPERTIES} \
--container-format bare --file "${FILE}"
fi
openstack image show "${IMAGE_NAME}"
+
+echo "${IMAGE_NAME}" > job/glance_image_name
diff --git a/ci/daily.sh b/ci/daily.sh
index 0170b41..f87690f 100755
--- a/ci/daily.sh
+++ b/ci/daily.sh
@@ -36,9 +36,11 @@ pip install python-openstackclient==3.7.0
pip install python-heatclient==1.7.0
"${WORKSPACE}/ci/generate-admin-rc.sh"
+
echo "TEST_DB_URL=http://testresults.opnfv.org/test/api/v1" >> "${WORKSPACE}/ci/job/admin.rc"
"${WORKSPACE}/ci/generate-environment.sh"
+
# shellcheck source=/dev/null
source "${WORKSPACE}/ci/job/environment.rc"
@@ -61,7 +63,6 @@ export VOLUME_SIZE=${VOLUME_SIZE:-2}
export WORKLOADS=${WORKLOADS:-ws,rs,rw}
ARCH="${ARCH:-$(uname -m)}"
-IMAGE_NAME="Ubuntu 16.04 ${ARCH}"
echo ==========================================================================
echo Environment
@@ -71,6 +72,7 @@ echo ==========================================================================
"$WORKSPACE/ci/remove_docker_container.sh"
"$WORKSPACE/ci/delete_stack.sh"
"$WORKSPACE/ci/create_glance_image.sh"
+IMAGE_NAME=$(cat $WORKSPACE/ci/job/glance_image_name)
"$WORKSPACE/ci/create_storperf_flavor.sh"
"$WORKSPACE/ci/launch_docker_container.sh"
"$WORKSPACE/ci/create_stack.sh" "${AGENT_COUNT}" "${VOLUME_SIZE}" "${IMAGE_NAME}" "${NETWORK}"
@@ -88,14 +90,14 @@ JOB=$("${WORKSPACE}/ci/start_job.sh" \
curl -s -X GET "http://127.0.0.1:5000/api/v1.0/jobs?id=${JOB}&type=status" \
-o "${WORKSPACE}/ci/job/status.json"
-JOB_STATUS=$(awk '/Status/ {print $2}' "${WORKSPACE}/ci/job/status.json" | cut -d\" -f2)
+JOB_STATUS=$(grep -A2 $JOB "${WORKSPACE}/ci/job/status.json" | awk '/Status/ {print $2}' | cut -d\" -f2)
while [ "${JOB_STATUS}" != "Completed" ]
do
sleep 600
mv "${WORKSPACE}/ci/job/status.json" "${WORKSPACE}/ci/job/old-status.json"
curl -s -X GET "http://127.0.0.1:5000/api/v1.0/jobs?id=${JOB}&type=status" \
-o "${WORKSPACE}/ci/job/status.json"
- JOB_STATUS=$(awk '/Status/ {print $2}' "${WORKSPACE}/ci/job/status.json" | cut -d\" -f2)
+ JOB_STATUS=$(grep -A2 $JOB "${WORKSPACE}/ci/job/status.json" | awk '/Status/ {print $2}' | cut -d\" -f2)
if diff "${WORKSPACE}/ci/job/status.json" "${WORKSPACE}/ci/job/old-status.json" >/dev/null
then
cat "${WORKSPACE}/ci/job/status.json"
diff --git a/ci/generate-admin-rc.sh b/ci/generate-admin-rc.sh
index e1e6bc9..6767fab 100755
--- a/ci/generate-admin-rc.sh
+++ b/ci/generate-admin-rc.sh
@@ -10,16 +10,14 @@
cd $(dirname "$0")
-if [ ! -d job ]
-then
- mkdir job
-fi
+mkdir -p job
SSH_KEY=""
+CA_CERT=""
INSTALLER="$(./detect_installer.sh)"
case $INSTALLER in
joid)
- OS_AUTH_URL=http://`juju status keystone | grep public | awk '{print $2}'`:5000/v2.0
+ OS_AUTH_URL=http://$(juju status keystone | grep public | awk '{print $2}'):5000/v2.0
OS_USERNAME=admin
OS_PASSWORD=openstack
cat << EOF > job/openstack.rc
@@ -31,12 +29,23 @@ export OS_PROJECT_NAME=admin
EOF
;;
fuel)
- INSTALLER_IP=$(sudo virsh domifaddr cfg01 | grep ipv4 | awk '{print $4}' | cut -d/ -f1)
+ INSTALLER_IP=$(sudo virsh net-dumpxml mcpcontrol | grep 'cfg01' | cut -d"'" -f6)
+ if [ -z "${INSTALLER_IP}" ] ; then
+ echo "Could not find FUEL installer IP"
+ exit 1
+ fi
export BRANCH="${BRANCH:-master}"
+ export BUILD_TAG="${BUILD_TAG:-baremetal}"
SSH_KEY="-s /var/lib/opnfv/mcp.rsa"
+ mkdir -p ../docker-compose/certs
+ CA_CERT="-o ../docker-compose/certs/mcp_os_cacert"
;;
apex)
INSTALLER_IP=$(sudo virsh domifaddr undercloud | grep ipv4 | awk '{print $4}' | cut -d/ -f1)
+ if [ -z "${INSTALLER_IP}" ] ; then
+ echo "Could not find Apex installer IP"
+ exit 1
+ fi
;;
*)
echo "Unknown installer ${INSTALLER}"
@@ -45,12 +54,12 @@ esac
if [ ! -z "${INSTALLER_IP}" ]
then
- CMD="./job/releng/utils/fetch_os_creds.sh -i $INSTALLER -a $INSTALLER_IP $SSH_KEY -d job/openstack.rc"
+ CMD="./job/releng/utils/fetch_os_creds.sh -i $INSTALLER -a $INSTALLER_IP $CA_CERT $SSH_KEY -d job/openstack.rc"
echo $CMD
$CMD
echo export OS_PROJECT_NAME=admin >> job/openstack.rc
fi
-grep "export" job/openstack.rc | sed "s/export //" > job/admin.rc
+awk '/export / { gsub(/"/, x); print $2}' job/openstack.rc > job/admin.rc
echo "INSTALLER_TYPE=${INSTALLER}" >> job/admin.rc
diff --git a/ci/generate-environment.sh b/ci/generate-environment.sh
index c65dc17..79bd20f 100755
--- a/ci/generate-environment.sh
+++ b/ci/generate-environment.sh
@@ -16,6 +16,7 @@ fi
ssh_options="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
export INSTALLER=`./detect_installer.sh`
+TARGET="/dev/vdb"
case $INSTALLER in
joid)
@@ -36,6 +37,12 @@ case $INSTALLER in
# juju status | grep hardware: | grep tags | grep -v virtual
NETWORK=ext-net
;;
+ fuel)
+ CINDER_BACKEND=LVM
+ CINDER_NODES=4
+ NETWORK=floating_net
+ TARGET="/dev/vdc"
+ ;;
apex)
INSTALLER_IP=`sudo virsh domifaddr undercloud | grep ipv4 | awk '{print $4}' | cut -d/ -f1`
CINDER_BACKEND=ceph
@@ -54,4 +61,5 @@ export CINDER_BACKEND=$CINDER_BACKEND
export CINDER_NODES=$CINDER_NODES
export INSTALLER=$INSTALLER
export NETWORK=$NETWORK
-EOF \ No newline at end of file
+export TARGET=$TARGET
+EOF
diff --git a/ci/start_job.sh b/ci/start_job.sh
index 715d40a..6991a0c 100755
--- a/ci/start_job.sh
+++ b/ci/start_job.sh
@@ -15,6 +15,7 @@ cat << EOF > body.json
"steady_state_samples": ${STEADY_STATE_SAMPLES},
"queue_depths": "${QUEUE_DEPTH}",
"workload": "${WORKLOAD}",
+ "target": "${TARGET}",
"metadata": {
"disk_type": "${DISK_TYPE}",
"pod_name": "${POD_NAME}",
diff --git a/docker-compose/create-compose.py b/docker-compose/create-compose.py
index 1a63336..3e3b0c0 100644
--- a/docker-compose/create-compose.py
+++ b/docker-compose/create-compose.py
@@ -26,6 +26,8 @@ services:
container_name: "storperf-master"
image: "opnfv/storperf-master:{storperf_tag}"
env_file: {ENV_FILE}
+ volumes:
+ - ./certs:/etc/ssl/certs/
links:
- storperf-graphite
@@ -54,19 +56,20 @@ services:
- storperf-swaggerui
- storperf-graphite
'''
-storeperf_tag = input("Enter image TAG for storperf-master: ") or 'latest'
+storeperf_tag = input("Enter image TAG for storperf-master: ") \
+ or 'x86_64-latest'
assert isinstance(storeperf_tag, str)
-reporting_tag = input("Enter image TAG for reporting: ") or 'latest'
+reporting_tag = input("Enter image TAG for reporting: ") or 'x86_64-latest'
assert isinstance(reporting_tag, str)
-frontend_tag = input("Enter image TAG for frontend: ") or 'latest'
+frontend_tag = input("Enter image TAG for frontend: ") or 'x86_64-latest'
assert isinstance(frontend_tag, str)
-graphite_tag = input("Enter image TAG for graphite: ") or 'latest'
+graphite_tag = input("Enter image TAG for graphite: ") or 'x86_64-latest'
assert isinstance(graphite_tag, str)
-swaggerui_tag = input("Enter image TAG for swaggerui: ") or 'latest'
+swaggerui_tag = input("Enter image TAG for swaggerui: ") or 'x86_64-latest'
assert isinstance(swaggerui_tag, str)
env_file = input("Enter path to environment file: ")
diff --git a/docker-compose/docker-compose.yaml b/docker-compose/docker-compose.yaml
index 734fb5b..7280d90 100644
--- a/docker-compose/docker-compose.yaml
+++ b/docker-compose/docker-compose.yaml
@@ -13,6 +13,8 @@ services:
container_name: "storperf-master"
image: "opnfv/storperf-master:${TAG}"
env_file: ${ENV_FILE}
+ volumes:
+ - ./certs:/etc/ssl/certs/
links:
- storperf-graphite
@@ -30,6 +32,7 @@ services:
volumes:
- ${CARBON_DIR}:/opt/graphite/storage/whisper
+
storperf-httpfrontend:
container_name: "storperf-httpfrontend"
image: "opnfv/storperf-httpfrontend:${TAG}"
diff --git a/docker/storperf-master/storperf/db/graphite_db.py b/docker/storperf-master/storperf/db/graphite_db.py
index aa71855..8ebd22e 100644
--- a/docker/storperf-master/storperf/db/graphite_db.py
+++ b/docker/storperf-master/storperf/db/graphite_db.py
@@ -33,19 +33,20 @@ class GraphiteDB(object):
return result
- def fetch_series(self, workload, metric, io_type, time, duration):
+ def fetch_series(self, function, workload, metric,
+ io_type, time, duration):
series = []
end = time
start = end - duration
request = ("http://%s:%s/graphite/render/?target="
- "averageSeries(%s.*.jobs.1.%s.%s)"
+ "%s(%s.*.jobs.1.%s.%s)"
"&format=json"
"&from=%s"
"&until=%s"
% (self.graphite_host, self.graphite_port,
- workload, io_type, metric,
+ function, workload, io_type, metric,
start, end))
self.logger.debug("Calling %s" % (request))
diff --git a/docker/storperf-master/storperf/db/test_results_db.py b/docker/storperf-master/storperf/db/test_results_db.py
index 8e9c5ef..3ee09d2 100644
--- a/docker/storperf-master/storperf/db/test_results_db.py
+++ b/docker/storperf-master/storperf/db/test_results_db.py
@@ -17,17 +17,12 @@ def push_results_to_db(db_url, details, logger):
"""
url = db_url + "/results"
- params = details["report"]
-
- if logger:
- logger.info("popped params= %s" % params)
-
headers = {'Content-Type': 'application/json'}
try:
if logger:
- jsonified_params = json.dumps(params)
+ jsonified_params = json.dumps(details)
logger.info("Pushing results to %s" % (url))
- logger.debug("Parameters: %s" % jsonified_params[:1024])
+ logger.debug("Parameters: %s" % details)
r = requests.post(url, data=jsonified_params, headers=headers)
if logger:
logger.debug(r)
@@ -37,5 +32,5 @@ def push_results_to_db(db_url, details, logger):
except Exception:
if logger:
logger.exception("Error [push_results_to_db('%s', '%s')]:" %
- (db_url, params))
+ (db_url, details))
return None
diff --git a/docker/storperf-master/storperf/storperf_master.py b/docker/storperf-master/storperf/storperf_master.py
index 8a67048..c84a02c 100644
--- a/docker/storperf-master/storperf/storperf_master.py
+++ b/docker/storperf-master/storperf/storperf_master.py
@@ -422,11 +422,6 @@ class StorPerfMaster(object):
metadata = self.fetch_metadata(job)
if 'report' in metadata:
metadata['report']['_id'] = job
- metadata['report']['start_date'] = \
- metadata['report']['start_time']
- metadata['report']['end_date'] = \
- metadata['report']['end_time']
- metadata['report']['_id'] = job
job_report['results'].append(metadata['report'])
return job_report
@@ -538,7 +533,14 @@ class StorPerfMaster(object):
loader = loading.get_plugin_loader('password')
auth = loader.load_from_options(**creds)
- sess = session.Session(auth=auth)
+
+ https_cacert = os.getenv('OS_CACERT', '')
+ https_insecure = os.getenv('OS_INSECURE', '').lower() == 'true'
+
+ self.logger.info("cacert=%s" % https_cacert)
+
+ sess = session.Session(auth=auth,
+ verify=(https_cacert or not https_insecure))
self.logger.debug("Looking up orchestration endpoint")
heat_endpoint = sess.get_endpoint(auth=auth,
@@ -546,13 +548,13 @@ class StorPerfMaster(object):
endpoint_type='publicURL')
self.logger.debug("Orchestration endpoint is %s" % heat_endpoint)
- token = sess.get_token(auth=auth)
self._heat_client = heatclient.Client(
"1",
endpoint=heat_endpoint,
- token=token)
+ session=sess)
self.logger.debug("Creating cinder client")
- self._cinder_client = cinderclient.Client("2", session=sess)
+ self._cinder_client = cinderclient.Client("2", session=sess,
+ cacert=https_cacert)
self.logger.debug("OpenStack authentication complete")
diff --git a/docker/storperf-master/storperf/test_executor.py b/docker/storperf-master/storperf/test_executor.py
index 629ae15..96c2ee4 100644
--- a/docker/storperf-master/storperf/test_executor.py
+++ b/docker/storperf-master/storperf/test_executor.py
@@ -230,7 +230,12 @@ class TestExecutor(object):
for job in jobs:
if self.job_db.job_id == job_id and self._terminated is False:
status = "Running"
- result[job] = status
+ result['Status'] = status
+ result['Workloads'] = self.workload_status
+ result['TestResultURL'] = self.result_url
+ else:
+ result[job] = {}
+ result[job]['Status'] = "Completed"
return result
diff --git a/docker/storperf-master/storperf/utilities/data_handler.py b/docker/storperf-master/storperf/utilities/data_handler.py
index 8a69180..b85517f 100644
--- a/docker/storperf-master/storperf/utilities/data_handler.py
+++ b/docker/storperf-master/storperf/utilities/data_handler.py
@@ -43,7 +43,12 @@ class DataHandler(object):
for io_type in ('read', 'write'):
metrics[metric][io_type] = {}
- series = self._lookup_prior_data(executor, metric, io_type)
+ function = "sumSeries"
+ if 'mean' in metric:
+ function = "averageSeries"
+
+ series = self._lookup_prior_data(executor, metric, io_type,
+ function)
series = self._convert_timestamps_to_samples(
executor, series)
steady = self._evaluate_prior_data(
@@ -85,7 +90,7 @@ class DataHandler(object):
if steady_state and not workload_name.startswith('_'):
executor.terminate_current_run()
- def _lookup_prior_data(self, executor, metric, io_type):
+ def _lookup_prior_data(self, executor, metric, io_type, function):
workload = executor.current_workload
graphite_db = GraphiteDB()
@@ -93,7 +98,8 @@ class DataHandler(object):
# data we just sent to it
now = int(time.time())
backtime = 60 * (executor.steady_state_samples + 1)
- data_series = graphite_db.fetch_series(workload,
+ data_series = graphite_db.fetch_series(function,
+ workload,
metric,
io_type,
now,
diff --git a/docker/storperf-master/storperf/workloads/_base_workload.py b/docker/storperf-master/storperf/workloads/_base_workload.py
index c045278..d5282d7 100644
--- a/docker/storperf-master/storperf/workloads/_base_workload.py
+++ b/docker/storperf-master/storperf/workloads/_base_workload.py
@@ -23,7 +23,7 @@ class _base_workload(object):
'bs': '64k',
'iodepth': '1',
'numjobs': '1',
- 'loops': '20',
+ 'loops': '200',
'output-format': 'json',
'status-interval': '60'
}
diff --git a/docker/storperf-master/tests/db_tests/graphite_db_test.py b/docker/storperf-master/tests/db_tests/graphite_db_test.py
index d4c6fb6..d5fbbfc 100644
--- a/docker/storperf-master/tests/db_tests/graphite_db_test.py
+++ b/docker/storperf-master/tests/db_tests/graphite_db_test.py
@@ -83,9 +83,10 @@ class GraphiteDBTest(unittest.TestCase):
[1480456040, 219.28],
[1480456050, 217.75]]
- mock_requests.side_effect = (response, )
+ mock_requests.side_effect = (response,)
- actual = self.graphdb.fetch_series("workload", "iops",
+ actual = self.graphdb.fetch_series("averageSeries",
+ "workload", "iops",
"write", 0, 600)
self.assertEqual(expected, actual)
diff --git a/docker/storperf-master/tests/utilities_tests/data_handler_test.py b/docker/storperf-master/tests/utilities_tests/data_handler_test.py
index 8c7deb5..35150dd 100644
--- a/docker/storperf-master/tests/utilities_tests/data_handler_test.py
+++ b/docker/storperf-master/tests/utilities_tests/data_handler_test.py
@@ -85,7 +85,8 @@ class DataHandlerTest(unittest.TestCase):
8,
8192))
- actual = self.data_handler._lookup_prior_data(self, 'read', 'iops')
+ actual = self.data_handler._lookup_prior_data(self, "sumSeries",
+ 'read', 'iops')
self.assertEqual(expected, actual)
def test_short_sample(self):
diff --git a/docker/storperf-reporting/src/templates/plot_multi_data.html b/docker/storperf-reporting/src/templates/plot_multi_data.html
index 3e64538..9a81599 100644
--- a/docker/storperf-reporting/src/templates/plot_multi_data.html
+++ b/docker/storperf-reporting/src/templates/plot_multi_data.html
@@ -35,8 +35,8 @@
text += "<h4> Criteria : " + results[i]["criteria"] + "</h4>";
text += "<h4> Build Tag : " + results[i]["build_tag"] + "</h4>";
text += "<button type='button' class='btn btn-default btn-lg' id='para-"+ ids[i] +
- "' onclick=add_info('" + ids[i] + "')> Click here to view details </button>";
- text += "</div>";
+ "' onclick=add_info('" + ids[i] + "')> Click here to view details </button>";
+ text += "</div>";
}
$("#content").html(text);
}
@@ -60,15 +60,15 @@
text += "<h4> Criteria : " + results[i]["criteria"] + "</h4>";
text += "<h4> Build Tag : " + results[i]["build_tag"] + "</h4>";
text += "<button type='button' class='btn btn-default btn-lg' onclick=init()>Go Back</button>";
- text += "<button type='button' class='btn btn-default btn-lg' onclick=create_block_report() style='float: right;'> Steady State Convergence Report - All Block Sizes </button>";
+ text += "<button type='button' class='btn btn-default btn-lg' onclick=create_block_report() style='float: right;'> Steady State Convergence Report - All Runs </button>";
text += "<div class='row' id='block_report'></div>"
text += "</div>";
for (var i = 0; i < keys.length; i++ ){
text += "<div class='row' id='row-"+ keys[i] +"'>";
text += "<h4 onclick=add_test('" + keys[i] + "')>" + keys[i] + "</h4>";
text += "</div>";
- }
- $("#content").html(text);
+ }
+ $("#content").html(text);
}
function add_test(key){
if(document.getElementById("test-" + key) == null){
@@ -94,7 +94,7 @@
for( item in report_data[key][test] ){
var state = report_data[key][test][item]["steady_state"];
text += "<li onclick=create_modal('" + key + "','" + test + "','" + item + "') id='";
- text += key + "-" + test + "-" + item + "'>" + item + " (steady state: " + state +")";
+ text += key + "-" + test + "-" + item + "'>" + item + " (steady state: " + state +")";
text += "<br><div id='modal-" + key + "-" + test + "-" + item + "'>";
text += '<div class="modal-content-'+ key + '-' + test + '-' + item +'">';
text += '<div id="modal-text-'+ key + '-' + test + '-' + item +'"></div>';
@@ -131,9 +131,13 @@
else
name = "Latency (nanoseconds/ns)";
var len = data["series"].length;
+ var max_y = 1.25*average
for(var i = 0 ; i < len ; i++){
x[i] = data["series"][i][0];
y[i] = data["series"][i][1];
+ if(y[i] > max_y){
+ max_y=y[i]
+ }
}
var trace1 = {
x: x,
@@ -146,40 +150,41 @@
title: 'Round'
},
yaxis: {
- title: name
+ title: name,
+ range: [0, max_y]
}
};
// Creating average plot in var trace2
- var average_y = [];
+ var average_plus_y = [];
for(var i = 0; i < len ;i++ ){
- average_y.push(average)
+ average_plus_y.push(1.2*average)
}
var trace2 = {
x: x,
- y: average_y,
- name: 'Average',
+ y: average_plus_y,
+ name: 'Average + 20%',
type: 'scatter'
};
// Creating average plot in var trace3
- var average_plus_y = [];
+ var average_y = [];
for(var i = 0; i < len ;i++ ){
- average_plus_y.push(1.1*average)
+ average_y.push(average)
}
var trace3 = {
x: x,
- y: average_plus_y,
- name: '110%*Average',
+ y: average_y,
+ name: 'Average',
type: 'scatter'
};
// Creating average plot in var trace4
var average_minus_y = [];
for(var i = 0; i < len ;i++ ){
- average_minus_y.push(0.9*average)
+ average_minus_y.push(0.8*average)
}
var trace4 = {
x: x,
y: average_minus_y,
- name: '90%*Average',
+ name: 'Average - 20%',
type: 'scatter'
};
// Creating slope plot in var trace5
@@ -223,7 +228,8 @@
"</td><td> Measured Maximum Slope Excursion: " + data["slope"] + "</td></tr>";
table += "</tbody></table>";
document.getElementById("report-" + key + "-" + test + "-" + item).innerHTML = table;
- } function create_block_report(){
+ }
+ function create_block_report(){
var ele = document.getElementById("block_report");
var text = "";
text += "<ul class='list-group' style='margin: auto;'>"
@@ -283,10 +289,10 @@
for(i in report_data){
if(report_data[i][test] == undefined && test == 'lat_ns.mean')
test = 'lat.mean';
- data[i] = report_data[i][test][key];
+ data[i] = report_data[i][test][key];
}
document.getElementById('close-block-report-'+key+'-'+test).style.display = 'block';
- var modal = document.getElementById('modal-block-report-'+key+'-'+test);
+ var modal = document.getElementById('modal-block-report-'+key+'-'+test);
var modal_div = document.getElementById('modal-text-block-report-'+key+'-'+test);
modal_div.innerHTML += "<div id='graph-"+key+ "-"+ test+ "'></div><br><div id='report-"+key+ "-"+ test+ "'></div>";
var name = "";
@@ -298,6 +304,7 @@
else
name = "Latency (nanoseconds/ns)";
var plot_data = [];
+ var max_y = 0
for(i in data){
var x = [];
var y = [];
@@ -305,6 +312,9 @@
for(var j = 0 ; j < len ; j++){
x[j] = data[i]["series"][j][0];
y[j] = data[i]["series"][j][1];
+ if(y[j] > max_y){
+ max_y=y[j]
+ }
}
var trace = {
x: x,
@@ -320,7 +330,8 @@
title: 'Round'
},
yaxis: {
- title: name
+ title: name,
+ range: [0, max_y]
},
};
Plotly.newPlot('graph-'+key+'-'+test,plot_data,layout);
@@ -330,4 +341,4 @@
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/docs/release/release-notes/release-notes.rst b/docs/release/release-notes/release-notes.rst
index 1aea8de..8611171 100644
--- a/docs/release/release-notes/release-notes.rst
+++ b/docs/release/release-notes/release-notes.rst
@@ -2,7 +2,7 @@
.. http://creativecommons.org/licenses/by/4.0
-This document provides the release notes for Danube 3.0 of StorPerf.
+This document provides the release notes for Euphrates 1.0 of StorPerf.
.. contents::
:depth: 3
@@ -10,7 +10,7 @@ This document provides the release notes for Danube 3.0 of StorPerf.
Version history
----------------
+===============
+--------------------+--------------------+--------------------+--------------------+
@@ -23,24 +23,26 @@ Version history
Important notes
-===============
-This is the last release where StorPerf is delivered as a single container. Moving
-forward, StorPerf must be run using docker-compose.
+----------------
+
+This is the release where StorPerf is not delivered as a single container but
+is delivered as a series of networked containers. StorPerf must be run using
+docker-compose.
Summary
-=======
+--------
StorPerf is a standalone framework that uses OpenStack to measure Cinder volume
performance. If desired, it can push results to the OPNFV Test Results DB, or
the embedded Graphite web interface can be used to perform ad hoc queries.
This release changes to docker-compose framework and adds the StorPerf
-reporting module. It also marks a change from microsecond (us) to nano-second
-precision for all reported latencies. This is denoted by a change from
-lat.mean to lat_ns.mean for read and write metrics.
+reporting module. It also marks a change from microsecond (:math:`\mu`\s) to
+nano-second (ns) precision for all reported latencies. This is denoted by a change
+from lat.mean to lat_ns.mean for read and write metrics.
Release Data
-============
+-------------
+--------------------------------------+--------------------------------------+
| **Project** | StorPerf |
@@ -49,7 +51,7 @@ Release Data
| **Repo/commit-ID** | storperf/euphrates.1.0 |
| | |
+--------------------------------------+--------------------------------------+
-| **Release designation** | Danube base release |
+| **Release designation** | Euphrates base release |
| | |
+--------------------------------------+--------------------------------------+
| **Release date** | 2017-10-06 |
@@ -60,55 +62,87 @@ Release Data
+--------------------------------------+--------------------------------------+
Version change
---------------
+===============
Module version changes
-^^^^^^^^^^^^^^^^^^^^^^
+-----------------------
No changes to any modules.
Reason for version
-------------------
+===================
Features additions
-^^^^^^^^^^^^^^^^^^
+-------------------
* STORPERF-125 - StorPerf container decomposition
* STORPERF-141 - Create a series of graphs to support SNIA targers
+* STORPERF-94 - Logs can now be viewed via the API. One has the choice to either view the complete length of logs,
+ or limit himself to just a few lines.
+* STORPERF-193 - Support for ARM: StorPerf images for ARM and x86_64
+ are published on docker hub with the architecture in the image tag.
+* STORPERF-174 - Container base switched to Alpine
+* STORPERF-92 - Allow flavor to be set in stack create
+* STORPERF-178 - Add ability to specify availability zone
+* STORPERF-175 - Support for different agent OS, such as Cirros
+
Bug Fixes
-^^^^^^^^^
+----------
-The following minor bugs have been fixed
+The following minor bugs have been fixed:
+* STORPERF-56 - Cannot delete stack if create failed
+* STORPERF-180 - No details if stack create failed
+* STORPERF-186 - Duplicate entries for _warm_up with status query
+* STORPERF-197 - FIO 2.2.10 hangs when statically built
+* STORPERF-216 - Incorrect key names posted to testresults DB
-See JIRA for full `change log <https://jira.opnfv.org/jira/secure/ReleaseNote.jspa?projectId=11002&version=10714>`_
+
+See JIRA for full `change log <https://jira.opnfv.org/jira/secure/ReleaseNote.jspa?projectId=11002&version=11227>`_
Deliverables
-------------
+=============
Software
-^^^^^^^^
+---------
+
+- `StorPerf master image <https://hub.docker.com/r/opnfv/storperf-master/>`_
+ (tag: x86_64-euphrates.1.0 or aarch64-euphrates.1.0)
-- `StorPerf Docker image <https://hub.docker.com/r/opnfv/storperf/tags>`_ (tag: danube.3.0)
+- `StorPerf swaggerui <https://hub.docker.com/r/opnfv/storperf-swaggerui/>`_
+ (tag: x86_64-euphrates.1.0 or aarch64-euphrates.1.0)
+
+- `StorPerf graphite image <https://hub.docker.com/r/opnfv/storperf-graphite/>`_
+ (tag: x86_64-euphrates.1.0 or aarch64-euphrates.1.0)
+
+- `StorPerf reporting image <https://hub.docker.com/r/opnfv/storperf-reporting/>`_
+ (tag: x86_64-euphrates.1.0 or aarch64-euphrates.1.0)
+
+- `StorPerf Http-Frontend image <https://hub.docker.com/r/opnfv/storperf-httpfrontend/>`_
+ (tag: x86_64-euphrates.1.0 or aarch64-euphrates.1.0)
Documentation
-^^^^^^^^^^^^^
+--------------
- `User Guide <http://docs.opnfv.org/en/latest/submodules/storperf/docs/testing/user/index.html>`_
Known Limitations, Issues and Workarounds
-=========================================
+------------------------------------------
Limitations
------------
+============
+
-* Does not work with a target OS that requires authentication instead of using init-cloud for generating the ssh key.
Known issues
-------------
-* STORPERF-56 - Cannot delete stack if create failed
+=============
+
+* Cirros target VMs do not always mount Cinder volumes on first boot. Sometimes
+ a reboot of the VM is required to properly attach the Cinder volume to /dev/vdb
+
Test Result
===========
+- `OPNFV Test Results DB <http://testresults.opnfv.org/reporting/euphrates/storperf/status-apex.html>`_
diff --git a/docs/testing/user/index.rst b/docs/testing/user/index.rst
index 1f4a6cd..65509a1 100644
--- a/docs/testing/user/index.rst
+++ b/docs/testing/user/index.rst
@@ -5,9 +5,9 @@
.. http://creativecommons.org/licenses/by/4.0
.. (c) OPNFV, Dell EMC and others.
-======================
+*******************
StorPerf User Guide
-======================
+*******************
.. toctree::
:maxdepth: 2