diff options
-rw-r--r-- | qtip/api/__main__.py | 3 | ||||
-rw-r--r-- | qtip/api/controllers/metric.py | 23 | ||||
-rw-r--r-- | qtip/api/controllers/plan.py | 23 | ||||
-rw-r--r-- | qtip/api/controllers/qpi.py | 23 | ||||
-rw-r--r-- | qtip/api/swagger/swagger.yaml | 132 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_metric.py | 8 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_plan.py | 8 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_qpi.py | 8 | ||||
-rw-r--r-- | qtip/cli/utils.py | 18 | ||||
-rw-r--r-- | requirements.txt | 2 | ||||
-rw-r--r-- | tests/unit/cli/cmd_metric_test.py | 8 | ||||
-rw-r--r-- | tests/unit/cli/cmd_plan_test.py | 4 | ||||
-rw-r--r-- | tests/unit/cli/cmd_qpi_test.py | 6 |
13 files changed, 221 insertions, 45 deletions
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: diff --git a/qtip/cli/commands/cmd_metric.py b/qtip/cli/commands/cmd_metric.py index b6035e2d..e8d86972 100644 --- a/qtip/cli/commands/cmd_metric.py +++ b/qtip/cli/commands/cmd_metric.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -9,7 +9,9 @@ import click +from qtip.cli import utils from qtip.cli.entry import Context +from qtip.loader.metric import MetricSpec pass_context = click.make_pass_decorator(Context, ensure=False) @@ -24,7 +26,9 @@ def cli(ctx): @cli.command('list', help='List all the Metric Groups') @pass_context def cmd_list(ctx): - pass + metrics = MetricSpec.list_all() + table = utils.table('Metrics', metrics) + click.echo(table) @cli.command('show', help='View details of a Metric') diff --git a/qtip/cli/commands/cmd_plan.py b/qtip/cli/commands/cmd_plan.py index 64c702d3..2f07965d 100644 --- a/qtip/cli/commands/cmd_plan.py +++ b/qtip/cli/commands/cmd_plan.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2016 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -10,7 +10,9 @@ import click +from qtip.cli import utils from qtip.cli.entry import Context +from qtip.loader.plan import Plan pass_context = click.make_pass_decorator(Context, ensure=False) @@ -32,7 +34,9 @@ def init(ctx): @cli.command('list', help='List the Plans') @pass_context def list(ctx): - pass + plans = Plan.list_all() + table = utils.table('Plans', plans) + click.echo(table) @cli.command('show', help='View details of a Plan') diff --git a/qtip/cli/commands/cmd_qpi.py b/qtip/cli/commands/cmd_qpi.py index 5fc9bec8..a12fa983 100644 --- a/qtip/cli/commands/cmd_qpi.py +++ b/qtip/cli/commands/cmd_qpi.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -10,7 +10,9 @@ import click +from qtip.cli import utils from qtip.cli.entry import Context +from qtip.loader.qpi import QPISpec pass_context = click.make_pass_decorator(Context, ensure=False) @@ -25,7 +27,9 @@ def cli(ctx): @cli.command('list', help='List all the QPI specs') @pass_context def cmd_list(ctx): - pass + qpis = QPISpec.list_all() + table = utils.table('QPIs', qpis) + click.echo(table) @cli.command('show', help='View details of a QPI') diff --git a/qtip/cli/utils.py b/qtip/cli/utils.py new file mode 100644 index 00000000..844d4f34 --- /dev/null +++ b/qtip/cli/utils.py @@ -0,0 +1,18 @@ +############################################################################## +# Copyright (c) 2017 taseer94@gmail.com and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +from prettytable import PrettyTable + + +def table(name, components): + """ Return a PrettyTable for component listing """ + table = PrettyTable([name]) + table.align[name] = 'l' + [table.add_row([component['name'][0:-5]]) for component in components] + return table diff --git a/requirements.txt b/requirements.txt index c51228f2..d00b3cf1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,5 @@ paramiko connexion numpy pbr +ConfigParser +prettytable diff --git a/tests/unit/cli/cmd_metric_test.py b/tests/unit/cli/cmd_metric_test.py index 30f3448a..e121fb1e 100644 --- a/tests/unit/cli/cmd_metric_test.py +++ b/tests/unit/cli/cmd_metric_test.py @@ -1,5 +1,5 @@ ############################################################### -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -8,8 +8,8 @@ ############################################################################## import pytest -from click.testing import CliRunner +from click.testing import CliRunner from qtip.cli.entry import cli @@ -20,7 +20,9 @@ def runner(): def test_list(runner): result = runner.invoke(cli, ['metric', 'list']) - assert result.output == '' + assert 'dhrystone' and 'whetstone' and 'dpi' and \ + 'ramspeed' and 'fake-metric' and 'ssl' \ + in result.output def test_run(runner): diff --git a/tests/unit/cli/cmd_plan_test.py b/tests/unit/cli/cmd_plan_test.py index 1708c340..7c3335fc 100644 --- a/tests/unit/cli/cmd_plan_test.py +++ b/tests/unit/cli/cmd_plan_test.py @@ -1,5 +1,5 @@ ############################################################### -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -20,7 +20,7 @@ def runner(): def test_list(runner): result = runner.invoke(cli, ['plan', 'list']) - assert result.output == '' + assert 'Plan' and 'compute' and 'sample' in result.output def test_run(runner): diff --git a/tests/unit/cli/cmd_qpi_test.py b/tests/unit/cli/cmd_qpi_test.py index 485d5462..7067d62c 100644 --- a/tests/unit/cli/cmd_qpi_test.py +++ b/tests/unit/cli/cmd_qpi_test.py @@ -1,5 +1,5 @@ ############################################################### -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -8,9 +8,9 @@ ############################################################################## import pytest -from click.testing import CliRunner from qtip.cli.entry import cli +from click.testing import CliRunner @pytest.fixture(scope="module") @@ -20,7 +20,7 @@ def runner(): def test_list(runner): result = runner.invoke(cli, ['qpi', 'list']) - assert result.output == '' + assert 'QPIs' and 'compute' in result.output def test_run(runner): |