From 45130c365c235bc4a5a53fd0ddb15f84a1460199 Mon Sep 17 00:00:00 2001 From: mbeierl Date: Wed, 21 Jun 2017 16:02:57 -0400 Subject: Allow User to Specify Flavor Adds flavor as parameter to ReST /configurations API and passes it through to the heat template creation. Change-Id: Id3632fb571da9da51b4d75db58c7a7c0a91e0ccf JIRA: STORPERF-92 Signed-off-by: mbeierl --- ci/start_job.sh | 2 +- rest_server.py | 27 ++++++++++++++++----------- storperf/resources/hot/agent-group.yaml | 4 ++-- storperf/storperf_master.py | 18 ++++++++++++++++++ tests/db_tests/configuration_db_test.py | 9 +++------ tests/storperf_master_test.py | 18 ++++++++++++------ 6 files changed, 52 insertions(+), 26 deletions(-) diff --git a/ci/start_job.sh b/ci/start_job.sh index 0a149fd..487e0c6 100755 --- a/ci/start_job.sh +++ b/ci/start_job.sh @@ -15,7 +15,7 @@ cat << EOF > body.json "steady_state_samples": ${STEADY_STATE_SAMPLES}, "queue_depths": "${QUEUE_DEPTH}", "workload": "${WORKLOAD}", - "metadata": { + "metadata": { "disk_type": "${DISK_TYPE}", "pod_name": "${POD_NAME}", "scenario_name": "${SCENARIO_NAME}", diff --git a/rest_server.py b/rest_server.py index 67d71a5..5bff09c 100644 --- a/rest_server.py +++ b/rest_server.py @@ -12,7 +12,7 @@ import logging.config import os import sys -from flask import abort, Flask, request, jsonify, send_from_directory +from flask import abort, Flask, request, jsonify from flask_restful import Resource, Api, fields from flask_restful_swagger import swagger @@ -41,6 +41,7 @@ class ConfigurationRequestModel: class ConfigurationResponseModel: resource_fields = { 'agent_count': fields.Integer, + 'agent_flavor': fields.String, 'agent_image': fields.String, 'public_network': fields.String, 'stack_created': fields.Boolean, @@ -62,6 +63,7 @@ class Configure(Resource): ) def get(self): return jsonify({'agent_count': storperf.agent_count, + 'agent_flavor': storperf.agent_flavor, 'agent_image': storperf.agent_image, 'public_network': storperf.public_network, 'volume_size': storperf.volume_size, @@ -92,6 +94,8 @@ class Configure(Resource): try: if ('agent_count' in request.json): storperf.agent_count = request.json['agent_count'] + if ('agent_flavor' in request.json): + storperf.agent_flavor = request.json['agent_flavor'] if ('agent_image' in request.json): storperf.agent_image = request.json['agent_image'] if ('public_network' in request.json): @@ -102,6 +106,7 @@ class Configure(Resource): storperf.create_stack() return jsonify({'agent_count': storperf.agent_count, + 'agent_flavor': storperf.agent_flavor, 'agent_image': storperf.agent_image, 'public_network': storperf.public_network, 'volume_size': storperf.volume_size, @@ -154,16 +159,16 @@ class Job(Resource): "description": "The UUID of the workload in the format " "NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN", "required": True, - "type": "string", + "metrics_type": "string", "allowMultiple": False, "paramType": "query" }, { - "name": "type", - "description": "The type of metrics to report. May be " + "name": "metrics_type", + "description": "The metrics_type of metrics to report. May be " "metrics (default), or metadata", "required": False, - "type": "string", + "metrics_type": "string", "allowMultiple": False, "paramType": "query" } @@ -181,19 +186,19 @@ class Job(Resource): ) def get(self): - type = "metrics" - if request.args.get('type'): - type = request.args.get('type') + metrics_type = "metrics" + if request.args.get('metrics_type'): + metrics_type = request.args.get('metrics_type') workload_id = request.args.get('id') - if type == "metrics": + if metrics_type == "metrics": return jsonify(storperf.fetch_results(workload_id)) - if type == "metadata": + if metrics_type == "metadata": return jsonify(storperf.fetch_metadata(workload_id)) - if type == "status": + if metrics_type == "status": return jsonify(storperf.fetch_job_status(workload_id)) @swagger.operation( diff --git a/storperf/resources/hot/agent-group.yaml b/storperf/resources/hot/agent-group.yaml index a06c847..c758ecd 100644 --- a/storperf/resources/hot/agent-group.yaml +++ b/storperf/resources/hot/agent-group.yaml @@ -14,7 +14,7 @@ parameters: type: string constraints: - custom_constraint: neutron.network - flavor: + agent_flavor: type: string default: "storperf" agent_image: @@ -47,7 +47,7 @@ resources: properties: { public_network: {get_param: public_network}, agent_network: {get_resource: storperf_network}, - flavor: {get_param: flavor}, + flavor: {get_param: agent_flavor}, image: {get_param: agent_image}, storperf_open_security_group: {get_resource: storperf_open_security_group}, key_name: {get_resource: storperf_key_pair}, diff --git a/storperf/storperf_master.py b/storperf/storperf_master.py index 5432ece..fb3e269 100644 --- a/storperf/storperf_master.py +++ b/storperf/storperf_master.py @@ -137,6 +137,23 @@ class StorPerfMaster(object): 'public_network', value) + @property + def agent_flavor(self): + return self.configuration_db.get_configuration_value( + 'stack', + 'agent_flavor') + + @agent_flavor.setter + def agent_flavor(self, value): + if (self.stack_id is not None): + raise ParameterError( + "ERROR: Cannot change flavor after stack is created") + + self.configuration_db.set_configuration_value( + 'stack', + 'agent_flavor', + value) + @property def stack_id(self): return self.configuration_db.get_configuration_value( @@ -380,6 +397,7 @@ class StorPerfMaster(object): heat_parameters['agent_count'] = self.agent_count heat_parameters['volume_size'] = self.volume_size heat_parameters['agent_image'] = self.agent_image + heat_parameters['agent_flavor'] = self.agent_flavor return heat_parameters def _attach_to_openstack(self): diff --git a/tests/db_tests/configuration_db_test.py b/tests/db_tests/configuration_db_test.py index e8b7188..dda616b 100644 --- a/tests/db_tests/configuration_db_test.py +++ b/tests/db_tests/configuration_db_test.py @@ -10,17 +10,14 @@ from storperf.db.configuration_db import ConfigurationDB import os import unittest +import sqlite3 class ConfigurationDBTest(unittest.TestCase): def setUp(self): - ConfigurationDB.db_name = __name__ + ".db" - try: - os.remove(ConfigurationDB.db_name) - except OSError: - pass - + ConfigurationDB.db_name = "file::memory:?cache=shared" + db = sqlite3.connect(ConfigurationDB.db_name) self.config_db = ConfigurationDB() def test_create_key(self): diff --git a/tests/storperf_master_test.py b/tests/storperf_master_test.py index 2dc810d..c67e3c4 100644 --- a/tests/storperf_master_test.py +++ b/tests/storperf_master_test.py @@ -9,18 +9,15 @@ from storperf.db.configuration_db import ConfigurationDB from storperf.storperf_master import StorPerfMaster -import os import unittest +import sqlite3 class StorPerfMasterTest(unittest.TestCase): def setUp(self): - ConfigurationDB.db_name = __name__ + ".db" - try: - os.remove(ConfigurationDB.db_name) - except OSError: - pass + ConfigurationDB.db_name = "file::memory:?cache=shared" + db = sqlite3.connect(ConfigurationDB.db_name) self.storperf = StorPerfMaster() def test_agent_count(self): @@ -67,3 +64,12 @@ class StorPerfMasterTest(unittest.TestCase): self.assertEqual( expected, actual, "Did not expect: " + str(actual)) + + def test_agent_flavor(self): + expected = "m1.small" + + self.storperf.agent_flavor = expected + actual = self.storperf.agent_flavor + + self.assertEqual( + expected, actual, "Did not expect: " + str(actual)) -- cgit 1.2.3-korg