From a9780321c3bf7256d613f23984f91989360da7d4 Mon Sep 17 00:00:00 2001 From: Yaroslav Nikonorov Date: Wed, 28 Jun 2017 17:45:20 +0300 Subject: [PATCH 1/5] Added get_test_file --- datamodel/datamodel.xml | 76 +++++++++++-------- .../actions/test_configuration_actions.py | 4 +- .../flows/bp_download_test_file_flow.py | 10 +++ src/bp_controller/runners/bp_test_runner.py | 28 +++++++ src/driver.py | 10 +++ src/drivermetadata.xml | 7 ++ 6 files changed, 101 insertions(+), 34 deletions(-) create mode 100644 src/bp_controller/flows/bp_download_test_file_flow.py diff --git a/datamodel/datamodel.xml b/datamodel/datamodel.xml index 4dde02c..085769a 100644 --- a/datamodel/datamodel.xml +++ b/datamodel/datamodel.xml @@ -1,48 +1,60 @@ - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + Description=""> + Description=""> + + + + + - + - - - - - - + + + + + + + + + + + - - - + + + diff --git a/src/bp_controller/actions/test_configuration_actions.py b/src/bp_controller/actions/test_configuration_actions.py index 9c5de10..8b3f510 100644 --- a/src/bp_controller/actions/test_configuration_actions.py +++ b/src/bp_controller/actions/test_configuration_actions.py @@ -54,8 +54,8 @@ def import_pcap(self, pcap_file_path): def export_test(self, test_name): self._logger.debug('Exporting test {0}'.format(test_name)) uri = '/api/v1/bps/export/bpt/testname/' + test_name - data = self._rest_service.request_get(uri) - result = data + data = self._rest_service.request_get_files(uri) + result = data.content return result def reserve_port(self, slot, port_list): diff --git a/src/bp_controller/flows/bp_download_test_file_flow.py b/src/bp_controller/flows/bp_download_test_file_flow.py new file mode 100644 index 0000000..69408b8 --- /dev/null +++ b/src/bp_controller/flows/bp_download_test_file_flow.py @@ -0,0 +1,10 @@ +from bp_controller.actions.test_configuration_actions import TestConfigurationActions +from cloudshell.tg.breaking_point.flows.bp_flow import BPFlow + + +class BPDownloadTestFileFlow(BPFlow): + def download_test_file(self, test_name): + with self._session_context_manager as rest_service: + configuration_actions = TestConfigurationActions(rest_service, self._logger) + test_file_content = configuration_actions.export_test(test_name) + return test_file_content diff --git a/src/bp_controller/runners/bp_test_runner.py b/src/bp_controller/runners/bp_test_runner.py index 92e4ef1..c342c98 100644 --- a/src/bp_controller/runners/bp_test_runner.py +++ b/src/bp_controller/runners/bp_test_runner.py @@ -1,5 +1,8 @@ import csv import json +import os + +from bp_controller.flows.bp_download_test_file_flow import BPDownloadTestFileFlow from bp_controller.helpers.port_reservation_helper import PortReservationHelper import re @@ -34,6 +37,7 @@ def __init__(self, context, logger, api): self.__test_statistics_flow = None self.__test_results_flow = None self.__test_configuration_file_flow = None + self.__download_test_file_flow = None self.__reservation_details = None self.__port_reservation_helper = None @@ -104,6 +108,13 @@ def _test_configuration_file_flow(self): self.logger) return self.__test_configuration_file_flow + @property + def _download_test_file_flow(self): + if not self.__download_test_file_flow: + self.__download_test_file_flow = BPDownloadTestFileFlow(self._session_context_manager, + self.logger) + return self.__download_test_file_flow + @property def _cs_reservation_details(self): """ @@ -247,6 +258,23 @@ def get_results(self): file_stream=pdf_result) return "Please check attachments for results" + def get_test_file(self, test_name): + test_files_location = self.context.resource.attributes.get('Test Files Location') + if not test_files_location: + raise BPRunnerException(self.__class__.__name__, "Test Files Location attribute is not defined") + if not os.path.exists(test_files_location) or os.access(test_files_location, os.W_OK) is not True: + raise BPRunnerException(self.__class__.__name__, + 'The location of the test files "{}" does not exist or is not writable'.format( + test_files_location)) + reservation_files = os.path.join(test_files_location, self.context.reservation.reservation_id) + if not os.path.exists(reservation_files): + os.makedirs(reservation_files) + test_file_path = os.path.join(reservation_files, test_name + '.bpt', ) + test_file_content = self._download_test_file_flow.download_test_file(test_name) + with open(test_file_path, 'w') as f: + f.write(test_file_content) + return test_file_path + def close(self): """ Destroy diff --git a/src/driver.py b/src/driver.py index bb4163c..9009cf2 100644 --- a/src/driver.py +++ b/src/driver.py @@ -77,6 +77,16 @@ def get_results(self, context): with self._runners_pool.actual_runner(context) as runner: return runner.get_results() + def get_test_file(self, context, test_name): + """ + Download test file configuration and put to the folder defined in Test Files Location attribute + :param context: + :param test_name: Name of the test + :return: + """ + with self._runners_pool.actual_runner(context) as runner: + return runner.get_test_file(test_name) + def cleanup(self): """ Close runners diff --git a/src/drivermetadata.xml b/src/drivermetadata.xml index d95c79d..e589e53 100644 --- a/src/drivermetadata.xml +++ b/src/drivermetadata.xml @@ -38,5 +38,12 @@ DisplayName="Output Type" DefaultValue="csv" Description="CSV or JSON"/> + + + + + From 6a7644ea98a42288c40aa9a99daa20c8d2a6b0c0 Mon Sep 17 00:00:00 2001 From: Yaroslav Nikonorov Date: Thu, 29 Jun 2017 16:01:34 +0300 Subject: [PATCH 2/5] Added Get test file and Tests files location attribute --- src/bp_controller/runners/bp_test_runner.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/bp_controller/runners/bp_test_runner.py b/src/bp_controller/runners/bp_test_runner.py index c342c98..e70c143 100644 --- a/src/bp_controller/runners/bp_test_runner.py +++ b/src/bp_controller/runners/bp_test_runner.py @@ -162,12 +162,29 @@ def _port_reservation_helper(self): self.logger) return self.__port_reservation_helper + def _get_existing_path(self, file_path): + """ + Looking for existing path + :return: + :rtype: basestring + """ + search_order = [os.path.join(self.context.resource.attributes.get('Test Files Location') or '', file_path), + file_path] + for path in search_order: + if os.path.exists(path): + return path + raise BPRunnerException(self.__class__.__name__, + 'File {} does not exists or "Test Files Location" attribute was not specified'.format( + file_path)) + def load_configuration(self, file_path): """ Upload configuration file and reserve ports :param file_path: :return: """ + file_path = self._get_existing_path(file_path) + self._test_name = self._test_configuration_file_flow.load_configuration(file_path) test_model = ElementTree.parse(file_path).getroot().find('testmodel') network_name = test_model.get('network') From fb25d65162cb6b3e3eac036585f773abc7feb66a Mon Sep 17 00:00:00 2001 From: Yaroslav Nikonorov Date: Thu, 29 Jun 2017 17:33:15 +0300 Subject: [PATCH 3/5] Added tests ande fixed travis --- .travis.yml | 8 +++--- .../runners/test_bp_test_runner.py | 25 +++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index fce4632..10e33ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,16 +3,16 @@ python: - "2.7" install: - - 'if [ ${TRAVIS_BRANCH} = "master" ]; then - pip install --extra-index-url https://testpypi.python.org/pypi -r src/requirements.txt; - else + - 'if [ ${TRAVIS_BRANCH} \!= "master" ] && [ -f dev_requirements.txt ]; then pip install --extra-index-url https://testpypi.python.org/pypi -r dev_requirements.txt; + else + pip install -r src/requirements.txt; fi' - pip install -r test_requirements.txt - pip install coveralls script: - - nosetests --with-coverage --cover-package=src --where=tests + - nosetests --with-coverage --cover-package=src tests after_success: - coveralls \ No newline at end of file diff --git a/tests/bp_controller/runners/test_bp_test_runner.py b/tests/bp_controller/runners/test_bp_test_runner.py index 1e1effc..1c49a70 100644 --- a/tests/bp_controller/runners/test_bp_test_runner.py +++ b/tests/bp_controller/runners/test_bp_test_runner.py @@ -1,6 +1,6 @@ import re -from mock import Mock, patch, PropertyMock +from mock import Mock, patch, PropertyMock, call from unittest2 import TestCase from bp_controller.runners.bp_test_runner import BPTestRunner @@ -171,6 +171,8 @@ def test_port_reservation_helper(self, port_reservation_helper_class, logger_pro @patch('bp_controller.runners.bp_test_runner.BPTestRunner._port_reservation_helper', new_callable=PropertyMock) @patch('bp_controller.runners.bp_test_runner.ElementTree') def test_load_configuration(self, element_tree_class, port_reservation_helper_prop, configuration_file_flow_prop): + file_path = Mock() + self._instance._get_existing_path = Mock(return_value=file_path) port_reservation_helper = Mock() configuration_file_flow = Mock() port_reservation_helper_prop.return_value = port_reservation_helper @@ -188,7 +190,6 @@ def test_load_configuration(self, element_tree_class, port_reservation_helper_pr interface = Mock() test_model.findall.return_value = [interface] interface.get.return_value = '3' - file_path = Mock() self._instance.load_configuration(file_path) configuration_file_flow.load_configuration.assert_called_once_with(file_path) self.assertIs(self._instance._test_name, test_name) @@ -389,3 +390,23 @@ def test_get_results_flow(self, create_quali_api_instance, test_results_flow_pro def test_close(self, port_reservation_helper_prop): self._context.reservation.reservation_id = 'test' port_reservation_helper_prop.unreserve_ports.assewrt_called_once_with() + + @patch('bp_controller.runners.bp_test_runner.os') + def test_get_existing_path(self, os_instance): + path1 = Mock() + path2 = Mock() + os_instance.path.join.return_value = path2 + os_instance.path.exists.side_effect = [False, True] + self.assertIs(self._instance._get_existing_path(path1), path1) + os_instance.path.join.assert_called_once_with(self._context.resource.attributes.get('Test Files Location'), + path1) + os_instance.path.exists.assert_has_calls([call(path2), call(path1)]) + + @patch('bp_controller.runners.bp_test_runner.os') + def test_get_existing_path_exception(self, os_instance): + path1 = Mock() + path2 = Mock() + os_instance.path.join.return_value = path2 + os_instance.path.exists.side_effect = [False, False] + with self.assertRaisesRegex(BPRunnerException, 'does not exists'): + self._instance._get_existing_path(path1) From 4581accfd964804e11da42eadc6338757f3b843d Mon Sep 17 00:00:00 2001 From: Yaroslav Nikonorov Date: Thu, 29 Jun 2017 17:36:34 +0300 Subject: [PATCH 4/5] Added .coveragerc --- .coveragerc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..f6e10b7 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,3 @@ +[report] +omit = + *__init__* From f3580337463fa1361a447799f419034d634cdaf2 Mon Sep 17 00:00:00 2001 From: Yaroslav Nikonorov Date: Thu, 29 Jun 2017 17:42:46 +0300 Subject: [PATCH 5/5] Added test for get_test_file --- tests/test_driver.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_driver.py b/tests/test_driver.py index 2500743..620aec1 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -75,6 +75,14 @@ def test_get_results(self): self._runners_pool.actual_runner.assert_called_once_with(self._context) self._runner.get_results.assert_called_once_with() + def test_get_test_file(self): + result = Mock() + self._runner.get_test_file.return_value = result + test_name = Mock() + self.assertIs(self._instance.get_test_file(self._context, test_name), result) + self._runners_pool.actual_runner.assert_called_once_with(self._context) + self._runner.get_test_file.assert_called_once_with(test_name) + def test_cleanup(self): self._instance.cleanup() self._runners_pool.close_all_runners.assert_called_once_with()