diff options
-rw-r--r-- | .coveragerc | 1 | ||||
-rw-r--r-- | DEVELOP.md | 18 | ||||
-rw-r--r-- | qtip/api/__main__.py | 11 | ||||
-rw-r--r-- | qtip/api/controllers/__init__.py | 0 | ||||
-rw-r--r-- | qtip/api/swagger/swagger.yaml | 9 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_metric.py | 7 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_plan.py | 7 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_qpi.py | 7 | ||||
-rw-r--r-- | qtip/collector/parser/grep.py | 4 | ||||
-rw-r--r-- | qtip/util/logger.py | 9 | ||||
-rw-r--r-- | requirements.txt | 4 | ||||
-rw-r--r-- | tests/unit/cli/cmd_metric_test.py | 10 | ||||
-rw-r--r-- | tests/unit/cli/cmd_plan_test.py | 10 | ||||
-rw-r--r-- | tests/unit/cli/cmd_qpi_test.py | 10 | ||||
-rw-r--r-- | tests/unit/util/__init__.py | 0 | ||||
-rw-r--r-- | tests/unit/util/logger_test.py | 48 | ||||
-rw-r--r-- | tox.ini | 2 |
17 files changed, 144 insertions, 13 deletions
diff --git a/.coveragerc b/.coveragerc index dfaeae60..0448da9d 100644 --- a/.coveragerc +++ b/.coveragerc @@ -4,6 +4,7 @@ branch = True source = qtip + tests [report] # Regexes for lines to exclude from consideration @@ -28,6 +28,24 @@ $ pip install tox $ tox ``` +Undering macOS system, it will happen to a **fatal error** when installing package `cryptograph`: + +``` +'openssl/opensslv.h' file not found +#incude <openssl/opensslv.h> + ^ +1 error generated. +``` + +It is for macOS uses TLS instead of OpenSSL and no header files supported. The solutions is: +``` code=bash +# brew install openssl + +# #add these lines in to your shell profiles, such as .bash_profile, .zshrc +# export CPPFLAGS='-I $openssl_install_path/include' +# export LDFLAGS='-L $openssl_install_path/lib' +``` + ## Architecture **TODO**: move to design spec diff --git a/qtip/api/__main__.py b/qtip/api/__main__.py new file mode 100644 index 00000000..89298e6d --- /dev/null +++ b/qtip/api/__main__.py @@ -0,0 +1,11 @@ +import connexion + + +def main(): + app = connexion.App(__name__, specification_dir='swagger/') + app.add_api('swagger.yaml', base_path='/v1.0') + app.run(host='0.0.0.0', port='5000') + + +if __name__ == '__main__': + main() diff --git a/qtip/api/controllers/__init__.py b/qtip/api/controllers/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/qtip/api/controllers/__init__.py diff --git a/qtip/api/swagger/swagger.yaml b/qtip/api/swagger/swagger.yaml new file mode 100644 index 00000000..97a9c352 --- /dev/null +++ b/qtip/api/swagger/swagger.yaml @@ -0,0 +1,9 @@ +swagger: '2.0' +info: + title: QTIP-API +consumes: + - application/json +produces: + - application/json +paths: + #TODO (akhil) add paths
\ No newline at end of file diff --git a/qtip/cli/commands/cmd_metric.py b/qtip/cli/commands/cmd_metric.py index aa4df1f4..b6035e2d 100644 --- a/qtip/cli/commands/cmd_metric.py +++ b/qtip/cli/commands/cmd_metric.py @@ -27,6 +27,13 @@ def cmd_list(ctx): pass +@cli.command('show', help='View details of a Metric') +@click.argument('name') +@pass_context +def show(ctx, name): + pass + + @cli.command('run', help='Run tests to run Performance Metrics') @click.argument('name') @pass_context diff --git a/qtip/cli/commands/cmd_plan.py b/qtip/cli/commands/cmd_plan.py index c1dd7cf6..64c702d3 100644 --- a/qtip/cli/commands/cmd_plan.py +++ b/qtip/cli/commands/cmd_plan.py @@ -35,6 +35,13 @@ def list(ctx): pass +@cli.command('show', help='View details of a Plan') +@click.argument('name') +@pass_context +def show(ctx, name): + pass + + @cli.command('run', help='Execute a Plan') @click.argument('name') @pass_context diff --git a/qtip/cli/commands/cmd_qpi.py b/qtip/cli/commands/cmd_qpi.py index f33f0104..5fc9bec8 100644 --- a/qtip/cli/commands/cmd_qpi.py +++ b/qtip/cli/commands/cmd_qpi.py @@ -28,6 +28,13 @@ def cmd_list(ctx): pass +@cli.command('show', help='View details of a QPI') +@click.argument('name') +@pass_context +def show(ctx, name): + pass + + @cli.command('run', help='Run performance tests for the specified QPI') @click.argument('name') @pass_context diff --git a/qtip/collector/parser/grep.py b/qtip/collector/parser/grep.py index c3274bc2..f74ce403 100644 --- a/qtip/collector/parser/grep.py +++ b/qtip/collector/parser/grep.py @@ -29,6 +29,6 @@ class GrepParser(BaseActor): def grep_in_file(filename, regex): - with open(filename, "r") as outfile: + with open(filename, 'r') as f: return filter(lambda x: x is not None, - list(re.finditer(regex, outfile.read(), re.MULTILINE))) + re.finditer(regex, f.read(), re.MULTILINE)) diff --git a/qtip/util/logger.py b/qtip/util/logger.py index d5e76a64..a7847dfc 100644 --- a/qtip/util/logger.py +++ b/qtip/util/logger.py @@ -27,11 +27,11 @@ import os class Logger(object): - file_path = '/var/log' formatter = logging.Formatter('%(asctime)s - %(name)s - ' '%(levelname)s - %(message)s') - def __init__(self, logger_name): + def __init__(self, logger_name, file_path=None): + self.file_path = '/var/log' if not file_path else file_path IF_DEBUG = os.getenv('IF_DEBUG') @@ -59,10 +59,9 @@ class Logger(object): class QtipLogger(Logger): - file_path = '{}/qtip/logs'.format(os.environ['HOME']) - def __init__(self, logger_name): + self.file_path = '{}/qtip/logs'.format(os.environ['HOME']) if not os.path.exists(self.file_path): os.makedirs(self.file_path) - super(QtipLogger, self).__init__(logger_name) + super(QtipLogger, self).__init__(logger_name, self.file_path) diff --git a/requirements.txt b/requirements.txt index 4e4700c0..c51228f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,6 @@ click pyyaml paramiko -Flask -Flask-RESTful -flask-restful-swagger +connexion numpy pbr diff --git a/tests/unit/cli/cmd_metric_test.py b/tests/unit/cli/cmd_metric_test.py index 239da96e..30f3448a 100644 --- a/tests/unit/cli/cmd_metric_test.py +++ b/tests/unit/cli/cmd_metric_test.py @@ -13,7 +13,7 @@ from click.testing import CliRunner from qtip.cli.entry import cli -@pytest.fixture() +@pytest.fixture(scope="module") def runner(): return CliRunner() @@ -29,3 +29,11 @@ def test_run(runner): result = runner.invoke(cli, ['metric', 'run']) assert 'Missing argument "name".' in result.output + + +def test_show(runner): + result = runner.invoke(cli, ['metric', 'show', 'fake-metric']) + assert result.output == '' + + result = runner.invoke(cli, ['metric', 'show']) + assert 'Missing argument "name".' in result.output diff --git a/tests/unit/cli/cmd_plan_test.py b/tests/unit/cli/cmd_plan_test.py index 3ce3766e..1708c340 100644 --- a/tests/unit/cli/cmd_plan_test.py +++ b/tests/unit/cli/cmd_plan_test.py @@ -13,7 +13,7 @@ from click.testing import CliRunner from qtip.cli.entry import cli -@pytest.fixture() +@pytest.fixture(scope="module") def runner(): return CliRunner() @@ -29,3 +29,11 @@ def test_run(runner): result = runner.invoke(cli, ['plan', 'run']) assert 'Missing argument "name".' in result.output + + +def test_show(runner): + result = runner.invoke(cli, ['plan', 'show', 'fake-plan']) + assert result.output == '' + + result = runner.invoke(cli, ['plan', 'show']) + assert 'Missing argument "name".' in result.output diff --git a/tests/unit/cli/cmd_qpi_test.py b/tests/unit/cli/cmd_qpi_test.py index 992c85d7..485d5462 100644 --- a/tests/unit/cli/cmd_qpi_test.py +++ b/tests/unit/cli/cmd_qpi_test.py @@ -13,7 +13,7 @@ from click.testing import CliRunner from qtip.cli.entry import cli -@pytest.fixture() +@pytest.fixture(scope="module") def runner(): return CliRunner() @@ -29,3 +29,11 @@ def test_run(runner): result = runner.invoke(cli, ['qpi', 'run']) assert 'Missing argument "name".' in result.output + + +def test_show(runner): + result = runner.invoke(cli, ['qpi', 'show', 'fake-qpi']) + assert result.output == '' + + result = runner.invoke(cli, ['qpi', 'show']) + assert 'Missing argument "name".' in result.output diff --git a/tests/unit/util/__init__.py b/tests/unit/util/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/tests/unit/util/__init__.py diff --git a/tests/unit/util/logger_test.py b/tests/unit/util/logger_test.py new file mode 100644 index 00000000..339b2bf6 --- /dev/null +++ b/tests/unit/util/logger_test.py @@ -0,0 +1,48 @@ +import pytest + +from qtip.util import logger + +MODULE = 'test_logger' +ERROR_MSG = 'error level test' +INFO_MSG = 'info level test' +DEBUG_MSG = 'debug level test' + + +@pytest.fixture() +def env_home(monkeypatch, tmpdir): + monkeypatch.setenv('HOME', str(tmpdir)) + return tmpdir + + +@pytest.fixture() +def logger_file(env_home): + return env_home.mkdir('qtip').mkdir('logs').join('{}.log'.format(MODULE)) + + +def console_expect_debug(content): + assert DEBUG_MSG in content + + +def console_expect_nodebug(content): + assert DEBUG_MSG not in content + + +@pytest.mark.parametrize('debug, console_expected', [ + ('true', console_expect_debug), + ('false', console_expect_nodebug)]) +def test_logger(monkeypatch, capsys, logger_file, debug, console_expected): + monkeypatch.setenv('IF_DEBUG', debug) + + log = logger.QtipLogger(MODULE).get + log.error(ERROR_MSG) + log.info(INFO_MSG) + log.debug(DEBUG_MSG) + + file_print = logger_file.read() + assert ERROR_MSG in file_print + assert INFO_MSG in file_print + assert DEBUG_MSG in file_print + + _, console_print = capsys.readouterr() + + console_expected(console_print) @@ -17,6 +17,8 @@ commands= py.test \ --basetemp={envtmpdir} \ --cov \ + --cov-report term-missing \ + --cov-report xml \ {posargs} setenv= HOME = {envtmpdir} |