From 8d56e59c70f15897e366a0dbddefda43107b61c6 Mon Sep 17 00:00:00 2001 From: akhilbatra898 Date: Fri, 10 Mar 2017 15:35:04 +0530 Subject: Implement Retrieval of plans, QPIs, and metrics - All specs can be listed - All specs can be individually retrieved - API can be installed alongside qtip - API can be hosted using command `qtip-api` JIRA: QTIP-221 JIRA: QTIP-222 Change-Id: I1e80e6609cae1252cb2fcdc38c71b4bf6d02e8c9 Signed-off-by: akhilbatra898 (cherry picked from commit 15fceada86ad0d5dabe26365451aae9c95b36be1) --- qtip/api/__main__.py | 3 +- qtip/api/controllers/metric.py | 23 ++++--- qtip/api/controllers/plan.py | 23 ++++--- qtip/api/controllers/qpi.py | 23 ++++--- qtip/api/swagger/swagger.yaml | 132 ++++++++++++++++++++++++++++++++++++++--- 5 files changed, 173 insertions(+), 31 deletions(-) (limited to 'qtip') diff --git a/qtip/api/__main__.py b/qtip/api/__main__.py index 7b9cdaf5..05d92315 100644 --- a/qtip/api/__main__.py +++ b/qtip/api/__main__.py @@ -10,13 +10,14 @@ import connexion import os + swagger_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'swagger/')) def main(): app = connexion.App(__name__, specification_dir=swagger_dir) app.add_api('swagger.yaml', base_path='/v1.0') - app.run(host='0.0.0.0', port='5000') + app.run(host="0.0.0.0", port=5000) if __name__ == '__main__': diff --git a/qtip/api/controllers/metric.py b/qtip/api/controllers/metric.py index a026b5fc..86bf70f9 100644 --- a/qtip/api/controllers/metric.py +++ b/qtip/api/controllers/metric.py @@ -7,17 +7,26 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -import connexion import httplib +import connexion + +from qtip.base import error +from qtip.loader import metric + def list_metrics(): - return connexion.problem(httplib.NOT_IMPLEMENTED, - 'List metrics', - 'Metrics listing not implemented') + metric_list = list(metric.MetricSpec.list_all()) + return metric_list, httplib.OK def get_metric(name): - return connexion.problem(httplib.NOT_IMPLEMENTED, - 'Get a metric', - 'metric retrieval not implemented') + try: + metric_spec = metric.MetricSpec(name) + return {'name': metric_spec.name, + 'abspath': metric_spec.abspath, + 'content': metric_spec.content}, httplib.OK + except error.NotFoundError: + return connexion.problem(httplib.NOT_FOUND, + 'Metric Not Found', + 'Requested metric `' + name + '` not found.') diff --git a/qtip/api/controllers/plan.py b/qtip/api/controllers/plan.py index e202b413..93836a32 100644 --- a/qtip/api/controllers/plan.py +++ b/qtip/api/controllers/plan.py @@ -7,20 +7,29 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -import connexion import httplib +import connexion + +from qtip.base import error +from qtip.loader import plan + def list_plans(): - return connexion.problem(httplib.NOT_IMPLEMENTED, - 'List plans', - 'Plans listing not implemented') + plan_list = list(plan.Plan.list_all()) + return plan_list, httplib.OK def get_plan(name): - return connexion.problem(httplib.NOT_IMPLEMENTED, - 'Get a plan', - 'Plan retrieval not implemented') + try: + plan_spec = plan.Plan(name) + return {'name': plan_spec.name, + 'abspath': plan_spec.abspath, + 'content': plan_spec.content}, httplib.OK + except error.NotFoundError: + return connexion.problem(httplib.NOT_FOUND, + 'Plan Not Found', + 'requested plan `' + name + '` not found.') def run_plan(name, action="run"): diff --git a/qtip/api/controllers/qpi.py b/qtip/api/controllers/qpi.py index 0b5c5b09..3c4dd718 100644 --- a/qtip/api/controllers/qpi.py +++ b/qtip/api/controllers/qpi.py @@ -7,17 +7,26 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## -import connexion import httplib +import connexion + +from qtip.base import error +from qtip.loader import qpi + def list_qpis(): - return connexion.problem(httplib.NOT_IMPLEMENTED, - 'List QPIs', - 'QPIs listing not implemented') + qpi_spec_list = list(qpi.QPISpec.list_all()) + return qpi_spec_list, httplib.OK def get_qpi(name): - return connexion.problem(httplib.NOT_IMPLEMENTED, - 'Get a QPI', - 'QPI retrieval not implemented') + try: + qpi_spec = qpi.QPISpec(name) + return {'name': qpi_spec.name, + 'abspath': qpi_spec.abspath, + 'content': qpi_spec.content}, httplib.OK + except error.NotFoundError: + return connexion.problem(httplib.NOT_FOUND, + 'QPI Not Found', + 'Requested QPI Spec `' + name + '` not found.') diff --git a/qtip/api/swagger/swagger.yaml b/qtip/api/swagger/swagger.yaml index 96d34681..fb10317f 100644 --- a/qtip/api/swagger/swagger.yaml +++ b/qtip/api/swagger/swagger.yaml @@ -4,7 +4,7 @@ # 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 +# http://www.apache.org/licenses/LICENSE -2.0 ############################################################################## swagger: '2.0' @@ -22,11 +22,14 @@ paths: operationId: qtip.api.controllers.plan.list_plans tags: - Plan - - standalone + - Standalone responses: 200: description: A list of plans - #TODO (akhil) add item with properties and parameters + schema: + type: array + items: + $ref: '#/definitions/Plans' 501: description: Resource not implemented schema: @@ -41,7 +44,7 @@ paths: operationId: qtip.api.controllers.plan.get_plan tags: - Plan - - standalone + - Standalone parameters: - name: name in: path @@ -51,7 +54,8 @@ paths: responses: 200: description: Plan information - #TODO (akhil) define schema + schema: + $ref: '#/definitions/Plan' 404: description: Plan not found schema: @@ -112,7 +116,9 @@ paths: responses: 200: description: A list of QPIs - #TODO (akhil) add item with properties and parameters + schema: + items: + $ref: '#/definitions/QPIs' 501: description: Resource not implemented schema: @@ -138,7 +144,8 @@ paths: responses: 200: description: QPI information - #TODO (akhil) define schema + schema: + $ref: '#/definitions/QPI' 404: description: QPI not found schema: @@ -162,7 +169,9 @@ paths: responses: 200: description: A list of metrics - #TODO (akhil) add item with properties and parameters + schema: + items: + $ref: '#/definitions/Metrics' 501: description: Resource not implemented schema: @@ -188,7 +197,8 @@ paths: responses: 200: description: Metric information - #TODO (akhil) define schema + schema: + $ref: '#/definitions/Metric' 404: description: Metric not found schema: @@ -202,6 +212,110 @@ paths: schema: $ref: '#/definitions/Error' definitions: + PlanContent: + type: object + required: + - name + properties: + name: + type: string + description: + type: string + info: + type: object + config: + type: object + QPIs: + type: array + items: + type: object + Plans: + type: object + required: + - name + - abspath + properties: + name: + type: string + abspath: + type: string + Plan: + allOf: + - $ref: '#/definitions/Plans' + - type: object + - required: + - content + properties: + content: + $ref: '#/definitions/PlanContent' + MetricContent: + type: object + required: + - name + properties: + name: + type: string + description: + type: string + links: + type: array + items: + type: string + workloads: + type: array + items: + type: string + Metrics: + type: object + required: + - name + - abspath + properties: + name: + type: string + abspath: + type: string + Metric: + allOf: + - $ref: '#/definitions/Metrics' + - required: + - content + properties: + content: + $ref: '#/definitions/MetricContent' + QPIContent: + type: object + required: + - name + properties: + name: + type: string + description: + type: string + formula: + type: string + sections: + type: array + items: + type: object + QPIs: + type: object + required: + - name + - abspath + properties: + name: + type: string + abspath: + type: string + QPI: + allOf: + - $ref: '#/definitions/QPIs' + - required: + - content + properties: + content: + $ref: '#/definitions/QPIContent' Error: type: object properties: -- cgit 1.2.3-korg