diff --git a/.zuul.yaml b/.zuul.yaml index a9b13905..4c3dfc58 100644 --- a/.zuul.yaml +++ b/.zuul.yaml @@ -2,8 +2,17 @@ check: jobs: - openstack-tox-pep8 - - openstack-tox-py27 + - openstack-tox-py36 + - ranger-tox-bandit gate: jobs: - openstack-tox-pep8 - - openstack-tox-py27 + - openstack-tox-py36 + - ranger-tox-bandit +- job: + name: ranger-tox-bandit + parent: openstack-tox + timeout: 600 + pre-run: playbooks/run_unit_test_job.yaml + vars: + tox_envlist: bandit-baseline diff --git a/bindep.txt b/bindep.txt new file mode 100644 index 00000000..58a97489 --- /dev/null +++ b/bindep.txt @@ -0,0 +1,2 @@ +python3-dev [platform:dpkg test] +default-libmysqlclient-dev [platform:dpkg test] diff --git a/doc/source/conf.py b/doc/source/conf.py index 8ae92f59..0b7cbc8c 100755 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -37,8 +37,8 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'ranger' -copyright = u'2017, OpenStack Developers' +project = 'ranger' +copyright = '2017, OpenStack Developers' # openstackdocstheme options repository_name = 'openstack/ranger' @@ -73,8 +73,8 @@ htmlhelp_basename = '%sdoc' % project latex_documents = [ ('index', '%s.tex' % project, - u'%s Documentation' % project, - u'OpenStack Developers', 'manual'), + '%s Documentation' % project, + 'OpenStack Developers', 'manual'), ] # Example configuration for intersphinx: refer to the Python standard library. diff --git a/etc/ranger/ranger.conf b/etc/ranger/ranger.conf index 255118e4..d37b4b29 100644 --- a/etc/ranger/ranger.conf +++ b/etc/ranger/ranger.conf @@ -35,7 +35,7 @@ password = 'password' # auth_enabled = False [database] -connection = 'mysql://user:pass@localhost:3306/orm' +connection = 'mysql+pymysql://user:pass@localhost:3306/orm' max_retries = 3 user_role = 'admin' diff --git a/images/ranger/Dockerfile b/images/ranger/Dockerfile index 143c331d..09bc6fc0 100644 --- a/images/ranger/Dockerfile +++ b/images/ranger/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:16.04 +FROM ubuntu:18.04 ENV DEBIAN_FRONTEND noninteractive ENV container docker @@ -11,19 +11,19 @@ apt -y install git \ netcat \ netbase \ openssh-server \ -python-minimal \ -python-setuptools \ -python-pip \ -python-dev \ -python-dateutil \ +python3-minimal \ +python3-setuptools \ +python3-pip \ +default-libmysqlclient-dev \ +python3-dev \ +python3-dateutil \ ca-certificates \ openstack-pkg-tools \ apache2 \ gcc \ g++ \ libffi-dev \ -libssl-dev --no-install-recommends \ -libmysqlclient-dev \ +libssl-dev \ && apt-get clean \ && rm -rf \ /var/lib/apt/lists/* \ @@ -33,15 +33,15 @@ libmysqlclient-dev \ /usr/share/doc \ /usr/share/doc-base -RUN pip install wheel +RUN pip3 install wheel COPY . /tmp/ranger WORKDIR /tmp/ranger -RUN pip install --default-timeout=100 -r requirements.txt +RUN pip3 install --default-timeout=100 -r requirements.txt -RUN python setup.py install +RUN python3 setup.py install ARG user=ranger @@ -51,7 +51,7 @@ RUN useradd -u 1000 -ms /bin/false ${user} # Change permissions RUN mkdir -p /etc/ranger \ && mkdir /var/log/ranger \ - && mkdir /home/${user}/git_repo \ + && mkdir /home/${user}/git_repo \ && chown -R ${user}: /var/log/ranger \ && mv /tmp/ranger /home/${user}/ranger \ && chown -R ${user}: /home/${user} \ diff --git a/images/rangercli/Dockerfile b/images/rangercli/Dockerfile index 40864647..81818507 100644 --- a/images/rangercli/Dockerfile +++ b/images/rangercli/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:16.04 +FROM ubuntu:18.04 #ubuntu environment variables ENV DEBIAN_FRONTEND noninteractive @@ -16,11 +16,11 @@ apt -y install git \ netcat \ netbase \ openssh-server \ -python-minimal \ -python-setuptools \ -python-pip \ -python-dev \ -python-dateutil \ +python3-minimal \ +python3-setuptools \ +python3-pip \ +python3-dev \ +python3-dateutil \ ca-certificates \ openstack-pkg-tools \ vim \ @@ -39,15 +39,15 @@ libmysqlclient-dev \ /usr/share/doc \ /usr/share/doc-base -RUN pip install wheel +RUN pip3 install wheel COPY . /tmp/ranger WORKDIR /tmp/ranger -RUN pip install --default-timeout=100 -r requirements.txt +RUN pip3 install --default-timeout=100 -r requirements.txt -RUN python setup.py install +RUN python3 setup.py install WORKDIR /tmp # Create user diff --git a/orm/base_config.py b/orm/base_config.py index 861f6da5..4817ba67 100644 --- a/orm/base_config.py +++ b/orm/base_config.py @@ -16,7 +16,7 @@ import os from os.path import join from oslo_config import cfg -from ConfigParser import ConfigParser +from configparser import ConfigParser CONF = cfg.CONF @@ -213,7 +213,7 @@ else: ] CONF.register_opts(FlavorGroup, flavor_group) - for key, value in flavor_dict.items(): + for key, value in list(flavor_dict.items()): if key.startswith("es_"): autogen_es.add(value.split(': ')[0]) diff --git a/orm/cmd/db_sync.py b/orm/cmd/db_sync.py index 5ba38f1b..a744d0c4 100644 --- a/orm/cmd/db_sync.py +++ b/orm/cmd/db_sync.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # Copyright (c) 2018 OpenStack Foundation # All Rights Reserved. # diff --git a/orm/common/client/audit/audit_client/api/audit.py b/orm/common/client/audit/audit_client/api/audit.py index dc0d9904..138152e6 100755 --- a/orm/common/client/audit/audit_client/api/audit.py +++ b/orm/common/client/audit/audit_client/api/audit.py @@ -4,14 +4,15 @@ import json import logging import threading import time -import urllib2 +import urllib.error +import urllib.parse +import urllib.request from orm.common.client.audit.audit_client.api.exceptions.audit_exception import AuditException from orm.common.client.audit.audit_client.api.model.get_audits_result import AuditsResult from orm.common.client.audit.audit_client.api.model.transaction import Transaction logger = logging.getLogger(__name__) - config = { 'AUDIT_SERVER_URL': None, 'NUM_OF_SEND_RETRIES': None, @@ -169,26 +170,24 @@ def _post_data(data): # Validate that the configuration was initialized _validate() # Send the data - req = urllib2.Request(config['AUDIT_SERVER_URL']) # nosec + req = urllib.request.Request(config['AUDIT_SERVER_URL']) # nosec req.add_header('Content-Type', 'application/json') # Retry to send the data to the audit server success = False for retry_number in range(config['NUM_OF_SEND_RETRIES']): try: - urllib2.urlopen(req, json.dumps(data)) # nosec + urllib.request.urlopen(req, json.dumps(data).encode('utf-8')) # nosec success = True break except Exception as error: time.sleep(config['TIME_WAIT_BETWEEN_RETRIES']) - - if not success: - error_msg = "ERROR|CON{}AUDIT001|Fail to send data to [{}]. Tried " \ - "a couple of times with no success. Last attempt " \ - "error: [{}]".format(config['SERVICE_NAME'], - config['AUDIT_SERVER_URL'], - error.message) - logger.error(error_msg) - raise AuditException(error_msg) + error_msg = "ERROR|CON{}AUDIT001|Fail to send data to [{}]. Tried " \ + "a couple of times with no success. Last attempt " \ + "error: [{}]".format(config['SERVICE_NAME'], + config['AUDIT_SERVER_URL'], + str(error)) + logger.error(error_msg) + raise AuditException(error_msg) def _get_data(query): @@ -197,23 +196,21 @@ def _get_data(query): # Send the data audit_server_url_with_query = "{}?{}".format(config['AUDIT_SERVER_URL'], query) - req = urllib2.Request(audit_server_url_with_query) # nosec + req = urllib.request.Request(audit_server_url_with_query) # nosec # Retry to get the data from the audit server success = False response = None + error = None for retry_number in range(config['NUM_OF_SEND_RETRIES']): try: - response = urllib2.urlopen(req) # nosec + response = urllib.request.urlopen(req) # nosec success = True break except Exception as error: time.sleep(config['TIME_WAIT_BETWEEN_RETRIES']) - - if not success: - error_msg = "Fail to get data from [{}]. Tried a couple of times " \ - "with no success. Last attempt error: [{}]".\ - format(audit_server_url_with_query, error.message) - logger.error(error_msg) - raise AuditException(error_msg) - else: + error_msg = "Fail to get data from [{}]. Tried a couple of times " \ + "with no success. Last attempt error: [{}]".\ + format(audit_server_url_with_query, str(error)) + logger.error(error_msg) + raise AuditException(error_msg) return response diff --git a/orm/common/client/audit/audit_client/api/exceptions/audit_exception.py b/orm/common/client/audit/audit_client/api/exceptions/audit_exception.py index d9c65393..b06e49b5 100644 --- a/orm/common/client/audit/audit_client/api/exceptions/audit_exception.py +++ b/orm/common/client/audit/audit_client/api/exceptions/audit_exception.py @@ -7,3 +7,4 @@ class AuditException(Exception): def __init__(self, error_msg): """init method.""" Exception.__init__(self, error_msg) + self.message = error_msg diff --git a/orm/common/client/audit/requirements.txt b/orm/common/client/audit/requirements.txt deleted file mode 100644 index 2683dd48..00000000 --- a/orm/common/client/audit/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - diff --git a/orm/common/client/audit/test-requirements.txt b/orm/common/client/audit/test-requirements.txt deleted file mode 100644 index fed55c21..00000000 --- a/orm/common/client/audit/test-requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -# Hacking already pins down pep8, pyflakes and flake8 -hacking<0.11,>=0.10.0 -testrepository>=0.0.18 -mock<1.1.0,>=1.0 -coverage>=3.6 diff --git a/orm/common/client/audit/tox.ini b/orm/common/client/audit/tox.ini deleted file mode 100644 index 6eec9c02..00000000 --- a/orm/common/client/audit/tox.ini +++ /dev/null @@ -1,22 +0,0 @@ -[tox] -envlist = py27, cover, pep8 - -[testenv] -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -install_command = pip install -U {opts} {packages} - -commands = python setup.py testr - -[testenv:cover] -#omitting rds/api/app.py and rds/examples/api/functional_test.py -#since they have no need for unit test -commands = - python setup.py testr --slowest --coverage --omit=audit_client/examples/* - coverage report --omit=audit_client/examples/* - -[testenv:pep8] -#cannot handle and 'H102 Apache 2.0 license header not found' and -#'H202 assertRaises Exception too broad' -#since it requires business code changes -commands = flake8 diff --git a/orm/common/client/keystone/keystone_utils/tests/__init__.py b/orm/common/client/keystone/keystone_utils/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/orm/common/client/keystone/keystone_utils/tests/unit/__init__.py b/orm/common/client/keystone/keystone_utils/tests/unit/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/orm/common/client/keystone/keystone_utils/tests/unit/test_tokens.py b/orm/common/client/keystone/keystone_utils/tests/unit/test_tokens.py deleted file mode 100755 index a38479f9..00000000 --- a/orm/common/client/keystone/keystone_utils/tests/unit/test_tokens.py +++ /dev/null @@ -1,219 +0,0 @@ -"""keystone_utils token validator unittests.""" -import mock -import unittest - -from keystone_utils import tokens - - -class MyResponse(object): - def __init__(self, status, json_result): - self.status_code = status - self._json_result = json_result - - def json(self): - return self._json_result - - -class MyKeystone(object): - def validate(self, a): - raise tokens.v3_client.exceptions.NotFound('test') - - def find(self, **kwargs): - raise tokens.v3_client.exceptions.NotFound('test') - - -class MyClient(object): - def __init__(self, set_tokens=True): - if set_tokens: - self.tokens = MyKeystone() - else: - self.tokens = mock.MagicMock() - - self.roles = MyKeystone() - - -class TokensTest(unittest.TestCase): - def setUp(self): - tokens._KEYSTONES = {} - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - def test_find_keystone_ep_sanity(self, mock_get): - result = tokens._find_keystone_ep('a', 'b') - self.assertEqual(result, 'test') - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE + 1, {'regions': [{'endpoints': [ - {'publicURL': 'test', 'type': 'identity'}]}]})) - def test_find_keystone_ep_bad_return_code(self, mock_get): - result = tokens._find_keystone_ep('a', 'b') - self.assertIsNone(result) - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {})) - def test_find_keystone_ep_no_keystone_ep_in_response(self, mock_get): - result = tokens._find_keystone_ep('a', 'b') - self.assertIsNone(result) - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'test'}]}]})) - def test_find_keystone_ep_no_identity_in_response(self, mock_get): - result = tokens._find_keystone_ep('a', 'b') - self.assertIsNone(result) - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - @mock.patch.object(tokens.v3_client, 'Client') - def test_is_token_valid_sanity(self, mock_get, mock_client): - self.assertTrue(tokens.is_token_valid('a', 'b', tokens.TokenConf( - 'a', 'b', 'c', 'd', '3'))) - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - @mock.patch.object(tokens.v3_client, 'Client') - def test_is_token_valid_sanity_role_required(self, mock_get, mock_client): - user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}} - mock_client.tokens.validate = mock.MagicMock(return_value=user) - self.assertTrue(tokens.is_token_valid('a', 'b', tokens.TokenConf( - 'a', 'b', 'c', 'd', '3'), 'test', {'domain': 'test'})) - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - def test_is_token_valid_token_not_found(self, mock_get): - client_backup = tokens.v3_client.Client - tokens.v3_client.Client = mock.MagicMock(return_value=MyClient()) - self.assertFalse(tokens.is_token_valid('a', 'b', tokens.TokenConf( - 'a', 'b', 'c', 'd', '3'))) - tokens.v3_client.Client = client_backup - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - def test_is_token_valid_invalid_version(self, mock_get): - client_backup = tokens.v3_client.Client - tokens.v3_client.Client = mock.MagicMock(return_value=MyClient()) - self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b', - tokens.TokenConf('a', 'b', 'c', 'd', '4')) - tokens.v3_client.Client = client_backup - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - def test_is_token_valid_keystone_v2(self, mock_get): - client_backup = tokens.v2_client.Client - tokens.v2_client.Client = mock.MagicMock() - self.assertFalse(tokens.is_token_valid('a', 'b', - tokens.TokenConf('a', 'b', 'c', - 'd', '2.0'), - 'test', - {'tenant': 'test'})) - tokens.v2_client.Client = client_backup - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - def test_is_token_valid_keystone_v2_invalid_location(self, mock_get): - client_backup = tokens.v2_client.Client - tokens.v2_client.Client = mock.MagicMock() - self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b', - tokens.TokenConf('a', 'b', 'c', 'd', '2.0'), 'test', - {'domain': 'test'}) - tokens.v2_client.Client = client_backup - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE + 1, {'regions': [{'endpoints': [ - {'publicURL': 'test', 'type': 'identity'}]}]})) - def test_is_token_valid_keystone_ep_not_found(self, mock_get): - self.assertRaises(tokens.KeystoneNotFoundError, tokens.is_token_valid, - 'a', 'b', tokens.TokenConf('a', 'b', 'c', 'd', '3')) - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - def test_is_token_valid_no_role_location(self, mock_get): - tokens.v3_client.Client = mock.MagicMock() - self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b', - tokens.TokenConf('a', 'b', 'c', 'd', '3'), 'test') - - @mock.patch.object(tokens.v3_client, 'Client') - def test_does_user_have_role_sanity_true(self, mock_client): - user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}} - self.assertTrue(tokens._does_user_have_role(mock_client, '3', user, - 'admin', - {'domain': 'test'})) - - @mock.patch.object(tokens.v3_client, 'Client') - def test_does_user_have_role_sanity_false(self, mock_client): - user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}} - mock_client.roles.check = mock.MagicMock( - side_effect=tokens.v3_client.exceptions.NotFound('test')) - self.assertFalse(tokens._does_user_have_role(mock_client, '3', user, - 'admin', - {'domain': 'test'})) - - @mock.patch.object(tokens.v3_client, 'Client') - def test_does_user_have_role_invalid_user(self, mock_client): - user = {} - self.assertFalse(tokens._does_user_have_role(mock_client, '3', user, - 'admin', - {'domain': 'test'})) - - @mock.patch.object(tokens.v3_client, 'Client') - def test_does_user_have_role_role_does_not_exist(self, mock_client): - user = {'user': {'id': 'test_id', 'domain': {'id': 'test'}}} - mock_client.roles.find = mock.MagicMock( - side_effect=tokens.v3_client.exceptions.NotFound('test')) - self.assertRaises(tokens.v3_client.exceptions.NotFound, - tokens._does_user_have_role, mock_client, '3', - user, 'test', {'domain': 'default'}) - - @mock.patch.object(tokens.requests, 'get', return_value=MyResponse( - tokens.OK_CODE, {'regions': [{'endpoints': [{'publicURL': 'test', - 'type': 'identity'}]}]})) - def test_is_token_valid_role_does_not_exist(self, mock_get): - tokens.v3_client.Client = mock.MagicMock(return_value=MyClient(False)) - self.assertRaises(ValueError, tokens.is_token_valid, 'a', 'b', - tokens.TokenConf('a', 'b', 'c', 'd', '3'), 'test', - {'domain': 'test'}) - - def test_get_token_user_invalid_arguments(self): - self.assertRaises(ValueError, tokens.get_token_user, 'a', 'b') - - @mock.patch.object(tokens, '_find_keystone_ep', return_value=None) - def test_get_token_user_keystone_ep_not_found(self, - mock_find_keystone_ep): - self.assertRaises(tokens.KeystoneNotFoundError, - tokens.get_token_user, 'a', mock.MagicMock(), 'c') - - def test_get_token_user_invalid_keystone_version(self): - conf = tokens.TokenConf(None, None, None, None, None) - self.assertRaises(ValueError, tokens.get_token_user, 'a', conf, 'c', - 'd') - - @mock.patch.object(tokens, '_get_keystone_client') - def test_get_token_user_token_not_found(self, mock_get_keystone_client): - ks = mock.MagicMock() - ks.tokens.validate.side_effect = tokens.v3_client.exceptions.NotFound() - mock_get_keystone_client.return_value = ks - conf = tokens.TokenConf('3', '3', '3', '3', '3') - self.assertIsNone(tokens.get_token_user('a', conf, 'c', 'd')) - - @mock.patch.object(tokens, '_get_keystone_client') - def test_get_token_user_success(self, mock_get_keystone_client): - token_info = mock.MagicMock() - token_info.token = 'a' - token_info.user = 'test_user' - ks = mock.MagicMock() - ks.tokens.validate.return_value = token_info - mock_get_keystone_client.return_value = ks - - conf = tokens.TokenConf('2.0', '2.0', '2.0', '2.0', '2.0') - result = tokens.get_token_user('a', conf, 'c', 'd') - - self.assertEqual(result.token, 'a') - self.assertEqual(result.user, 'test_user') diff --git a/orm/common/client/keystone/requirements.txt b/orm/common/client/keystone/requirements.txt deleted file mode 100644 index 1719ed89..00000000 --- a/orm/common/client/keystone/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. -requests==2.2.1 -python-keystoneclient==1.3.1 diff --git a/orm/common/client/keystone/test-requirements.txt b/orm/common/client/keystone/test-requirements.txt deleted file mode 100644 index ee50a20b..00000000 --- a/orm/common/client/keystone/test-requirements.txt +++ /dev/null @@ -1,15 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -oslo.i18n==3.9.0 -oslo.serialization==2.13.0 -oslo.utils==3.16.0 -hacking<0.11,>=0.10.0 -mock<1.1.0,>=1.0 -coverage>=3.6 -python-subunit>=0.0.18 -sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 -testrepository>=0.0.18 -testscenarios==0.4 -testtools==1.4.0 diff --git a/orm/common/client/keystone/tox.ini b/orm/common/client/keystone/tox.ini deleted file mode 100644 index 8bdf31df..00000000 --- a/orm/common/client/keystone/tox.ini +++ /dev/null @@ -1,24 +0,0 @@ -[tox] -envlist = py27,cover -skipsdist = True - -[testenv] -install_command = -# constraints: {[testenv:common-constraints]install_command} - pip install -U --force-reinstall {opts} {packages} -setenv = VIRTUAL_ENV={envdir} - OS_TEST_PATH=./keystone_utils/tests/unit - PYTHONPATH = {toxinidir}/mock_keystone/:/usr/local/lib/python2.7/dist-packages/ -deps = -r{toxinidir}/test-requirements.txt - -r{toxinidir}/requirements.txt - -[testenv:cover] -commands = - coverage erase - python setup.py testr --coverage - coverage report --omit="keystone_utils/tests/*" - coverage html --omit="keystone_utils/tests/*" - -[testenv:pep8] -commands= - py.test --pep8 -m pep8 diff --git a/orm/common/orm_common/hooks/api_error_hook.py b/orm/common/orm_common/hooks/api_error_hook.py index b578dc30..12ad643c 100755 --- a/orm/common/orm_common/hooks/api_error_hook.py +++ b/orm/common/orm_common/hooks/api_error_hook.py @@ -27,15 +27,15 @@ class APIErrorHook(PecanHook): result_json = err_utils.get_error_dict(401, transaction_id, None) - else: dict_body = None try: logger.debug('error: {}'.format(state.response)) dict_body = json.loads(state.response.body) + result_json = dict_body + if 'line' in str(state.response.body) and 'column' in str( state.response.body): - result_json = dict_body status_code = 400 if 'faultstring' in dict_body: result_json = err_utils.get_error_dict(status_code, @@ -43,14 +43,17 @@ class APIErrorHook(PecanHook): dict_body['faultstring'], "") else: - result_json = json.loads(dict_body['faultstring']) - logger.debug('Received faultstring: {}'.format(result_json)) + logger.info('Received faultstring: {}'.format(dict_body['faultstring'])) # make sure status code in header and in body are the same if 'code' in result_json: status_code = result_json['code'] logger.info('Received status code: {}, transaction_id: {}, tracking_id: {}'. format(status_code, transaction_id, tracking_id)) + result_json = err_utils.get_error_dict(status_code, + transaction_id, + dict_body['faultstring'], + "") except ValueError: msg = 'Could not read faultstring from response body!' @@ -65,6 +68,6 @@ class APIErrorHook(PecanHook): msg, "") - setattr(state.response, 'body', json.dumps(result_json)) + state.response.body = json.dumps(result_json).encode("UTF-8") state.response.status_code = status_code state.response.headers.add('X-RANGER-Request-Id', tracking_id) diff --git a/orm/common/orm_common/hooks/security_headers_hook.py b/orm/common/orm_common/hooks/security_headers_hook.py index 791cea99..25e6093b 100755 --- a/orm/common/orm_common/hooks/security_headers_hook.py +++ b/orm/common/orm_common/hooks/security_headers_hook.py @@ -14,5 +14,5 @@ class SecurityHeadersHook(PecanHook): 'X-XSS-Protection': '1; mode=block'} # Add all the security headers - for header, value in security_headers.items(): + for header, value in list(security_headers.items()): state.response.headers.add(header, value) diff --git a/orm/common/orm_common/hooks/transaction_id_hook.py b/orm/common/orm_common/hooks/transaction_id_hook.py index ba8711d1..439ac580 100755 --- a/orm/common/orm_common/hooks/transaction_id_hook.py +++ b/orm/common/orm_common/hooks/transaction_id_hook.py @@ -9,7 +9,7 @@ class TransactionIdHook(PecanHook): try: transaction_id = utils.make_transid() except Exception as exc: - abort(500, headers={'faultstring': exc.message}) + abort(500, headers={'faultstring': str(exc)}) tracking_id = state.request.headers['X-RANGER-Tracking-Id'] \ if 'X-RANGER-Tracking-Id' in state.request.headers else transaction_id diff --git a/orm/common/orm_common/injector/fang/resolver.py b/orm/common/orm_common/injector/fang/resolver.py index 321aa061..4977bc09 100755 --- a/orm/common/orm_common/injector/fang/resolver.py +++ b/orm/common/orm_common/injector/fang/resolver.py @@ -39,7 +39,7 @@ class DependencyResolver: try: self.resolve(resource_name) except ProviderNotFoundError as e: - logging.error("Provider not found! Make sure the provider is available.\n %s", e) + logging.error("Provider not found! Make sure the provider is available.\n %s", str(e)) return False else: return True diff --git a/orm/common/orm_common/injector/fang/resource_provider_register.py b/orm/common/orm_common/injector/fang/resource_provider_register.py index 1a7e3fbf..5532c462 100755 --- a/orm/common/orm_common/injector/fang/resource_provider_register.py +++ b/orm/common/orm_common/injector/fang/resource_provider_register.py @@ -39,13 +39,13 @@ class ResourceProviderRegister: return instance def mass_register(self, resource_names_to_providers, **kwargs): - for resource_name, provider in resource_names_to_providers.items(): + for resource_name, provider in list(resource_names_to_providers.items()): self.register_instance(resource_name, provider, **kwargs) def load(self, other_register, allow_overrides=False): if not allow_overrides: - own_keys = self.resource_providers.keys() - other_keys = other_register.resource_providers.keys() + own_keys = list(self.resource_providers.keys()) + other_keys = list(other_register.resource_providers.keys()) common_keys = own_keys & other_keys if common_keys: # TODO Add new FangError sub-class? diff --git a/orm/common/orm_common/injector/injector.py b/orm/common/orm_common/injector/injector.py index 6f10c2f8..4ba90e2e 100755 --- a/orm/common/orm_common/injector/injector.py +++ b/orm/common/orm_common/injector/injector.py @@ -1,42 +1,37 @@ -import imp +import importlib import os +from oslo_log import log + from orm.common.orm_common.injector.fang import di from orm.common.orm_common.utils.sanitize import sanitize_symbol_name _di = di.Di() -logger = None +LOG = log.getLogger(__name__) def register_providers(env_variable, providers_dir_path, _logger): - global logger - logger = _logger - - # TODO: change all prints to logger - logger.info('Initializing dependency injector') - logger.info('Checking {0} variable'.format(env_variable)) + LOG.info('Initializing dependency injector') + LOG.info('Checking {0} variable'.format(env_variable)) env = None if not (env_variable in os.environ): - logger.warn('No {0} variable found using `prod` injector'.format(env_variable)) + LOG.warning('No {0} variable found using prod injector'.format(env_variable)) env = 'prod' elif os.environ[env_variable] == '__TEST__': - logger.info('__TEST__ variable found, explicitly skipping provider registration!!!') + LOG.info('__TEST__ variable found, explicitly skipping provider registration!') return else: env = os.environ[env_variable] - log_message = '{0} found setting injector to {1} environment'.format(sanitize_symbol_name(env_variable), env) + log_message = \ + '{0} found, setting injector to {1} environment'.format(sanitize_symbol_name(env_variable), env) log_message = log_message.replace('\n', '_').replace('\r', '_') - logger.info(log_message) + LOG.info(log_message) - logger.info('Setting injector providers') + LOG.info('Setting injector providers') module = _import_file_by_name(env, providers_dir_path) - for provider in module.providers: - logger.info('Setting provider `{0}` to {1}'.format(provider[0], provider[1])) - _di.providers.register_instance(provider[0], provider[1]) - def get_di(): return _di @@ -48,12 +43,13 @@ def override_injected_dependency(dep_tuple): def _import_file_by_name(env, providers_dir_path): file_path = os.path.join(providers_dir_path, '{0}_providers.py'.format(env)) - try: - module = imp.load_source('fms_providers', file_path) - except IOError as ex: - logger.log_exception( - 'File with providers for the {0} environment, path: {1} wasnt found! Crushing!!!'.format(env, file_path), - ex) - raise ex - + spec = importlib.util.spec_from_file_location("{0}_providers".format(env), file_path) + module = importlib.util.module_from_spec(spec) + if module is not None: + spec.loader.exec_module(module) + for provider in module.providers: + LOG.info('Setting provider {0} to {1}'.format(provider[0], provider[1])) + _di.providers.register_instance(provider[0], provider[1]) + else: + LOG.error('Provider for {0} environment not found, path: {1} does not exist'.format(env, file_path)) return module diff --git a/orm/common/orm_common/policy/_parser.py b/orm/common/orm_common/policy/_parser.py index c3094aa1..47ad53b2 100755 --- a/orm/common/orm_common/policy/_parser.py +++ b/orm/common/orm_common/policy/_parser.py @@ -20,7 +20,7 @@ import re import six -import _checks +from . import _checks LOG = logging.getLogger(__name__) @@ -61,7 +61,7 @@ class ParseStateMeta(type): reducers = [] - for key, value in cls_dict.items(): + for key, value in list(cls_dict.items()): if not hasattr(value, 'reducers'): continue for reduction in value.reducers: diff --git a/orm/common/orm_common/policy/policy.py b/orm/common/orm_common/policy/policy.py index 25fabbbc..c06ce11c 100755 --- a/orm/common/orm_common/policy/policy.py +++ b/orm/common/orm_common/policy/policy.py @@ -2,10 +2,10 @@ import logging +from . import qolicy from orm.common.client.keystone.keystone_utils import tokens from orm.common.orm_common.utils import api_error_utils as err_utils from orm.common.orm_common.utils import dictator -import qolicy from wsme.exc import ClientSideError logger = logging.getLogger(__name__) @@ -172,13 +172,13 @@ def authorize(action, request, app_conf, keystone_ep=None): logger.debug('The authentication service is disabled. No authentication is needed.') is_permitted = True except ClientSideError as e: - logger.error('Fail to validate request. due to {}.'.format(e.message)) + logger.error('Fail to validate request. due to {}.'.format(str(e))) raise err_utils.get_error('N/A', status_code=e.code) except EnforcerError: logger.error('The token is unauthorized according to the policy') is_permitted = False except Exception as e: - logger.error('Fail to validate request. due to {}.'.format(e.message)) + logger.error('Fail to validate request. due to {}.'.format(str(e))) is_permitted = False logger.info('Authorize...end') diff --git a/orm/common/orm_common/policy/qolicy.py b/orm/common/orm_common/policy/qolicy.py index ff0128da..dba8e48b 100755 --- a/orm/common/orm_common/policy/qolicy.py +++ b/orm/common/orm_common/policy/qolicy.py @@ -218,7 +218,7 @@ desired rule name. import logging import os -import _parser +from . import _parser from orm.common.orm_common.utils import api_error_utils as err_utils from oslo_config import cfg @@ -302,7 +302,7 @@ class Rules(dict): # Suck in the JSON data and parse the rules rules = {k: _parser.parse_rule(v) - for k, v in jsonutils.loads(data).items()} + for k, v in list(jsonutils.loads(data).items())} return cls(rules, default_rule) @@ -311,7 +311,7 @@ class Rules(dict): """Allow loading of rule data from a dictionary.""" # Parse the rules stored in the dictionary - rules = {k: _parser.parse_rule(v) for k, v in rules_dict.items()} + rules = {k: _parser.parse_rule(v) for k, v in list(rules_dict.items())} return cls(rules, default_rule) @@ -347,7 +347,7 @@ class Rules(dict): # Start by building the canonical strings for the rules out_rules = {} - for key, value in self.items(): + for key, value in list(self.items()): # Use empty string for singleton TrueCheck instances if isinstance(value, _checks.TrueCheck): out_rules[key] = '' diff --git a/orm/common/orm_common/tests/__init__.py b/orm/common/orm_common/tests/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/orm/common/orm_common/tests/hooks/__init__.py b/orm/common/orm_common/tests/hooks/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/orm/common/orm_common/tests/hooks/test_api_error_hook.py b/orm/common/orm_common/tests/hooks/test_api_error_hook.py deleted file mode 100755 index bf19e3a7..00000000 --- a/orm/common/orm_common/tests/hooks/test_api_error_hook.py +++ /dev/null @@ -1,68 +0,0 @@ -import json -import logging -import mock -from orm_common.hooks import api_error_hook -from unittest import TestCase - -logger = logging.getLogger(__name__) - - -class TestAPIErrorHook(TestCase): - @mock.patch.object(api_error_hook, 'err_utils') - @mock.patch.object(api_error_hook, 'json') - def test_after_401(self, mock_json, mock_err_utils): - a = api_error_hook.APIErrorHook() - state = mock.MagicMock() - - mock_err_utils.get_error_dict.return_value = 'B' - mock_json.loads = json.loads - mock_json.dumps = json.dumps - state.response.status_code = 401 - a.after(state) - self.assertEqual(state.response.body, - json.dumps(mock_err_utils.get_error_dict.return_value)) - - @mock.patch.object(api_error_hook, 'err_utils') - def test_after_not_an_error(self, mock_err_utils): - a = api_error_hook.APIErrorHook() - state = mock.MagicMock() - - mock_err_utils.get_error_dict.return_value = 'B' - state.response.body = 'AAAA' - temp = state.response.body - # A successful status code - state.response.status_code = 201 - a.after(state) - # Assert that the response body hasn't changed - self.assertEqual(state.response.body, temp) - - @mock.patch.object(api_error_hook, 'err_utils') - @mock.patch.object(api_error_hook.json, 'loads', - side_effect=ValueError('test')) - def test_after_error(self, mock_json, mock_err_utils): - a = api_error_hook.APIErrorHook() - state = mock.MagicMock() - - mock_err_utils.get_error_dict.return_value = 'B' - state.response.body = 'AAAA' - - mock_json.loads = mock.MagicMock(side_effect=ValueError('sd')) - state.response.status_code = 402 - a.after(state) - self.assertEqual(state.response.body, - json.dumps(mock_err_utils.get_error_dict.return_value)) - - @mock.patch.object(api_error_hook, 'err_utils') - @mock.patch.object(api_error_hook, 'json') - def test_after_success(self, mock_json, mock_err_utils): - a = api_error_hook.APIErrorHook() - state = mock.MagicMock() - - mock_err_utils.get_error_dict.return_value = 'B' - mock_json.loads = json.loads - mock_json.dumps = json.dumps - mock_json.loads = json.loads - state.response.body = '{"debuginfo": null, "faultcode": "Client", "faultstring": "{\\"code\\": 404, \\"created\\": \\"1475768730.95\\", \\"details\\": \\"\\", \\"message\\": \\"customer: q not found\\", \\"type\\": \\"Not Found\\", \\"transaction_id\\": \\"mock_json5efa7416fb4d408cc0e30e4373cf00\\"}"}' - state.response.status_code = 400 - a.after(state) - self.assertEqual(json.loads(state.response.body), json.loads('{"message": "customer: q not found", "created": "1475768730.95", "type": "Not Found", "details": "", "code": 404, "transaction_id": "mock_json5efa7416fb4d408cc0e30e4373cf00"}')) diff --git a/orm/common/orm_common/tests/hooks/test_security_headers_hook.py b/orm/common/orm_common/tests/hooks/test_security_headers_hook.py deleted file mode 100755 index ee5b2420..00000000 --- a/orm/common/orm_common/tests/hooks/test_security_headers_hook.py +++ /dev/null @@ -1,31 +0,0 @@ -import mock -from orm_common.hooks import security_headers_hook -from unittest import TestCase - - -class MyHeaders(object): - def __init__(self): - self.headers = {} - - def add(self, key, value): - self.headers[key] = value - - -class TestSecurityHeadersHook(TestCase): - def test_after(self): - s = security_headers_hook.SecurityHeadersHook() - test_headers = MyHeaders() - state = mock.MagicMock() - state.response.headers = test_headers - s.after(state) - - security_headers = {'X-Frame-Options': 'DENY', - 'X-Content-Type-Options': 'nosniff', - 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains', - 'Content-Security-Policy': 'default-src \'self\'', - 'X-Permitted-Cross-Domain-Policies': 'none', - 'X-XSS-Protection': '1; mode=block'} - - for header in security_headers: - self.assertEqual(security_headers[header], - test_headers.headers[header]) diff --git a/orm/common/orm_common/tests/hooks/test_transaction_id_hook.py b/orm/common/orm_common/tests/hooks/test_transaction_id_hook.py deleted file mode 100755 index 30d8b3c3..00000000 --- a/orm/common/orm_common/tests/hooks/test_transaction_id_hook.py +++ /dev/null @@ -1,17 +0,0 @@ -import logging -import mock -from orm_common.hooks import transaction_id_hook -from unittest import TestCase - -logger = logging.getLogger(__name__) - - -class TestTransactionIdHook(TestCase): - @mock.patch.object(transaction_id_hook.utils, 'make_transid', - return_value='test') - def test_before_sanity(self, mock_make_transid): - t = transaction_id_hook.TransactionIdHook() - state = mock.MagicMock() - t.before(state) - self.assertEqual(state.request.transaction_id, 'test') - self.assertEqual(state.request.tracking_id, 'test') diff --git a/orm/common/orm_common/tests/injector/__init__.py b/orm/common/orm_common/tests/injector/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/orm/common/orm_common/tests/injector/test_injector.py b/orm/common/orm_common/tests/injector/test_injector.py deleted file mode 100755 index 1303fd02..00000000 --- a/orm/common/orm_common/tests/injector/test_injector.py +++ /dev/null @@ -1,57 +0,0 @@ -import logging -import mock -from orm_common.injector import injector -import os -from unittest import TestCase - -logger = logging.getLogger(__name__) - - -class TestInjector(TestCase): - def setUp(self): - pass - - @mock.patch.object(injector, '_import_file_by_name') - def test_register_providers(self, mock_import_file_by_name): - os.environ['CMS_ENV'] = 'test' - injector.register_providers('CMS_ENV', 'a/b/c', logger) - - @mock.patch.object(injector, '_import_file_by_name') - def test_register_providers_env_not_exist(self, mock_import_file_by_name): - injector.register_providers('CMS_ENV1', 'a/b/c', logger) - - @mock.patch.object(injector, '_import_file_by_name') - def test_register_providers_env_test(self, mock_import_file_by_name): - os.environ['CMS_ENV2'] = '__TEST__' - injector.register_providers('CMS_ENV2', 'a/b/c', logger) - - @mock.patch.object(injector, '_import_file_by_name') - def test_register_providers_with_existing_provider(self, mock_import_file_by_name): - mock_import_file_by_name.return_value = type('module', (object,), {'providers': ['a1', 'b2']})() - os.environ['c3'] = 'test' - injector.register_providers('c3', 'a/b/c', logger) - - def test_get_di(self): - injector.get_di() - - @mock.patch.object(injector, 'logger') - def test_import_file_by_name_ioerror(self, mock_logger): - injector.logger = mock.MagicMock() - # Calling it with ('', '.') should raise an IOError - # (no such file or directory) - self.assertRaises(IOError, injector._import_file_by_name, '', '.') - - @mock.patch.object(injector.imp, 'load_source', return_value='test') - def test_import_file_by_name_sanity(self, mock_load_source): - self.assertEqual(injector._import_file_by_name('', '.'), 'test') - - @mock.patch.object(injector._di.providers, 'register_instance') - def test_override_injected_dependency(self, mock_di): - injector.override_injected_dependency((1, 2,)) - self.assertTrue(mock_di.called) - - ''' - @mock.patch.object(ResourceProviderRegister, 'register_instance') - def test_override_injected_dependency(self, mock_resourceProviderRegister): - injector.override_injected_dependency(mock.Mock()) - ''' diff --git a/orm/common/orm_common/tests/policy/__init__.py b/orm/common/orm_common/tests/policy/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/orm/common/orm_common/tests/policy/test_checks.py b/orm/common/orm_common/tests/policy/test_checks.py deleted file mode 100755 index 53a1a661..00000000 --- a/orm/common/orm_common/tests/policy/test_checks.py +++ /dev/null @@ -1,103 +0,0 @@ -import mock -import unittest - -from orm_common.policy import _checks - - -class TestChecks(unittest.TestCase): - def test_call_simple_checks(self): - check = _checks.FalseCheck() - self.assertFalse(check(1, 2, 3)) - check = _checks.TrueCheck() - self.assertTrue(check(1, 2, 3)) - - check = _checks.GenericCheck('a', 'b') - self.assertFalse(check(1, 2, 3)) - - def test_str_simple_checks(self): - check = _checks.FalseCheck() - self.assertEqual(str(check), '!') - check = _checks.TrueCheck() - self.assertEqual(str(check), '@') - - check = _checks.GenericCheck('a', 'b') - self.assertEqual(str(check), 'a:b') - - def test_call_complex_checks(self): - first_rule = _checks.TrueCheck() - second_rule = _checks.FalseCheck() - - check = _checks.NotCheck(first_rule) - self.assertFalse(check(1, 2, 3)) - - check = _checks.AndCheck([first_rule]) - check.add_check(second_rule) - self.assertFalse(check(1, 2, 3)) - check = _checks.AndCheck([first_rule, first_rule]) - self.assertTrue(check(1, 2, 3)) - - check = _checks.OrCheck([first_rule]) - check.add_check(second_rule) - self.assertTrue(check(1, 2, 3)) - self.assertEqual(check.pop_check(), (check, second_rule,)) - check = _checks.OrCheck([second_rule, second_rule]) - self.assertFalse(check(1, 2, 3)) - - def test_str_complex_checks(self): - first_rule = _checks.TrueCheck() - second_rule = _checks.FalseCheck() - - check = _checks.NotCheck(first_rule) - self.assertEqual(str(check), 'not @') - - check = _checks.AndCheck([first_rule]) - check.add_check(second_rule) - self.assertEqual(str(check), '(@ and !)') - - check = _checks.OrCheck([first_rule]) - check.add_check(second_rule) - self.assertEqual(str(check), '(@ or !)') - - def test_call_custom_checks_error(self): - check = _checks.RoleCheck('a', 'admin') - # test no longer valid. - # change: https://gerrit.mtn5.cci.att.com/#/c/25690/ - # removed the exception raise - # - # try: - # check(1, mock.MagicMock(), 3) - # self.fail('ClientSideError not raised!') - # except ClientSideError as exc: - # self.assertEqual(exc.code, 403) - - for check_type in (_checks.TenantCheck, - _checks.DomainCheck): - check = check_type('a', 'admin') - # 2 is not a user, so the check will fail - self.assertFalse(check(1, 2, 3)) - - def test_call_custom_checks_success(self): - user = mock.MagicMock() - user.user = {'roles': [{'name': 'admin'}]} - user.tenant = {'name': 'admin'} - user.domain = {'name': 'admin'} - - for check_type in (_checks.RoleCheck, - _checks.TenantCheck, - _checks.DomainCheck): - check = check_type('a', 'admin') - # 2 is not a user, so the check will fail - self.assertTrue(check(1, user, 3)) - - def test_call_rule_check_error(self): - enforcer = mock.MagicMock() - enforcer.rules = {'test': mock.MagicMock( - side_effect=KeyError('test'))} - check = _checks.RuleCheck('rule', 'test') - self.assertFalse(check(1, 2, enforcer)) - - def test_call_rule_check_success(self): - enforcer = mock.MagicMock() - enforcer.rules = {'test': mock.MagicMock(return_value=True)} - check = _checks.RuleCheck('rule', 'test') - self.assertTrue(check(1, 2, enforcer)) diff --git a/orm/common/orm_common/tests/policy/test_policy.py b/orm/common/orm_common/tests/policy/test_policy.py deleted file mode 100755 index fa695d7c..00000000 --- a/orm/common/orm_common/tests/policy/test_policy.py +++ /dev/null @@ -1,129 +0,0 @@ -import mock -import unittest - -from orm_common.policy import policy - - -class Exception_Test(Exception): - pass - - -class TestPolicy(unittest.TestCase): - def setUp(self): - policy._ENFORCER = None - policy._POLICY_FILE = None - policy._TOKEN_CONF = None - - def test_reset(self): - policy._ENFORCER = mock.MagicMock() - policy._POLICY_FILE = mock.MagicMock() - policy.reset() - self.assertIsNone(policy._ENFORCER) - self.assertIsNone(policy._POLICY_FILE) - # Call it a second time when they are both None and see - # that no exception is raised - policy.reset() - self.assertIsNone(policy._ENFORCER) - self.assertIsNone(policy._POLICY_FILE) - - @mock.patch.object(policy, 'open') - @mock.patch.object(policy.qolicy, 'Enforcer') - @mock.patch.object(policy.qolicy, 'Rules') - def test_init_success(self, mock_rules, mock_enforcer, mock_open): - policy_file = 'a' - token_conf = 'b' - mock_rules.load_json.return_value = 'c' - policy.init(policy_file, token_conf) - self.assertEqual(policy._POLICY_FILE, 'a') - self.assertEqual(policy._TOKEN_CONF, 'b') - - def test_init_enforcer_already_exists(self): - policy._ENFORCER = mock.MagicMock() - - # Nothing should happen when the enforcer already exists, so make sure - # that no exception is raised - policy.init('a', 'b') - - @mock.patch.object(policy, 'open') - @mock.patch.object(policy.qolicy, 'Rules') - @mock.patch.object(policy, '_ENFORCER') - def test_reset_rules_no_policy_file(self, mock_enforcer, - mock_rules, mock_open): - self.assertRaises(ValueError, policy.reset_rules) - - @mock.patch.object(policy, 'open') - @mock.patch.object(policy.qolicy, 'Rules') - @mock.patch.object(policy, '_ENFORCER') - def test_reset_rules_success(self, mock_enforcer, - mock_rules, mock_open): - policy._POLICY_FILE = mock.MagicMock() - policy.reset_rules() - self.assertTrue(mock_enforcer.set_rules.called) - - @mock.patch.object(policy, 'reset_rules') - @mock.patch.object(policy.tokens, 'get_token_user', - side_effect=ValueError('test')) - @mock.patch.object(policy, '_ENFORCER') - def test_enforce_enforcer_error(self, mock_enforcer, - mock_get_token_user, - mock_reset_rules): - mock_enforcer.enforce.side_effect = policy.EnforcerError() - self.assertRaises(policy.EnforcerError, policy.enforce, 'action', - 'token', mock.MagicMock()) - - @mock.patch.object(policy, 'reset_rules') - @mock.patch.object(policy.tokens, 'get_token_user') - @mock.patch.object(policy, '_ENFORCER') - def test_enforce_success(self, mock_enforcer, - mock_get_token_user, - mock_reset_rules): - mock_enforcer.enforce.return_value = True - self.assertTrue(policy.enforce('action', 'token', mock.MagicMock())) - - def test_authorize_authorization_disabled(self): - request = mock.MagicMock() - app_conf = mock.MagicMock() - app_conf.authentication.enabled = False - # No exception should be raised - policy.authorize('a', request, app_conf) - - @mock.patch.object(policy, 'enforce') - def test_authorize_no_token(self, mock_enforce): - request = mock.MagicMock() - request.headers.get.return_value = None - app_conf = mock.MagicMock() - app_conf.authentication.enabled = True - # No exception should be raised - policy.authorize('a', request, app_conf) - - @mock.patch.object(policy, 'enforce', side_effect=policy.EnforcerError()) - @mock.patch.object(policy.err_utils, 'get_error', return_value=Exception_Test) - def test_authorize_enforce_failed(self, mock_enforce, mock_get_error): - request = mock.MagicMock() - request.headers.get.return_value = None - app_conf = mock.MagicMock() - app_conf.authentication.enabled = True - - self.assertRaises(Exception_Test, policy.authorize, 'a', request, - app_conf) - - @mock.patch.object(policy, 'enforce', side_effect=ValueError()) - @mock.patch.object(policy.err_utils, 'get_error', return_value=Exception_Test) - def test_authorize_other_error(self, mock_enforce, mock_get_error): - request = mock.MagicMock() - request.headers.get.return_value = None - app_conf = mock.MagicMock() - app_conf.authentication.enabled = True - - self.assertRaises(Exception_Test, policy.authorize, 'a', request, - app_conf) - - @mock.patch.object(policy, 'enforce') - def test_authorize_success(self, mock_enforce): - request = mock.MagicMock() - request.headers.get.return_value = 'test' - app_conf = mock.MagicMock() - app_conf.authentication.enabled = True - - # No exception should be raised - policy.authorize('a', request, app_conf) diff --git a/orm/common/orm_common/tests/utils/__init__.py b/orm/common/orm_common/tests/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/orm/common/orm_common/tests/utils/test_api_error_utils.py b/orm/common/orm_common/tests/utils/test_api_error_utils.py deleted file mode 100755 index 7b7568b1..00000000 --- a/orm/common/orm_common/tests/utils/test_api_error_utils.py +++ /dev/null @@ -1,14 +0,0 @@ -import json -import mock -from orm_common.utils import api_error_utils -from unittest import TestCase - - -class TestCrossApiUtil(TestCase): - @mock.patch.object(api_error_utils.utils, 'get_time_human', return_value=1.337) - def test_get_error_default_message(self, mock_time): - self.assertEqual( - json.loads(api_error_utils.get_error('test', 'a').message), - {"details": "a", "message": "Incompatible JSON body", - "created": "1.337", "code": 400, "type": "Bad Request", - "transaction_id": "test"}) diff --git a/orm/common/orm_common/tests/utils/test_cross_api_utils.py b/orm/common/orm_common/tests/utils/test_cross_api_utils.py deleted file mode 100755 index 5f9c600a..00000000 --- a/orm/common/orm_common/tests/utils/test_cross_api_utils.py +++ /dev/null @@ -1,74 +0,0 @@ -import mock -from orm_common.utils import cross_api_utils -import time -from unittest import TestCase - - -class TestCrossApiUtil(TestCase): - @mock.patch('pecan.conf') - def setUp(self, mock_conf): - self.mock_response = mock.Mock() - cross_api_utils.conf = mock_conf - - def respond(self, value, code): - self.mock_response.json.return_value = value - self.mock_response.status_code = code - return self.mock_response - - def test_set_utils_conf(self): - cross_api_utils.set_utils_conf(None) - self.assertEqual(cross_api_utils.conf, None) - - def test_check_conf_initialization(self): - cross_api_utils.set_utils_conf(None) - self.assertRaises(AssertionError, cross_api_utils._check_conf_initialization) - - @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group') - def test_is_region_group_exist(self, mock_rms_region_group): - mock_rms_region_group.return_value = 'test_group' - exist = cross_api_utils.is_region_group_exist('test_group_name') - self.assertEqual(exist, True) - - @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group') - def test_is_region_group_exist_false(self, mock_rms_region_group): - mock_rms_region_group.return_value = None - exist = cross_api_utils.is_region_group_exist('test_group_name') - self.assertEqual(exist, False) - - @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group') - def test_get_regions_of_group(self, mock_rms_region_group): - mock_rms_region_group.return_value = {'regions': 'group'} - exist = cross_api_utils.get_regions_of_group('test_group_name') - self.assertEqual(exist, 'group') - - @mock.patch('orm_common.utils.cross_api_utils.get_rms_region_group') - def test_get_regions_of_group_false(self, mock_rms_region_group): - mock_rms_region_group.return_value = None - exist = cross_api_utils.get_regions_of_group('test_group_name') - self.assertEqual(exist, None) - - @mock.patch('requests.get') - def test_get_rms_region_group(self, mock_get): - mock_get.return_value = self.respond({'result': 'success'}, 200) - result = cross_api_utils.get_rms_region_group('test_group_name') - self.assertEqual(result, {'result': 'success'}) - - def test_get_rms_region_group_cache_used(self): - cross_api_utils.prev_timestamp = time.time() - cross_api_utils.prev_group_name = 'test_group' - cross_api_utils.prev_resp = 'test_response' - cross_api_utils.conf.api.rms_server.cache_seconds = 14760251830 - self.assertEqual(cross_api_utils.prev_resp, - cross_api_utils.get_rms_region_group( - cross_api_utils.prev_group_name)) - - @mock.patch.object(cross_api_utils, 'logger') - @mock.patch.object(time, 'time', side_effect=ValueError('test')) - def test_get_rms_region_group_cache_used(self, mock_time, mock_logger): - self.assertRaises(ValueError, cross_api_utils.get_rms_region_group, - 'test') - - # @mock.patch('requests.get') - # def test_get_rms_region_group_with_exception(self, mock_get): - # mock_get.side_affect = Exception('boom') - # self.assertRaises(Exception, cross_api_utils.get_rms_region_group, 'test_group_name') diff --git a/orm/common/orm_common/tests/utils/test_utils.py b/orm/common/orm_common/tests/utils/test_utils.py deleted file mode 100755 index 2fa9c400..00000000 --- a/orm/common/orm_common/tests/utils/test_utils.py +++ /dev/null @@ -1,177 +0,0 @@ -import logging -import mock -from orm_common.utils import utils -import pprint -from testfixtures import log_capture -from unittest import TestCase - - -class TestUtil(TestCase): - @mock.patch('pecan.conf') - def setUp(self, mock_conf): - self.mock_response = mock.Mock() - utils.conf = mock_conf - - def respond(self, value, code): - self.mock_response.json.return_value = value - self.mock_response.status_code = code - return self.mock_response - - @mock.patch('requests.post') - def test_make_uuid(self, mock_post): - mock_post.return_value = self.respond({'uuid': '987654321'}, 200) - uuid = utils.create_or_validate_uuid('', 'uuidtype') - self.assertEqual(uuid, '987654321') - - @mock.patch('requests.post') - @log_capture('orm_common.utils.utils', level=logging.INFO) - def test_make_uuid_offline(self, mock_post, l): - mock_post.side_effect = Exception('boom') - uuid = utils.create_or_validate_uuid('', 'uuidtype') - self.assertEqual(uuid, None) - l.check(('orm_common.utils.utils', 'INFO', 'Failed in make_uuid:boom')) - - @mock.patch('requests.post') - def test_make_transid(self, mock_post): - mock_post.return_value = self.respond({'uuid': '987654321'}, 200) - uuid = utils.make_transid() - self.assertEqual(uuid, '987654321') - - @mock.patch('requests.post') - @log_capture('orm_common.utils.utils', level=logging.INFO) - def test_make_transid_offline(self, mock_post, l): - mock_post.side_effect = Exception('boom') - uuid = utils.make_transid() - self.assertEqual(uuid, None) - l.check( - ('orm_common.utils.utils', 'INFO', 'Failed in make_transid:boom')) - - @mock.patch('audit_client.api.audit.init') - @mock.patch('audit_client.api.audit.audit') - def test_audit_trail(self, mock_init, mock_audit): - resp = utils.audit_trail('create customer', '1234', - {'X-RANGER-Client': 'Fred'}, '5678') - self.assertEqual(resp, 200) - - @mock.patch('audit_client.api.audit.audit') - def test_audit_trail_offline(self, mock_audit): - mock_audit.side_effect = Exception('boom') - resp = utils.audit_trail('create customer', '1234', - {'X-RANGER-Client': 'Fred'}, '5678') - self.assertEqual(resp, None) - - @mock.patch('audit_client.api.audit.init') - @mock.patch('audit_client.api.audit.audit') - def test_audit_service_args_least(self, mock_audit, mock_init): - resp = utils.audit_trail('create customer', '1234', - {'X-RANGER-Client': 'Fred'}, '5678') - self.assertEqual(mock_audit.call_args[0][1], 'Fred') # application_id - self.assertEqual(mock_audit.call_args[0][2], '1234') # tracking_id - self.assertEqual(mock_audit.call_args[0][3], '1234') # transaction_id - self.assertEqual(mock_audit.call_args[0][4], - 'create customer') # transaction_type - self.assertEqual(mock_audit.call_args[0][5], '5678') # resource_id - # self.assertEqual(mock_audit.call_args[0][6], 'cms') # service - self.assertEqual(mock_audit.call_args[0][7], '') # user_id - self.assertEqual(mock_audit.call_args[0][8], 'NA') # external_id - self.assertEqual(mock_audit.call_args[0][9], '') # event_details - # self.assertEqual(mock_audit.call_args[0][10], 'Saved to DB') # status - - @mock.patch('audit_client.api.audit.init') - @mock.patch('audit_client.api.audit.audit') - def test_audit_service_with_tracking(self, mock_audit, mock_init): - utils.audit_trail('create customer', '1234', - {'X-RANGER-Client': 'Fred', - 'X-RANGER-Tracking-Id': 'Track12'}, '5678') - self.assertEqual(mock_audit.call_args[0][1], 'Fred') # application_id - self.assertEqual(mock_audit.call_args[0][2], 'Track12') # tracking_id - self.assertEqual(mock_audit.call_args[0][3], '1234') # transaction_id - self.assertEqual(mock_audit.call_args[0][4], - 'create customer') # transaction_type - self.assertEqual(mock_audit.call_args[0][5], '5678') # resource_id - # self.assertEqual(mock_audit.call_args[0][6], 'cms') # service - self.assertEqual(mock_audit.call_args[0][7], '') # user_id - self.assertEqual(mock_audit.call_args[0][8], 'NA') # external_id - self.assertEqual(mock_audit.call_args[0][9], '') # event_details - # self.assertEqual(mock_audit.call_args[0][10], 'Saved to DB') # status - - @mock.patch('audit_client.api.audit.init') - @mock.patch('audit_client.api.audit.audit') - def test_audit_service_with_requester(self, mock_audit, mock_init): - resp = utils.audit_trail('create customer', '1234', - {'X-RANGER-Client': 'Fred', - 'X-RANGER-Requester': 'Req04'}, '5678') - self.assertEqual(mock_audit.call_args[0][1], 'Fred') # application_id - self.assertEqual(mock_audit.call_args[0][2], '1234') # tracking_id - self.assertEqual(mock_audit.call_args[0][3], '1234') # transaction_id - self.assertEqual(mock_audit.call_args[0][4], 'create customer') # transaction_type - self.assertEqual(mock_audit.call_args[0][5], '5678') # resource_id - # self.assertEqual(mock_audit.call_args[0][6], 'cms') # service - self.assertEqual(mock_audit.call_args[0][7], 'Req04') # user_id - self.assertEqual(mock_audit.call_args[0][8], 'NA') # external_id - self.assertEqual(mock_audit.call_args[0][9], '') # event_details - # self.assertEqual(mock_audit.call_args[0][10], 'Saved to DB') # status - - def test_set_utils_conf(self): - utils.set_utils_conf('test') - self.assertEqual(utils.conf, 'test') - - def test_check_conf_initialization(self): - utils.set_utils_conf(None) - self.assertRaises(AssertionError, utils._check_conf_initialization) - - @mock.patch('requests.post') - def test_create_existing_uuid(self, mock_post): - uuid = '987654321' - uuid_type = 'testtype' - mock_post.return_value = self.respond( - {'uuid': uuid, 'uuid_type': uuid_type}, 200) - returned_uuid = utils.create_or_validate_uuid(uuid, uuid_type) - self.assertEqual(returned_uuid, uuid) - - @mock.patch('requests.post') - def test_create_existing_uuid_with_exception(self, mock_post): - mock_post.side_effect = Exception('boom') - uuid = '987654321' - uuid_type = 'testtype' - returned_uuid = utils.create_or_validate_uuid(uuid, uuid_type) - self.assertEqual(returned_uuid, None) - - @mock.patch('requests.post') - def test_create_existing_uuid_with_400(self, mock_post): - uuid = '987654321' - uuid_type = 'testId' - mock_post.return_value = self.respond({'uuid': uuid, 'uuid_type': uuid_type}, 409) - self.assertRaises(TypeError, utils.create_or_validate_uuid(uuid, uuid_type)) - - @mock.patch('pecan.conf') - def test_report_config(self, mock_conf): - expected_value = pprint.pformat(mock_conf.to_dict(), indent=4) - returned_value = utils.report_config(mock_conf) - self.assertEqual(expected_value, returned_value) - - @mock.patch('pecan.conf') - def test_report_config_with_log_write(self, mock_conf): - expected_value = pprint.pformat(mock_conf.to_dict(), indent=4) - returned_value = utils.report_config(mock_conf, True) - self.assertEqual(expected_value, returned_value) - - @mock.patch('requests.get') - def test_get_resource_status_sanity(self, mock_get): - my_response = mock.MagicMock() - my_response.status_code = 200 - my_response.json.return_value = 'test' - mock_get.return_value = my_response - result = utils.get_resource_status('A') - self.assertEqual(result, 'test') - - @mock.patch('requests.get', side_effect=ValueError()) - def test_get_resource_status_get_failed(self, mock_get): - self.assertIsNone(utils.get_resource_status('A')) - - @mock.patch('requests.get') - def test_get_resource_status_invalid_response(self, mock_get): - my_response = mock.MagicMock() - my_response.status_code = 404 - mock_get.return_value = my_response - self.assertIsNone(utils.get_resource_status('A')) diff --git a/orm/common/orm_common/utils/api_error_utils.py b/orm/common/orm_common/utils/api_error_utils.py index e593d99c..7a0b8492 100755 --- a/orm/common/orm_common/utils/api_error_utils.py +++ b/orm/common/orm_common/utils/api_error_utils.py @@ -19,10 +19,15 @@ def get_error_dict(status_code, transaction_id, message, error_details=""): if not message: message = error_message[status_code]['message'] + if status_code in error_message: + error_type = error_message[status_code]['type'] + else: + error_type = 'Unhandled Error' + return { # for 'code', get integer value of status_code (e.g. from 409.2 to 409) 'code': int(status_code), - 'type': error_message[status_code]['type'], + 'type': error_type, 'created': '{}'.format(utils.get_time_human()), 'transaction_id': transaction_id, 'message': message, diff --git a/orm/common/orm_common/utils/cross_api_utils.py b/orm/common/orm_common/utils/cross_api_utils.py index ee4eadc8..2ffb475d 100755 --- a/orm/common/orm_common/utils/cross_api_utils.py +++ b/orm/common/orm_common/utils/cross_api_utils.py @@ -1,15 +1,13 @@ import logging from pecan import conf +import re import requests import string import time -# from orm_common.logger import get_logger - -# logger = get_logger(__name__) logger = logging.getLogger(__name__) - conf = None +prev_group_name = None def set_utils_conf(_conf): @@ -32,14 +30,14 @@ def validate_description(data_value): allowed_punctuations = ['.', '-', ','] # if type of data_value != 'string' then convert it to string + desc = '' if not isinstance(data_value, str): desc = str(data_value) - invalidChars = (string.punctuation).translate( - None, ''.join(allowed_punctuations)) - + invalidChars = re.sub(str(allowed_punctuations), + '', string.punctuation) # detect any escape sequences or special characters in data string - encoded_string = desc.encode('string_escape') + encoded_string = desc.encode('unicode_escape').decode('utf-8') if any(char in invalidChars for char in encoded_string): return False @@ -69,9 +67,6 @@ def get_regions_of_group(group_name): return group["regions"] -prev_group_name = None - - def get_rms_region_group(group_name): """ function to call rms api for group info returns 200 for ok and None for error @@ -104,7 +99,7 @@ def get_rms_region_group(group_name): logger.error( 'CRITICAL|{}| Failed in getting data from rms: connection error'.format( nagois) + str(exp)) - exp.message = 'connection error: Failed to get get data from rms: ' \ + exp.args[0] = 'connection error: Failed to get get data from rms: ' \ 'unable to connect to server' raise except Exception as e: diff --git a/orm/common/orm_common/utils/error_base.py b/orm/common/orm_common/utils/error_base.py index 45192dbf..6761e09e 100755 --- a/orm/common/orm_common/utils/error_base.py +++ b/orm/common/orm_common/utils/error_base.py @@ -1,9 +1,7 @@ - class Error(Exception): pass class ErrorStatus(Error): - def __init__(self, status_code, message=""): self.message = message diff --git a/orm/common/orm_common/utils/utils.py b/orm/common/orm_common/utils/utils.py index 65e1dfe8..5115adec 100755 --- a/orm/common/orm_common/utils/utils.py +++ b/orm/common/orm_common/utils/utils.py @@ -11,7 +11,7 @@ from pecan import conf # conf = None -logger = logging.getLogger(__name__) +LOG = logging.getLogger(__name__) class ResponseError(Exception): @@ -44,26 +44,26 @@ def create_or_validate_uuid(uuid, uuid_type): url = conf.api.uuid_server.base + conf.api.uuid_server.uuids if not uuid: - logger.debug('Requesting new UUID from URL: {}'.format(url)) + LOG.debug('Requesting new UUID from URL: {}'.format(url)) else: - logger.debug('Creating UUID: {}, using URL: {}'.format(uuid, url)) + LOG.debug('Creating UUID: {}, using URL: {}'.format(uuid, url)) try: resp = requests.post(url, data={'uuid': uuid, 'uuid_type': uuid_type}, verify=conf.verify) except requests.exceptions.ConnectionError as exp: nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper()) - logger.critical( + LOG.critical( 'CRITICAL|{}|Failed in make_uuid: connection error: {}'.format( nagios, str(exp))) exp.message = 'connection error: Failed to get uuid: unable to connect to server' raise except Exception as e: - logger.info('Failed in make_uuid:' + str(e)) + LOG.info('Failed in make_uuid:' + str(e)) return None if resp.status_code == 400: - logger.debug('Duplicate key for uuid: {}'.format(uuid)) + LOG.debug('Duplicate key for uuid: {}'.format(uuid)) raise TypeError('Duplicate key for uuid: ' + str(uuid)) resp = resp.json() @@ -79,15 +79,15 @@ def make_transid(): url = conf.api.uuid_server.base + conf.api.uuid_server.uuids try: - logger.debug('Requesting transaction ID from: {}'.format(url)) + LOG.debug('Requesting transaction ID from: {}'.format(url)) resp = requests.post(url, data={'uuid_type': 'transaction'}, verify=conf.verify) except requests.exceptions.ConnectionError as exp: nagios = 'CON{}UUIDGEN001'.format(conf.server.name.upper()) - logger.critical('CRITICAL|{}|Failed in make_transid: connection error: {}'.format(nagios, str(exp))) + LOG.critical('CRITICAL|{}|Failed in make_transid: connection error: {}'.format(nagios, str(exp))) exp.message = 'connection error: Failed to get uuid: unable to connect to server' raise except Exception as e: - logger.info('Failed in make_transid:' + str(e)) + LOG.info('Failed in make_transid:' + str(e)) return None resp = resp.json() @@ -129,14 +129,14 @@ def audit_trail(cmd, transaction_id, headers, resource_id, message=None, conf.api.audit_server.base, conf.api.audit_server.trans) num_of_send_retries = 3 time_wait_between_retries = 1 - logger.debug('Initializing Audit, using URL: {}'.format( + LOG.debug('Initializing Audit, using URL: {}'.format( audit_server_url)) audit.init(audit_server_url, num_of_send_retries, time_wait_between_retries, conf.server.name.upper()) audit_setup = True try: - timestamp = long(round(time.time() * 1000)) + timestamp = int(round(time.time() * 1000)) application_id = headers[ 'X-RANGER-Client'] if 'X-RANGER-Client' in headers else \ 'NA' @@ -151,16 +151,16 @@ def audit_trail(cmd, transaction_id, headers, resource_id, message=None, 'X-RANGER-Requester'] if 'X-RANGER-Requester' in headers else \ '' external_id = 'NA' - logger.debug('Sending to audit: timestamp: {}, application_id: {}, ' - ' tracking_id: {},' - ' transaction_type: {}'.format(timestamp, application_id, - tracking_id, - transaction_type)) + LOG.debug('Sending to audit: timestamp: {}, application_id: {}, ' + ' tracking_id: {},' + ' transaction_type: {}'.format(timestamp, application_id, + tracking_id, + transaction_type)) audit.audit(timestamp, application_id, tracking_id, transaction_id, transaction_type, resource_id, service_name, user_id, external_id, event_details) except Exception as e: - logger.exception('Failed in audit service. ' + str(e)) + LOG.exception('Failed in audit service. ' + str(e)) return None return 200 @@ -175,7 +175,7 @@ def report_config(conf, dump_to_log=False, my_logger=None): """ ret = pprint.pformat(conf.to_dict(), indent=4) - effective_logger = my_logger if my_logger else logger + effective_logger = my_logger if my_logger else LOG if dump_to_log: effective_logger.info('Current Configuration:\n' + ret) @@ -190,19 +190,19 @@ def get_resource_status(resource_id): url = "{}{}{}".format(conf.api.rds_server.base, conf.api.rds_server.status, resource_id) - logger.debug('Getting status from: {}'.format(url)) + LOG.debug('Getting status from: {}'.format(url)) try: result = requests.get(url, verify=conf.verify) except Exception as exception: - logger.debug('Failed to get status: {}'.format(str(exception))) + LOG.debug('Failed to get status: {}'.format(str(exception))) return None if result.status_code != 200: - logger.debug('Got invalid response from RDS: code {}'.format( + LOG.debug('Got invalid response from RDS: code {}'.format( result.status_code)) return None else: - logger.debug('Got response from RDS: {}'.format(result.json())) + LOG.debug('Got response from RDS: {}'.format(result.json())) return result.json() diff --git a/orm/orm_client/db_clear/cli_comander.py b/orm/orm_client/db_clear/cli_comander.py index 0fbb39e5..9c1fa4d1 100644 --- a/orm/orm_client/db_clear/cli_comander.py +++ b/orm/orm_client/db_clear/cli_comander.py @@ -1,4 +1,4 @@ -import config as conf +from . import config as conf import json import logging import os diff --git a/orm/orm_client/db_clear/cms_cleaner.py b/orm/orm_client/db_clear/cms_cleaner.py index d9d8ccfe..96021cd6 100644 --- a/orm/orm_client/db_clear/cms_cleaner.py +++ b/orm/orm_client/db_clear/cms_cleaner.py @@ -1,102 +1,102 @@ -"""clean cms mpdule.""" -import cli_comander as cli -import db_comander as db -import initializer -import logging -import sys -import utils -import yaml_handler as yh - - -log = logging.getLogger(__name__) - - -def _validate_service(service): - allowed_services = ['CMS', 'FMS'] - if service.upper() not in allowed_services: - raise Exception("service should be one of {}".format(allowed_services)) - return service.upper() - - -def _init(): - initializer.init_log() - return - - -def read_csv_file(file): - log.debug("reading file {}".format(file)) - return utils.read_csv_file(file) - - -def resource_db_clean(resource_id, service): - log.debug("cleaning {} db for resource {}".format(service, resource_id)) - db.remove_resource_db(resource_id, service) - return - - -def check_yaml_file(resource_id): - log.debug('checking yml file if exist for resource {}'.format(resource_id)) - files = yh.check_yaml_exist(resource_id) - message = 'no yaml files found for this resource' - if files: - message = "found files please remove manualy {}".format(files) - log.debug(message) - return - - -def get_resource_regions(resource_id, service_name): - db_regions = db.get_cms_db_resource_regions(resource_id) - orm_regions = cli.get_resource_regions(resource_id, service_name) - return orm_regions, db_regions - - -def clean_rds_resource_status(resource_id): - log.debug("clean rds status db for resource {}".format(resource_id)) - db.remove_rds_resource_status(resource_id) - return - - -def _start_cleaning(): - log.info('start cleaning') - file_path = sys.argv[1] - service = _validate_service(sys.argv[2]) - resourses_to_clean = read_csv_file(file_path) - for resource_id in resourses_to_clean: - try: - log.debug( - 'check if resource {} has any regions before clean'.format( - resource_id)) - resource_regions, db_regions = get_resource_regions(resource_id, - service) - if resource_regions or db_regions: - log.error( - "got regions {} {} please clean regions from orm before" - " removing the resource {}".format(resource_regions, - db_regions, - resource_id)) - raise Exception( - "got regions {} {} please clean regions from orm before" - " removing the resource {}".format(resource_regions, - db_regions, - resource_id)) - - log.debug('cleaning {}'.format(resource_id)) - resource_db_clean(resource_id, service) - check_yaml_file(resource_id) - clean_rds_resource_status(resource_id) - - except Exception as exp: - log.error("---------------{}---------------".format(exp.message)) - if 'not found' not in exp.message: - log.exception(exp) - continue - return - - -if __name__ == '__main__': - warning_message = raw_input( - 'IMPORTANT:- please note its your responsibility to backup the db' - ' before runing this script... click enter before continue' - ) - _init() - _start_cleaning() +from . import cli_comander as cli +from . import db_comander as db +from . import initializer +from . import logging +from . import sys +from . import utils +from . import yaml_handler as yh + + +log = logging.getLogger(__name__) + + +def _validate_service(service): + allowed_services = ['CMS', 'FMS'] + if service.upper() not in allowed_services: + raise Exception("service should be one of {}".format(allowed_services)) + return service.upper() + + +def _init(): + initializer.init_log() + return + + +def read_csv_file(file): + log.debug("reading file {}".format(file)) + return utils.read_csv_file(file) + + +def resource_db_clean(resource_id, service): + log.debug("cleaning {} db for resource {}".format(service, resource_id)) + db.remove_resource_db(resource_id, service) + return + + +def check_yaml_file(resource_id): + log.debug('checking yml file if exist for resource {}'.format(resource_id)) + files = yh.check_yaml_exist(resource_id) + message = 'no yaml files found for this resource' + if files: + message = "found files please remove manualy {}".format(files) + log.debug(message) + return + + +def get_resource_regions(resource_id, service_name): + db_regions = db.get_cms_db_resource_regions(resource_id) + orm_regions = cli.get_resource_regions(resource_id, service_name) + return orm_regions, db_regions + + +def clean_rds_resource_status(resource_id): + log.debug("clean rds status db for resource {}".format(resource_id)) + db.remove_rds_resource_status(resource_id) + return + + +def _start_cleaning(): + log.info('start cleaning') + file_path = sys.argv[1] + service = _validate_service(sys.argv[2]) + resourses_to_clean = read_csv_file(file_path) + for resource_id in resourses_to_clean: + try: + log.debug( + 'check if resource {} has any regions before clean'.format( + resource_id)) + resource_regions, db_regions = get_resource_regions(resource_id, + service) + if resource_regions or db_regions: + log.error( + "got regions {} {} please clean regions from orm before" + " removing the resource {}".format(resource_regions, + db_regions, + resource_id)) + raise Exception( + "got regions {} {} please clean regions from orm before" + " removing the resource {}".format(resource_regions, + db_regions, + resource_id)) + + log.debug('cleaning {}'.format(resource_id)) + resource_db_clean(resource_id, service) + check_yaml_file(resource_id) + clean_rds_resource_status(resource_id) + + except Exception as exp: + log.error("---------------{}---------------".format(exp.message)) + if 'not found' not in exp.message: + log.exception(exp) + continue + return + + +if __name__ == '__main__': + warning_message = ( + 'IMPORTANT:- please note its your responsibility to backup the db' + ' before runing this script... click enter before continue' + ) + log.info(warning_message) + _init() + _start_cleaning() diff --git a/orm/orm_client/db_clear/db_comander.py b/orm/orm_client/db_clear/db_comander.py index 9b283118..e917f420 100644 --- a/orm/orm_client/db_clear/db_comander.py +++ b/orm/orm_client/db_clear/db_comander.py @@ -1,4 +1,4 @@ -import config as conf +from . import config as conf import logging import sqlalchemy diff --git a/orm/orm_client/db_clear/resource_cleaner.py b/orm/orm_client/db_clear/resource_cleaner.py index aa04a1f0..39843d34 100755 --- a/orm/orm_client/db_clear/resource_cleaner.py +++ b/orm/orm_client/db_clear/resource_cleaner.py @@ -1,111 +1,112 @@ -import cli_comander as cli -import db_comander as db -import initializer -import logging -import sys -import utils -import yaml_handler as yh - - -log = logging.getLogger(__name__) - - -def _validate_service(service): - allowed_services = ['CMS', 'FMS', 'IMS'] - if service.upper() not in allowed_services: - raise Exception("service should be one of {}".format(allowed_services)) - return service.upper() - - -def _init(): - initializer.init_log() - return - - -def read_csv_file(file): - log.debug("reading file {}".format(file)) - return utils.read_csv_file(file) - - -def resource_db_clean(resource_id, service): - log.debug("cleaning {} db for resource {}".format(service, resource_id)) - db.remove_resource_db(resource_id, service) - return - - -def check_yaml_file(resource_id): - log.debug('checking yml file if exist for resource {}'.format(resource_id)) - files = yh.check_yaml_exist(resource_id) - message = 'no yaml files found for this resource' - if files: - message = "found files please remove manualy {}".format(files) - log.debug(message) - return - - -def get_resource_regions(resource_id, service_name): - - if service_name.upper() == 'CMS': - db_regions = db.get_cms_db_resource_regions(resource_id, service_name) - elif service_name.upper() == 'FMS': - db_regions = db.get_fms_db_resource_regions(resource_id, service_name) - elif service_name.upper() == 'IMS': - db_regions = db.get_ims_db_resource_regions(resource_id, service_name) - -# db_regions = db.get_resource_regions(resource_id, service_name) - orm_regions = cli.get_resource_regions(resource_id, service_name) - return orm_regions, db_regions - - -def clean_rds_resource_status(resource_id): - log.debug("clean rds status db for resource {}".format(resource_id)) - db.remove_rds_resource_status(resource_id) - return - - -def _start_cleaning(): - log.info('start cleaning') - file_path = sys.argv[1] - service = _validate_service(sys.argv[2]) - resourses_to_clean = read_csv_file(file_path) - for resource_id in resourses_to_clean: - try: - log.debug( - 'check if resource {} has any regions before clean'.format( - resource_id)) - resource_regions, db_regions = get_resource_regions(resource_id, - service) - if resource_regions or db_regions: - log.error( - "got regions {} {} please clean regions from orm before" - " removing the resource {}".format(resource_regions, - db_regions, - resource_id)) - raise Exception( - "got regions {} {} please clean regions from orm before" - " removing the resource {}".format(resource_regions, - db_regions, - resource_id)) - - log.debug('cleaning {}'.format(resource_id)) - resource_db_clean(resource_id, service) - check_yaml_file(resource_id) - clean_rds_resource_status(resource_id) - if service.upper() == "IMS": - db.remove_rds_image_metadata(resource_id) - - except Exception as exp: - log.error("---------------{}---------------".format(exp.message)) - if 'not found' not in exp.message: - log.exception(exp) - continue - return - - -if __name__ == '__main__': - warning_message = raw_input( - 'IMPORTANT:- please note its your responsibility to backup the db' - ' before running this script... click enter before continue' - ) - _init() - _start_cleaning() +from . import cli_comander as cli +from . import db_comander as db +from . import initializer +from . import logging +from . import sys +from . import utils +from . import yaml_handler as yh + + +log = logging.getLogger(__name__) + + +def _validate_service(service): + allowed_services = ['CMS', 'FMS', 'IMS'] + if service.upper() not in allowed_services: + raise Exception("service should be one of {}".format(allowed_services)) + return service.upper() + + +def _init(): + initializer.init_log() + return + + +def read_csv_file(file): + log.debug("reading file {}".format(file)) + return utils.read_csv_file(file) + + +def resource_db_clean(resource_id, service): + log.debug("cleaning {} db for resource {}".format(service, resource_id)) + db.remove_resource_db(resource_id, service) + return + + +def check_yaml_file(resource_id): + log.debug('checking yml file if exist for resource {}'.format(resource_id)) + files = yh.check_yaml_exist(resource_id) + message = 'no yaml files found for this resource' + if files: + message = "found files please remove manualy {}".format(files) + log.debug(message) + return + + +def get_resource_regions(resource_id, service_name): + + if service_name.upper() == 'CMS': + db_regions = db.get_cms_db_resource_regions(resource_id, service_name) + elif service_name.upper() == 'FMS': + db_regions = db.get_fms_db_resource_regions(resource_id, service_name) + elif service_name.upper() == 'IMS': + db_regions = db.get_ims_db_resource_regions(resource_id, service_name) + +# db_regions = db.get_resource_regions(resource_id, service_name) + orm_regions = cli.get_resource_regions(resource_id, service_name) + return orm_regions, db_regions + + +def clean_rds_resource_status(resource_id): + log.debug("clean rds status db for resource {}".format(resource_id)) + db.remove_rds_resource_status(resource_id) + return + + +def _start_cleaning(): + log.info('start cleaning') + file_path = sys.argv[1] + service = _validate_service(sys.argv[2]) + resourses_to_clean = read_csv_file(file_path) + for resource_id in resourses_to_clean: + try: + log.debug( + 'check if resource {} has any regions before clean'.format( + resource_id)) + resource_regions, db_regions = get_resource_regions(resource_id, + service) + if resource_regions or db_regions: + log.error( + "got regions {} {} please clean regions from orm before" + " removing the resource {}".format(resource_regions, + db_regions, + resource_id)) + raise Exception( + "got regions {} {} please clean regions from orm before" + " removing the resource {}".format(resource_regions, + db_regions, + resource_id)) + + log.debug('cleaning {}'.format(resource_id)) + resource_db_clean(resource_id, service) + check_yaml_file(resource_id) + clean_rds_resource_status(resource_id) + if service.upper() == "IMS": + db.remove_rds_image_metadata(resource_id) + + except Exception as exp: + log.error("---------------{}---------------".format(exp.message)) + if 'not found' not in exp.message: + log.exception(exp) + continue + return + + +if __name__ == '__main__': + warning_message = ( + 'IMPORTANT:- please note its your responsibility to backup the db' + ' before running this script... click enter before continue' + ) + log.info(warning_message) + _init() + _start_cleaning() diff --git a/orm/orm_client/db_clear/yaml_handler.py b/orm/orm_client/db_clear/yaml_handler.py index f2ecafd1..285cb328 100644 --- a/orm/orm_client/db_clear/yaml_handler.py +++ b/orm/orm_client/db_clear/yaml_handler.py @@ -1,4 +1,4 @@ -import config as conf +from . import config as conf import fnmatch import os diff --git a/orm/orm_client/flavorgen/flavorator.py b/orm/orm_client/flavorgen/flavorator.py index ecaf43a8..298636a0 100644 --- a/orm/orm_client/flavorgen/flavorator.py +++ b/orm/orm_client/flavorgen/flavorator.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import argparse import json import os @@ -26,19 +25,19 @@ def sh(harg, file_name): cmd = create_command(harg, file_name) - print '>> Starting: ' + cmd + print('>> Starting: ' + cmd) start = time.time() output = '' p = subprocess.Popen(cmd.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in iter(p.stdout.readline, b''): out = line.rstrip() - print(">>> " + out) + print((">>> " + out)) output += out end = time.time() span = end - start retcode = p.wait() - print '>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60) + print('>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60)) return retcode, output @@ -61,7 +60,7 @@ for file in [os.path.join(dp, f) for dp, dn, fn in except ValueError: continue - print f + print(f) flavor_name = calculate_name(f) fh, file_name = tempfile.mkstemp() os.write(fh, json.dumps({"flavor": f})) diff --git a/orm/orm_client/flavorgen/make_flav.py b/orm/orm_client/flavorgen/make_flav.py index f085fe3b..863acdd5 100644 --- a/orm/orm_client/flavorgen/make_flav.py +++ b/orm/orm_client/flavorgen/make_flav.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import json import sys diff --git a/orm/orm_client/flavorgen/make_flavor.py b/orm/orm_client/flavorgen/make_flavor.py index b469cc40..05cc8ef1 100644 --- a/orm/orm_client/flavorgen/make_flavor.py +++ b/orm/orm_client/flavorgen/make_flavor.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import json import re import sys diff --git a/orm/orm_client/flavorgen/regionator.py b/orm/orm_client/flavorgen/regionator.py index 86d08887..f388ec2d 100644 --- a/orm/orm_client/flavorgen/regionator.py +++ b/orm/orm_client/flavorgen/regionator.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import argparse import ast import json @@ -34,7 +33,7 @@ def get_region_list(regions): result.append({'name': result_region['name'], 'designType': result_region['designType']}) else: - print 'Failed to get region %s, aborting...' % (region,) + print('Failed to get region %s, aborting...' % (region,)) exit(1) return result @@ -75,19 +74,19 @@ def sh(cli_command): # return status and output cmd = create_command(cli_command) - print '>> Starting: ' + cmd + print('>> Starting: ' + cmd) start = time.time() output = '' errpat = re.compile('error', re.I) p = subprocess.Popen(cmd.split(), shell=False, stdout=subprocess.PIPE) for line in iter(p.stdout.readline, b''): out = line.rstrip() - print(">>> " + out) + print((">>> " + out)) output += out end = time.time() span = end - start retcode = p.wait() - print '>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60) + print('>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60)) return retcode, output @@ -108,7 +107,7 @@ args = parser.parse_args() regions = args.regions.split(',') series_list = args.series.split(',') if not regions: - print "Must specify at least one region" + print("Must specify at least one region") exit(1) # Get all regions from RMS @@ -145,7 +144,7 @@ for file in [os.path.join(dp, f) for dp, dn, fn in if not res: flavor = ast.literal_eval(output) FID = flavor['flavor']['id'] - print 'fid: ' + FID + print('fid: ' + FID) res, output = sh('add_region') os.unlink(FILE_NAME) @@ -157,5 +156,5 @@ if not any_update: exp = 'combination of regions:[{}] and series:[{}]'.format( args.regions, args.series) - print('No flavor was updated, please make sure that the {} matches any ' - 'flavor under the flavor directory'.format(exp)) + print(('No flavor was updated, please make sure that the {} matches any ' + 'flavor under the flavor directory'.format(exp))) diff --git a/orm/orm_client/imagegen/imageator.py b/orm/orm_client/imagegen/imageator.py index 8530d2a4..7ea81b67 100644 --- a/orm/orm_client/imagegen/imageator.py +++ b/orm/orm_client/imagegen/imageator.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python import argparse import json import os @@ -25,7 +24,7 @@ def sh(cmd): # print runtime and status # return status and output - print '>> Starting: ' + cmd + print('>> Starting: ' + cmd) start = time.time() output = '' errpat = re.compile('error', re.I) @@ -35,12 +34,12 @@ def sh(cmd): stderr=subprocess.STDOUT) for line in iter(p.stdout.readline, b''): out = line.rstrip() - print(">>> " + out) + print((">>> " + out)) output += out end = time.time() span = end - start retcode = p.wait() - print '>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60) + print('>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60)) return retcode, output @@ -65,7 +64,7 @@ for file in [f for f in os.listdir(IMAGE_DIR) if isfile(join(IMAGE_DIR, f))]: f = read_jsonfile(join(IMAGE_DIR, file)) - print f + print(f) image_name = f['name'] fh, file_name = tempfile.mkstemp() os.write(fh, json.dumps({"image": f})) @@ -80,7 +79,7 @@ for file in [f for f in os.listdir(IMAGE_DIR) if image_name, 'Success' if res == 0 else 'Failed')) -print "\nImage creation summary:" -print "-----------------------" +print("\nImage creation summary:") +print("-----------------------") for s in summary: - print s + print(s) diff --git a/orm/orm_client/imagegen/regionator.py b/orm/orm_client/imagegen/regionator.py index 35396d44..854bd7df 100644 --- a/orm/orm_client/imagegen/regionator.py +++ b/orm/orm_client/imagegen/regionator.py @@ -1,9 +1,8 @@ -#!/usr/bin/env python import argparse import ast import json import os -from os.path import isfile, join +from os.path import (isfile, join) import re import subprocess import tempfile @@ -25,19 +24,19 @@ def sh(cmd): # print runtime and status # return status and output - print '>> Starting: ' + cmd + print('>> Starting: ' + cmd) start = time.time() output = '' errpat = re.compile('error', re.I) p = subprocess.Popen(cmd.split(), shell=False, stdout=subprocess.PIPE) for line in iter(p.stdout.readline, b''): out = line.rstrip() - print(">>> " + out) + print((">>> " + out)) output += out end = time.time() span = end - start retcode = p.wait() - print '>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60) + print('>> Ended: %s [%s, %d:%02d]' % (cmd, retcode, span / 60, span % 60)) return retcode, output @@ -63,7 +62,7 @@ args = parser.parse_args() regions = args.regions.split(',') if not regions: - print "Must specify at least one region" + print("Must specify at least one region") exit(0) data = {'regions': [{'name': r} for r in regions]} fh, file_name = tempfile.mkstemp() @@ -79,21 +78,21 @@ if not res: images = ast.literal_eval(output) for img in images['images']: img_dict[img['name']] = img['id'] - print img_dict + print(img_dict) for file in [f for f in os.listdir(IMAGE_DIR) if isfile(join(IMAGE_DIR, f))]: f = read_jsonfile(join(IMAGE_DIR, file)) - print f + print(f) image_name = f['name'] if image_name in img_dict: image_id = img_dict[image_name] - print 'image_id: ' + image_id + print('image_id: ' + image_id) res, output = sh('python %s ims add_regions test %s %s' % ( CLI_PATH, image_id, file_name)) else: - print 'python image_name: {} does not exist. ' \ - 'ignore.'.format(image_name) + print('python image_name: {} does not exist. ' + 'ignore.'.format(image_name)) os.unlink(file_name) diff --git a/orm/orm_client/ormcli/cli_common.py b/orm/orm_client/ormcli/cli_common.py index b1537b14..1fa33675 100644 --- a/orm/orm_client/ormcli/cli_common.py +++ b/orm/orm_client/ormcli/cli_common.py @@ -1,4 +1,4 @@ -import config +from . import config import json import requests @@ -65,7 +65,7 @@ def get_token(timeout, args): message = ('ERROR: {} for token generation was not supplied. ' 'Please use its command-line argument or ' 'environment variable.'.format(argument)) - print message + print(message) raise MissingArgumentError(message) keystone_ep = args.keystone_auth_url if args.keystone_auth_url else None @@ -83,9 +83,9 @@ def get_token(timeout, args): project_domain,) if args.verbose: - print( + print(( "Getting token:\ntimeout: %d\nheaders: %s\nurl: %s\n" % ( - timeout, headers, url)) + timeout, headers, url))) try: resp = requests.post(url, timeout=timeout, data=data, headers=headers) if resp.status_code != 201: @@ -95,10 +95,10 @@ def get_token(timeout, args): return resp.headers['x-subject-token'] except Exception as e: - print e.message - raise ConnectionError(e.message) + print(str(e)) + raise ConnectionError(str(e)) def pretty_print_json(json_to_print): """Print a json without the u' prefix.""" - print(json.dumps(json_to_print)) + print((json.dumps(json_to_print))) diff --git a/orm/orm_client/ormcli/cmscli.py b/orm/orm_client/ormcli/cmscli.py index bd9919ea..892a3e04 100644 --- a/orm/orm_client/ormcli/cmscli.py +++ b/orm/orm_client/ormcli/cmscli.py @@ -1,11 +1,11 @@ -#!/usr/bin/python import argparse -import cli_common -import config import orm.base_config as base_config import os import requests +from . import cli_common +from . import config + class ResponseError(Exception): pass @@ -620,7 +620,7 @@ def validate_args(args): message = ('ERROR: {} for token generation was not supplied. ' 'Please use its command-line argument or ' 'environment variable.'.format(argument)) - print message + print(message) raise cli_common.MissingArgumentError(message) @@ -643,11 +643,11 @@ def run(args): rest_cmd, cmd_url = cmd_details(args) url = '%s/v1/orm/' % (host) + cmd_url if args.faceless: - auth_token = auth_region = requester = client = '' + auth_key = auth_region = requester = client = '' else: try: validate_args(args) - auth_token = cli_common.get_token(timeout, args) + auth_key = cli_common.get_token(timeout, args) except Exception: exit(1) auth_region = globals()['auth_region'] @@ -657,7 +657,7 @@ def run(args): tracking_id = args.tracking_id if args.tracking_id else None headers = { 'content-type': 'application/json', - 'X-Auth-Token': auth_token, + 'X-Auth-Token': auth_key, 'X-Auth-Region': auth_region, 'X-RANGER-Requester': requester, 'X-RANGER-Client': client, @@ -665,22 +665,22 @@ def run(args): } if args.verbose: - print( + print(( "Sending API:\ntimeout: %d\ndata: %s\nheaders: %s\ncmd: %s\nurl: " "%s\n" % ( - timeout, data, headers, rest_cmd.__name__, url)) + timeout, data, headers, rest_cmd.__name__, url))) try: resp = rest_cmd(url, timeout=timeout, data=data, headers=headers, verify=config.verify) except Exception as e: - print e + print(e) exit(1) if not 200 <= resp.status_code < 300: content = resp.content - print 'API error: %s %s (Reason: %d)\n%s' % ( - rest_cmd.func_name.upper(), url, resp.status_code, content) + print('API error: %s %s (Reason: %d)\n%s' % ( + rest_cmd.__name__.upper(), url, resp.status_code, content)) exit(1) if resp.status_code == 204: # no content @@ -688,6 +688,6 @@ def run(args): rj = resp.json() if rj == 'Not found': - print 'No output was found' + print('No output was found') else: cli_common.pretty_print_json(rj) diff --git a/orm/orm_client/ormcli/fmscli.py b/orm/orm_client/ormcli/fmscli.py index 881f12bc..e223602c 100644 --- a/orm/orm_client/ormcli/fmscli.py +++ b/orm/orm_client/ormcli/fmscli.py @@ -1,11 +1,11 @@ -#!/usr/bin/python import argparse -import cli_common -import config import orm.base_config as base_config import os import requests +from . import cli_common +from . import config + class ResponseError(Exception): pass @@ -308,7 +308,7 @@ def validate_args(args): message = ('ERROR: {} for token generation was not supplied. ' 'Please use its command-line argument or ' 'environment variable.'.format(argument)) - print message + print(message) raise cli_common.MissingArgumentError(message) @@ -332,11 +332,11 @@ def run(args): rest_cmd, cmd_url = cmd_details(args) url = '%s/v1/orm/flavors' % (host) + cmd_url if args.faceless: - auth_token = auth_region = requester = client = '' + auth_key = auth_region = requester = client = '' else: try: validate_args(args) - auth_token = cli_common.get_token(timeout, args) + auth_key = cli_common.get_token(timeout, args) except Exception: exit(1) auth_region = globals()['auth_region'] @@ -346,7 +346,7 @@ def run(args): tracking_id = args.tracking_id if args.tracking_id else None headers = { 'content-type': 'application/json', - 'X-Auth-Token': auth_token, + 'X-Auth-Token': auth_key, 'X-Auth-Region': auth_region, 'X-RANGER-Requester': requester, 'X-RANGER-Client': client, @@ -354,21 +354,20 @@ def run(args): } if args.verbose: - print( + print(( "Sending API:\ntimeout: %d\ndata: %s\nheaders: %s\ncmd: %s\nurl:" " %s\n" % ( - timeout, data, headers, rest_cmd.__name__, url)) + timeout, data, headers, rest_cmd.__name__, url))) try: resp = rest_cmd(url, timeout=timeout, data=data, headers=headers, verify=config.verify) except Exception as e: - print e + print(e) exit(1) - if not 200 <= resp.status_code < 300: content = resp.content - print 'API error: %s %s (Reason: %d)\n%s' % ( - rest_cmd.func_name.upper(), url, resp.status_code, content) + print('API error: %s %s (Reason: %d)\n%s' % ( + rest_cmd.__name__.upper(), url, resp.status_code, content)) exit(1) if resp.status_code == 204: # no content @@ -376,6 +375,6 @@ def run(args): rj = resp.json() if rj == 'Not found': - print 'No output was found' + print('No output was found') else: cli_common.pretty_print_json(rj) diff --git a/orm/orm_client/ormcli/imscli.py b/orm/orm_client/ormcli/imscli.py index 0292e864..4b37357c 100644 --- a/orm/orm_client/ormcli/imscli.py +++ b/orm/orm_client/ormcli/imscli.py @@ -1,10 +1,9 @@ -#!/usr/bin/python import argparse -import config import orm.base_config as base_config import os import requests +from . import config from orm.orm_client.ormcli import cli_common @@ -201,7 +200,7 @@ def validate_args(args): message = ('ERROR: {} for token generation was not supplied. ' 'Please use its command-line argument or ' 'environment variable.'.format(argument)) - print message + print(message) raise cli_common.MissingArgumentError(message) @@ -285,11 +284,11 @@ def run(args): rest_cmd, cmd_url = cmd_details(args) url = '%s/v1/orm/images' % (host) + cmd_url if args.faceless: - auth_token = auth_region = requester = client = '' + auth_key = auth_region = requester = client = '' else: try: validate_args(args) - auth_token = cli_common.get_token(timeout, args) + auth_key = cli_common.get_token(timeout, args) except Exception: exit(1) auth_region = globals()['auth_region'] @@ -299,7 +298,7 @@ def run(args): tracking_id = args.tracking_id if args.tracking_id else None headers = { 'content-type': 'application/json', - 'X-Auth-Token': auth_token, + 'X-Auth-Token': auth_key, 'X-Auth-Region': auth_region, 'X-RANGER-Requester': requester, 'X-RANGER-Client': client, @@ -307,26 +306,26 @@ def run(args): } if args.verbose: - print("Sending API:\ntimeout: %d\ndata: %s\n" + print(("Sending API:\ntimeout: %d\ndata: %s\n" "headers: %s\ncmd: %s\nurl: %s\n" % (timeout, data, headers, rest_cmd.__name__, - url)) + url))) try: resp = rest_cmd(url, timeout=timeout, data=data, headers=headers, verify=config.verify) except Exception as e: - print e + print(e) exit(1) if not 200 <= resp.status_code < 300: content = resp.content - print 'API error: %s %s (Reason: %d)\n%s' % ( - rest_cmd.func_name.upper(), + print('API error: %s %s (Reason: %d)\n%s' % ( + rest_cmd.__name__.upper(), url, resp.status_code, - content) + content)) exit(1) if resp.status_code == 204: # no content @@ -334,6 +333,6 @@ def run(args): rj = resp.json() if rj == 'Not found': - print 'No output was found' + print('No output was found') else: cli_common.pretty_print_json(rj) diff --git a/orm/orm_client/ormcli/orm b/orm/orm_client/ormcli/orm index 67087452..45193ba8 100755 --- a/orm/orm_client/ormcli/orm +++ b/orm/orm_client/ormcli/orm @@ -1,5 +1,4 @@ -#!/usr/bin/env python - +#! /usr/bin/python3 import sys import ormcli diff --git a/orm/orm_client/ormcli/ormcli.py b/orm/orm_client/ormcli/ormcli.py index 3bd7bb3f..006ef841 100644 --- a/orm/orm_client/ormcli/ormcli.py +++ b/orm/orm_client/ormcli/ormcli.py @@ -1,4 +1,3 @@ -#!/usr/bin/python import argparse from orm.orm_client.ormcli import cmscli from orm.orm_client.ormcli import fmscli @@ -15,7 +14,7 @@ class Cli: metavar='') self.submod = {'cms': cmscli, 'fms': fmscli, 'ims': imscli, 'rms': rmscli} - for s in self.submod.values(): + for s in list(self.submod.values()): s.add_to_parser(service_sub) def parse(self, argv=sys.argv): @@ -23,7 +22,11 @@ class Cli: self.args = self.parser.parse_args() def logic(self): - self.submod[self.args.service].run(self.args) + if self.args.service: + self.submod[self.args.service].run(self.args) + else: + sys.stderr.write('too few arguments') + sys.exit(2) def main(argv): diff --git a/orm/orm_client/ormcli/requirements.txt b/orm/orm_client/ormcli/requirements.txt deleted file mode 100644 index c4c35538..00000000 --- a/orm/orm_client/ormcli/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -requests -argparse diff --git a/orm/orm_client/ormcli/rmscli.py b/orm/orm_client/ormcli/rmscli.py index 8587a6a5..ba6abb8b 100644 --- a/orm/orm_client/ormcli/rmscli.py +++ b/orm/orm_client/ormcli/rmscli.py @@ -1,11 +1,11 @@ -#!/usr/bin/python import argparse -import cli_common -import config import orm.base_config as base_config import os import requests +from . import cli_common +from . import config + class ResponseError(Exception): pass @@ -223,7 +223,7 @@ def validate_args(args): message = ('ERROR: {} for token generation was not supplied. ' 'Please use its command-line argument or ' 'environment variable.'.format(argument)) - print message + print(message) raise cli_common.MissingArgumentError(message) @@ -321,11 +321,11 @@ def run(args): rest_cmd, cmd_url = cmd_details(args) url = '%s/%s' % (rms_base_url, url_path) + cmd_url if args.faceless: - auth_token = auth_region = requester = client = '' + auth_key = auth_region = requester = client = '' else: try: validate_args(args) - auth_token = cli_common.get_token(timeout, args) + auth_key = cli_common.get_token(timeout, args) except Exception: exit(1) auth_region = globals()['auth_region'] @@ -337,8 +337,8 @@ def run(args): if args.use_version == 1: url = '%s:%d/lcp' % (host, port) + cmd_url elif args.use_version is not None and args.use_version != 2: - print 'API error: use_version argument - invalid value, ' \ - 'allowed values: 1 or 2' + print('API error: use_version argument - invalid value, ' + 'allowed values: 1 or 2') exit(1) if args.subcmd == "update_status": @@ -347,33 +347,33 @@ def run(args): tracking_id = args.tracking_id if args.tracking_id else None headers = { 'content-type': 'application/json', - 'X-Auth-Token': auth_token, + 'X-Auth-Token': auth_key, 'X-Auth-Region': auth_region, 'X-RANGER-Requester': requester, 'X-RANGER-Client': client, 'X-RANGER-Tracking-Id': tracking_id } if args.verbose: - print("Sending API:\ntimeout: %d\ndata: %s\n" + print(("Sending API:\ntimeout: %d\ndata: %s\n" "headers: %s\ncmd: %s\nurl: %s\n" % (timeout, data, headers, rest_cmd.__name__, - url)) + url))) try: resp = rest_cmd(url, data=data, timeout=timeout, headers=headers, verify=config.verify) except Exception as e: - print e + print(str(e)) exit(1) if not 200 <= resp.status_code < 300: content = resp.content - print 'API error: %s %s (Reason: %d)\n%s' % ( - rest_cmd.func_name.upper(), + print('API error: %s %s (Reason: %d)\n%s' % ( + rest_cmd.__name__.upper(), url, resp.status_code, - content) + content)) exit(1) if resp.status_code == 204: # no content @@ -382,6 +382,6 @@ def run(args): rj = resp.json() if rj == 'Not found': - print 'No output was found' + print('No output was found') else: cli_common.pretty_print_json(rj) diff --git a/orm/orm_client/requirements.txt b/orm/orm_client/requirements.txt deleted file mode 100644 index 86147add..00000000 --- a/orm/orm_client/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -pecan==1.0.2 -requests==2.2.1 diff --git a/orm/services/audit_trail_manager/audit_server/controllers/v1/transaction.py b/orm/services/audit_trail_manager/audit_server/controllers/v1/transaction.py index 11718acb..bc4007d3 100755 --- a/orm/services/audit_trail_manager/audit_server/controllers/v1/transaction.py +++ b/orm/services/audit_trail_manager/audit_server/controllers/v1/transaction.py @@ -1,6 +1,6 @@ """transaction controller module.""" -import base +from . import base import logging import wsme @@ -17,7 +17,7 @@ logger = logging.getLogger(__name__) class Transaction(base.Base): """transaction type.""" - timestamp = wsme.wsattr(long, mandatory=True) + timestamp = wsme.wsattr(int, mandatory=True) user_id = wsme.wsattr(wtypes.text, mandatory=False, default=None) application_id = wsme.wsattr(wtypes.text, mandatory=True) tracking_id = wsme.wsattr(wtypes.text, mandatory=True) @@ -72,8 +72,8 @@ class Transaction(base.Base): class Query(base.Base): """query type.""" - timestamp_from = wsme.wsattr(long, mandatory=False, default=None) - timestamp_to = wsme.wsattr(long, mandatory=False, default=None) + timestamp_from = wsme.wsattr(int, mandatory=False, default=None) + timestamp_to = wsme.wsattr(int, mandatory=False, default=None) user_id = wsme.wsattr(wtypes.text, mandatory=False, default=None) application_id = wsme.wsattr(wtypes.text, mandatory=False, default=None) tracking_id = wsme.wsattr(wtypes.text, mandatory=False, default=None) diff --git a/orm/services/audit_trail_manager/audit_server/storage/mysql/transaction.py b/orm/services/audit_trail_manager/audit_server/storage/mysql/transaction.py index 49790901..a9c8c84c 100755 --- a/orm/services/audit_trail_manager/audit_server/storage/mysql/transaction.py +++ b/orm/services/audit_trail_manager/audit_server/storage/mysql/transaction.py @@ -5,7 +5,6 @@ import logging from orm.services.audit_trail_manager.audit_server.model.transaction import Model from orm.services.audit_trail_manager.audit_server.storage import transaction from sqlalchemy import BigInteger, Column, Integer, Text, asc, create_engine -from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.declarative.api import declarative_base from sqlalchemy.orm import sessionmaker @@ -64,11 +63,11 @@ class Connection(transaction.Base): service_name=transaction_record.service_name)) session.commit() # All other exceptions will be raised - except IntegrityError as e: + except Exception as e: # Except Exception as e: session.rollback() # Raise the exception only if it's not a duplicate entry exception - if 'duplicate entry' in e.message.lower(): + if 'duplicate entry' in str(e).lower(): logger.warning( "Fail to audit record - Duplicate entry: {}".format( e)) diff --git a/orm/services/audit_trail_manager/tox.ini b/orm/services/audit_trail_manager/tox.ini deleted file mode 100644 index 0fe24ecf..00000000 --- a/orm/services/audit_trail_manager/tox.ini +++ /dev/null @@ -1,19 +0,0 @@ -[tox] -#envlist = py27, cover -envlist = py27, cover, pep8 - -[testenv] -setenv= PYTHONPATH={toxinidir}:{toxinidir}/audit_server/external_mock/ -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -install_command = pip install -U {opts} {packages} - -commands = python setup.py testr - -[testenv:cover] -commands = python setup.py testr --slowest --coverage - coverage report --omit=audit_server/tests/* - -[testenv:pep8] -#commands = flake8 --ignore=D100,D101,D102,D103,D104,D105 -commands = flake8 diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/metadata.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/metadata.py index 27209a8f..de89988b 100755 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/metadata.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/metadata.py @@ -17,7 +17,7 @@ class MetadataController(rest.RestController): def check_metadata_values(self, metadata): cust_metadata = CustomerMetadata() - for key, value in metadata.metadata.iteritems(): + for key, value in metadata.metadata.items(): cust_metadata.validate_metadata(key, value) @wsexpose(CustomerResultWrapper, str, body=MetadataWrapper, rest_content_types='json') @@ -34,10 +34,10 @@ class MetadataController(rest.RestController): return res except AttributeError as ex: raise err_utils.get_error(request.transaction_id, - message=ex.message, status_code=409) + message=str(ex), status_code=409) except ValueError as ex: raise err_utils.get_error(request.transaction_id, - message=ex.message, status_code=404) + message=str(ex), status_code=404) except ErrorStatus as ex: LOG.log_exception("MetaDataController - Failed to add metadata", ex) @@ -48,7 +48,7 @@ class MetadataController(rest.RestController): except LookupError as ex: LOG.log_exception("MetaDataController - {0}".format(ex.message), ex) raise err_utils.get_error(request.transaction_id, - message=ex.message, status_code=400) + message=str(ex), status_code=400) except Exception as ex: LOG.log_exception("MetaDataController - Failed to add metadata", ex) raise err_utils.get_error(request.transaction_id, @@ -69,10 +69,10 @@ class MetadataController(rest.RestController): return res except AttributeError as ex: raise err_utils.get_error(request.transaction_id, - message=ex.message, status_code=400) + message=str(ex), status_code=400) except ValueError as ex: raise err_utils.get_error(request.transaction_id, - message=ex.message, status_code=404) + message=str(ex), status_code=404) except ErrorStatus as ex: LOG.log_exception("MetaDataController - Failed to add metadata", ex) raise err_utils.get_error(request.transaction_id, @@ -81,7 +81,7 @@ class MetadataController(rest.RestController): except LookupError as ex: LOG.log_exception("MetaDataController - {0}".format(ex.message), ex) raise err_utils.get_error(request.transaction_id, - message=ex.message, status_code=400) + message=str(ex), status_code=400) except Exception as ex: LOG.log_exception("MetaDataController - Failed to add metadata", ex) raise err_utils.get_error(request.transaction_id, diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/regions.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/regions.py index 6e4cd7a8..b7f22006 100755 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/regions.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/regions.py @@ -113,7 +113,7 @@ class RegionController(rest.RestController): except ValueError as exception: raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=404) except ErrorStatus as exception: LOG.log_exception("CustomerController - Failed to delete region", exception) diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/root.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/root.py index 3027eb84..643697a7 100755 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/root.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/customer/root.py @@ -1,5 +1,4 @@ from pecan import rest, request, response -import oslo_db from wsmeext.pecan import wsexpose from orm.common.orm_common.utils import api_error_utils as err_utils @@ -39,10 +38,10 @@ class CustomerController(rest.RestController): status_code=exception.status_code) except Exception as exception: - LOG.log_exception("CustomerController - Failed to GetCustomerDetails", exception) + LOG.log_exception("CustomerController - Failed to GetCustomerDetails", str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) return result @@ -63,9 +62,8 @@ class CustomerController(rest.RestController): try: result = customer_logic.create_customer(customer, uuid, request.transaction_id) - except oslo_db.exception.DBDuplicateEntry as exception: - raise ErrorStatus(409.2, 'Customer field {0} already exists'.format(exception.columns)) - + except Exception as exception: + raise ErrorStatus(409.2, 'Customer already exists.Error:{0}'.format(str(exception))) LOG.info("CustomerController - Customer Created: " + str(result)) event_details = 'Customer {} {} created in regions: {}, with users: {}'.format( uuid, customer.name, [r.name for r in customer.regions], @@ -78,14 +76,13 @@ class CustomerController(rest.RestController): except ErrorStatus as exception: LOG.log_exception("CustomerController - Failed to CreateCustomer", exception) raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=exception.status_code) - except Exception as exception: - LOG.log_exception("CustomerController - Failed to CreateCustomer", exception) + LOG.log_exception("CustomerController - Failed to CreateCustomer", str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @wsexpose(CustomerResultWrapper, str, body=Customer, rest_content_types='json', status_code=200) def put(self, customer_id, customer): diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/region_users.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/region_users.py index 40f53c13..923638ce 100644 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/region_users.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/region_users.py @@ -47,7 +47,7 @@ class RegionUserController(rest.RestController): except DBDuplicateEntry as exception: LOG.log_exception( "DBDuplicateEntry - Group users already assigned.", exception) - print exception.message + print(exception.message) raise err_utils.get_error( request.transaction_id, status_code=409, @@ -96,7 +96,7 @@ class RegionUserController(rest.RestController): except ValueError as exception: raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=404) except ErrorStatus as exception: LOG.log_exception("ErrorStatus - Failed to delete user from group", diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/regions.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/regions.py index 01fa91e5..5fbf0d95 100644 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/regions.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/regions.py @@ -103,7 +103,7 @@ class RegionController(rest.RestController): except ValueError as exception: raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=404) except ErrorStatus as exception: LOG.log_exception("RegionController - Failed to delete region", diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/roles.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/roles.py index 7e330811..26d064d0 100644 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/roles.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/roles.py @@ -94,7 +94,7 @@ class RoleController(rest.RestController): except ValueError as exception: raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=404) except ErrorStatus as exception: LOG.log_exception("ErrorStatus - Failed to unassign roles", diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/users.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/users.py index e18bb41c..975eef5a 100644 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/users.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/group/users.py @@ -45,7 +45,7 @@ class UserController(rest.RestController): except DBDuplicateEntry as exception: LOG.log_exception( "DBDuplicateEntry - Group users already assigned.", exception) - print exception.message + print(exception.message) raise err_utils.get_error( request.transaction_id, status_code=409, @@ -92,7 +92,7 @@ class UserController(rest.RestController): except ValueError as exception: raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=404) except ErrorStatus as exception: LOG.log_exception("ErrorStatus - Failed to delete user from group", diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/orm/root.py b/orm/services/customer_manager/cms_rest/controllers/v1/orm/root.py index 9328e615..f1fe0ab9 100755 --- a/orm/services/customer_manager/cms_rest/controllers/v1/orm/root.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/orm/root.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from ..orm.configuration import ConfigurationController from ..orm.customer.root import CustomerController diff --git a/orm/services/customer_manager/cms_rest/controllers/v1/root.py b/orm/services/customer_manager/cms_rest/controllers/v1/root.py index 4d25741d..0ea17ea8 100644 --- a/orm/services/customer_manager/cms_rest/controllers/v1/root.py +++ b/orm/services/customer_manager/cms_rest/controllers/v1/root.py @@ -1,4 +1,4 @@ -from orm.root import OrmController +from .orm.root import OrmController from pecan.rest import RestController diff --git a/orm/services/customer_manager/cms_rest/data/data_manager.py b/orm/services/customer_manager/cms_rest/data/data_manager.py index f787b3fb..9be48947 100755 --- a/orm/services/customer_manager/cms_rest/data/data_manager.py +++ b/orm/services/customer_manager/cms_rest/data/data_manager.py @@ -25,7 +25,7 @@ from orm.services.customer_manager.cms_rest.data.sql_alchemy.models \ from orm.services.customer_manager.cms_rest.data.sql_alchemy.user_role_record \ import UserRoleRecord from orm.services.customer_manager.cms_rest.logic.error_base import ErrorStatus -from oslo_db.sqlalchemy import session as db_session +from oslo_db.sqlalchemy.enginefacade import LegacyEngineFacade from pecan import conf from sqlalchemy.event import listen from sqlalchemy import or_ @@ -35,7 +35,7 @@ LOG = logging.getLogger(__name__) # event handling def on_before_flush(session, flush_context, instances): - print("on_before_flush:", str(flush_context)) + print(("on_before_flush:", str(flush_context))) for model in session.new: if hasattr(model, "validate"): model.validate("new") @@ -52,8 +52,7 @@ class DataManager(object): if not connection_string: connection_string = conf.database.connection_string - self._engine_facade = db_session.EngineFacade(connection_string, - autocommit=False) + self._engine_facade = LegacyEngineFacade(connection_string, autocommit=False) self._session = None listen(self.session, 'before_flush', on_before_flush) self.image_record = None @@ -230,8 +229,8 @@ class DataManager(object): # FIXME: next line assumes that only one quota of each type is # available and thus quota_by_type[0] is used - for field_key, field_value in DataManager.get_dict_from_quota( - quota_by_type[0], quota_type).items(): + for field_key, field_value in list(DataManager.get_dict_from_quota( + quota_by_type[0], quota_type).items()): sql_quota_field_detail = QuotaFieldDetail( quota_id=sql_quota.id, field_key=field_key, diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py index fe2e7d60..6cb6d555 100755 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_record.py @@ -1,4 +1,4 @@ -from __builtin__ import int +from builtins import int from sqlalchemy import func @@ -83,7 +83,7 @@ class CustomerRecord: if results: resource_status_dict = dict((id, (resource_id, region, status)) for id, resource_id, region, status in results) # using resource_status_dict, create cust_region_dict with resource_id as key and (region, status) as value - for v in resource_status_dict.values(): + for v in list(resource_status_dict.values()): if v[0] in cust_region_dict: cust_region_dict[v[0]].append(v[1:]) else: diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_region_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_region_record.py index c3573107..2ddb39c7 100755 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_region_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/customer_region_record.py @@ -57,7 +57,7 @@ class CustomerRegionRecord: def delete_region_for_customer(self, customer_id, region_name): # customer_id can be a uuid (type of string) or id (type of int) # if customer_id is uuid I get id from uuid and use the id in the next sql command - if isinstance(customer_id, basestring): + if isinstance(customer_id, str): customer_record = CustomerRecord(self.session) customer_id = customer_record.get_customer_id_from_uuid(customer_id) # get region id by the name I got (region_name) @@ -81,7 +81,7 @@ class CustomerRegionRecord: def delete_all_regions_for_customer(self, customer_id): # not including default region which is -1 # customer_id can be a uuid (type of string) or id (type of int) # if customer_id is uuid I get id from uuid and use the id in the next sql command - if isinstance(customer_id, basestring): + if isinstance(customer_id, str): customer_record = CustomerRecord(self.session) customer_id = customer_record.get_customer_id_from_uuid(customer_id) diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/group_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/group_record.py index 6cdfcda6..41de1710 100755 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/group_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/group_record.py @@ -1,4 +1,4 @@ -from __builtin__ import int +from builtins import int from orm.services.customer_manager.cms_rest.data.sql_alchemy.models import ( Groups, @@ -89,7 +89,7 @@ class GroupRecord: for id, resource_id, region, status in results) # using resource_status, create group_region with resource_id # as key and (region, status) as value - for v in resource_status.values(): + for v in list(resource_status.values()): if v[0] in group_region: group_region[v[0]].append(v[1:]) else: diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_customer_role_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_customer_role_record.py index 77d22b7a..0e40e9ac 100644 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_customer_role_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_customer_role_record.py @@ -138,7 +138,7 @@ class GroupsCustomerRoleRecord: # group_id can be a uuid (type of string) or id (type of int). # If group_id is uuid, then get id from uuid and use the id in the # next sql command - if isinstance(group_id, basestring): + if isinstance(group_id, str): group_record = GroupRecord(self.session) group_id = group_record.get_group_id_from_uuid(group_id) diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_domain_role_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_domain_role_record.py index 8a28c674..cf9973f8 100644 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_domain_role_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_domain_role_record.py @@ -137,7 +137,7 @@ class GroupsDomainRoleRecord: # group_id can be a uuid (type of string) or id (type of int). # If group_id is uuid, then get id from uuid and use the id in the # next sql command - if isinstance(group_id, basestring): + if isinstance(group_id, str): group_record = GroupRecord(self.session) group_id = group_record.get_group_id_from_uuid(group_id) diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_region_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_region_record.py index 433e8890..63c84a93 100755 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_region_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_region_record.py @@ -106,7 +106,7 @@ class GroupsRegionRecord: # group_id can be a uuid (type of string) or id (type of int). # If group_id is uuid, then get id from uuid and use the id in the # next sql command - if isinstance(group_id, basestring): + if isinstance(group_id, str): group_record = GroupRecord(self.session) group_id = group_record.get_group_id_from_uuid(group_id) diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_role_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_role_record.py index dbfb9276..46bdbfe7 100644 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_role_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_role_record.py @@ -88,7 +88,7 @@ class GroupsRoleRecord: # group_id can be a uuid (type of string) or id (type of int). # If group_id is uuid, then get id from uuid and use the id in the # next sql command - if isinstance(group_id, basestring): + if isinstance(group_id, str): group_record = GroupRecord(self.session) group_id = group_record.get_group_id_from_uuid(group_id) diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_user_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_user_record.py index b1241e02..02fa5922 100644 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_user_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/groups_user_record.py @@ -101,7 +101,7 @@ class GroupsUserRecord: # Check if 'region_id' is a string - if so, get corresponding # cms_region id value for use later to query/delete the # corresponding group user record - if isinstance(region_id, basestring): + if isinstance(region_id, str): region_query = region_id region_record = RegionRecord(self.session) region_id = region_record.get_region_id_from_name(region_id) diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/models.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/models.py index d00f6c2d..f8a54a89 100755 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/models.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/models.py @@ -149,11 +149,11 @@ class Groups(Base, CMSBaseModel): # Set up output using customer and domain dict roles = [] - for customer_uuid, customer_roles in unique_customer_roles.items(): + for customer_uuid, customer_roles in list(unique_customer_roles.items()): roles.append( GroupWsmeModels.RoleAssignment(roles=customer_roles, customer=customer_uuid)) - for domain_name, domain_roles in unique_domain_roles.items(): + for domain_name, domain_roles in list(unique_domain_roles.items()): roles.append(GroupWsmeModels.RoleAssignment(roles=domain_roles, domain=domain_name)) @@ -166,7 +166,7 @@ class Groups(Base, CMSBaseModel): else: unique_domain[user.domain_name] = [user.user.name] - for domain, domain_user in unique_domain.items(): + for domain, domain_user in list(unique_domain.items()): users.append(GroupWsmeModels.User(id=domain_user, domain=domain)) @@ -260,7 +260,7 @@ class GroupsRegion(Base, CMSBaseModel): else: unique_domain[user.domain_name] = [user.user.name] - for domain, domain_user in unique_domain.items(): + for domain, domain_user in list(unique_domain.items()): users.append(GroupWsmeModels.User(id=domain_user, domain=domain)) @@ -676,7 +676,7 @@ class CustomerRegion(Base, CMSBaseModel): quotas = {} # The WSME can't handle existing data and shows empty values for unset new quotas - for class_name, class_value in WsmeModels.__dict__.iteritems(): + for class_name, class_value in WsmeModels.__dict__.items(): if str(class_name) in "Network, Storage, Compute": quotas[str(class_name).lower()] = {} for field_key in dir(class_value): diff --git a/orm/services/customer_manager/cms_rest/data/sql_alchemy/user_role_record.py b/orm/services/customer_manager/cms_rest/data/sql_alchemy/user_role_record.py index 621b224d..424f00be 100755 --- a/orm/services/customer_manager/cms_rest/data/sql_alchemy/user_role_record.py +++ b/orm/services/customer_manager/cms_rest/data/sql_alchemy/user_role_record.py @@ -43,18 +43,18 @@ class UserRoleRecord: def delete_user_from_region(self, customer_id, region_id, user_id): # customer_id can be a uuid (type of string) or id (type of int) # if customer_id is uuid I get id from uuid and use the id in the next sql command - if isinstance(customer_id, basestring): + if isinstance(customer_id, str): customer_record = CustomerRecord(self.session) customer_id = customer_record.get_customer_id_from_uuid(customer_id) - if isinstance(region_id, basestring): + if isinstance(region_id, str): region_query = region_id region_record = RegionRecord(self.session) region_id = region_record.get_region_id_from_name(region_id) if region_id is None: raise NotFound("region {} ".format(region_query)) - if isinstance(user_id, basestring): + if isinstance(user_id, str): user_query = user_id cms_user_record = CmsUserRecord(self.session) user_id = cms_user_record.get_cms_user_id_from_name(user_id) @@ -93,11 +93,11 @@ class UserRoleRecord: def delete_all_users_from_region(self, customer_id, region_id): # customer_id can be a uuid (type of string) or id (type of int) # if customer_id is uuid I get id from uuid and use the id in the next sql command - if isinstance(customer_id, basestring): + if isinstance(customer_id, str): customer_record = CustomerRecord(self.session) customer_id = customer_record.get_customer_id_from_uuid(customer_id) - if isinstance(region_id, basestring): + if isinstance(region_id, str): region_record = RegionRecord(self.session) region_id = region_record.get_region_id_from_name(region_id) if region_id == -1: @@ -114,5 +114,5 @@ class UserRoleRecord: result = self.session.connection().execute(delete_query) - print "num records deleted: " + str(result.rowcount) + print("num records deleted: " + str(result.rowcount)) return result diff --git a/orm/services/customer_manager/cms_rest/logic/customer_logic.py b/orm/services/customer_manager/cms_rest/logic/customer_logic.py index 51c1135a..ba848d77 100755 --- a/orm/services/customer_manager/cms_rest/logic/customer_logic.py +++ b/orm/services/customer_manager/cms_rest/logic/customer_logic.py @@ -41,7 +41,7 @@ class CustomerLogic(object): datamanager.rollback() raise - for key, value in customer.metadata.iteritems(): + for key, value in customer.metadata.items(): cust_metadata.validate_metadata(key, value) metadata = CustomerMetadata(field_key=key, field_value=value) sql_customer.customer_metadata.append(metadata) @@ -97,7 +97,7 @@ class CustomerLogic(object): for sql_user in existing_default_users_roles: default_users_dic[sql_user.name] = sql_user for user in default_users_requested: - is_default_user_exist = user.id in default_users_dic.keys() + is_default_user_exist = user.id in list(default_users_dic.keys()) if not is_default_user_exist: sql_user = datamanager.add_user(user.id) default_region_users.append(sql_user) @@ -138,7 +138,7 @@ class CustomerLogic(object): # Default user will be given priority over region user for user in users: - is_default_user_in_region = user.id in default_users_dic.keys() + is_default_user_in_region = user.id in list(default_users_dic.keys()) if not is_default_user_in_region: sql_user = datamanager.add_user(user.id) for role in user.role: @@ -284,8 +284,8 @@ class CustomerLogic(object): return user_result_wrapper except Exception as exception: - if 'Duplicate' in exception.message: - raise ErrorStatus(409, exception.message) + if 'Duplicate' in str(exception): + raise ErrorStatus(409, str(exception)) datamanager.rollback() LOG.log_exception("Failed to add_users", exception) raise exception @@ -413,8 +413,8 @@ class CustomerLogic(object): except Exception as exception: datamanager.rollback() - if 'Duplicate' in exception.message: - raise ErrorStatus(409, exception.message) + if 'Duplicate' in str(exception): + raise ErrorStatus(409, str(exception)) LOG.log_exception("Failed to add_default_users", exception) raise @@ -758,7 +758,7 @@ class CustomerLogic(object): resp = RdsProxy.get_status(sql_customer.uuid) if resp.status_code == 200: status_resp = resp.json() - if 'status' in status_resp.keys(): + if 'status' in list(status_resp.keys()): LOG.debug( 'RDS returned status: {}'.format( status_resp['status'])) diff --git a/orm/services/customer_manager/cms_rest/logic/group_logic.py b/orm/services/customer_manager/cms_rest/logic/group_logic.py index 9004e670..362d6572 100755 --- a/orm/services/customer_manager/cms_rest/logic/group_logic.py +++ b/orm/services/customer_manager/cms_rest/logic/group_logic.py @@ -286,8 +286,8 @@ class GroupLogic(object): except Exception as exception: datamanager.rollback() - if 'Duplicate' in exception.message: - raise ErrorStatus(409, exception.message) + if 'Duplicate' in str(exception): + raise ErrorStatus(409, str(exception)) LOG.log_exception("Failed to add_group_default_users", exception) raise @@ -357,8 +357,8 @@ class GroupLogic(object): except Exception as exception: datamanager.rollback() - if 'Duplicate' in exception.message: - raise ErrorStatus(409, exception.message) + if 'Duplicate' in str(exception): + raise ErrorStatus(409, str(exception)) LOG.log_exception("Failed to add_group_region_users", exception) raise @@ -756,7 +756,7 @@ class GroupLogic(object): uuids = [sql_group.uuid for sql_group in sql_groups if sql_group and sql_group.uuid] - sql_in = ', '.join(list(map(lambda arg: "'%s'" % arg, uuids))) + sql_in = ', '.join(list(["'%s'" % arg for arg in uuids])) resource_status = group_record.get_groups_status_by_uuids(sql_in) for sql_group in sql_groups: @@ -822,7 +822,7 @@ class GroupLogic(object): unique_customer[customer.customer.uuid] = [ customer.groups_role.role.name] - for customer, role_list in unique_customer.items(): + for customer, role_list in list(unique_customer.items()): role_result.append( RoleResult(roles=role_list, customer=customer)) @@ -835,7 +835,7 @@ class GroupLogic(object): unique_domain[domain.domain_name] = [ domain.groups_role.role.name] - for domain, role_list in unique_domain.items(): + for domain, role_list in list(unique_domain.items()): role_result.append(RoleResult(roles=role_list, domain=domain)) return role_result @@ -885,7 +885,7 @@ class GroupLogic(object): resp = RdsProxy.get_status(sql_group.uuid) if resp.status_code == 200: status_resp = resp.json() - if 'status' in status_resp.keys(): + if 'status' in list(status_resp.keys()): LOG.debug('RDS returned status: {}'.format( status_resp['status'])) status = status_resp['status'] diff --git a/orm/services/customer_manager/cms_rest/logic/metadata_logic.py b/orm/services/customer_manager/cms_rest/logic/metadata_logic.py index 7feef53d..89204b91 100755 --- a/orm/services/customer_manager/cms_rest/logic/metadata_logic.py +++ b/orm/services/customer_manager/cms_rest/logic/metadata_logic.py @@ -82,7 +82,7 @@ def update_customer_metadata(customer_uuid, metadata_wrapper, transaction_id): def map_metadata(customer_id, metadata_wrapper): sql_metadata_collection = [] - for key, value in metadata_wrapper.metadata.iteritems(): + for key, value in metadata_wrapper.metadata.items(): sql_metadata = CustomerMetadata() sql_metadata.customer_id = customer_id sql_metadata.field_key = key diff --git a/orm/services/customer_manager/tox.ini b/orm/services/customer_manager/tox.ini deleted file mode 100755 index 4f3fc0e5..00000000 --- a/orm/services/customer_manager/tox.ini +++ /dev/null @@ -1,19 +0,0 @@ -[tox] -envlist=py27, pep8, cover - -[testenv] -setenv= CMS_ENV=mock - PYTHONPATH={toxinidir}:{toxinidir}/cms_rest/extenal_mock/ -deps= -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:pep8] -commands = - py.test --pep8 -m pep8 - -[testenv:cover] -commands= - coverage run setup.py test - coverage report - coverage html -#commands={envpython} setup.py test -v {posargs} diff --git a/orm/services/db_setup.py b/orm/services/db_setup.py index ecec9b46..4c3c6224 100644 --- a/orm/services/db_setup.py +++ b/orm/services/db_setup.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # Copyright (c) 2012 OpenStack Foundation # All Rights Reserved. # @@ -14,7 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. -from ConfigParser import ConfigParser +from configparser import ConfigParser from oslo_config import cfg import re from sqlalchemy import * diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/configuration.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/configuration.py index e97be2b8..b8b4cdda 100755 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/configuration.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/configuration.py @@ -1,5 +1,5 @@ """Configuration rest API input module.""" -from __future__ import absolute_import + import logging from orm.common.orm_common.utils import utils diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/flavors.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/flavors.py index 74b45cb2..ee191c36 100755 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/flavors.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/flavors.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from orm.common.orm_common.injector import injector from orm.common.orm_common.utils import api_error_utils as err_utils diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/os_extra_specs.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/os_extra_specs.py index c86f7ee7..08658849 100755 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/os_extra_specs.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/os_extra_specs.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from orm.common.orm_common.injector import injector from orm.common.orm_common.utils import api_error_utils as err_utils diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/regions.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/regions.py index 15dd2f98..c8d9537f 100755 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/regions.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/regions.py @@ -1,6 +1,3 @@ -from __future__ import absolute_import - - from orm.common.orm_common.injector import injector from orm.common.orm_common.utils import api_error_utils as err_utils from orm.services.flavor_manager.fms_rest.data.wsme.models import RegionWrapper diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tags.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tags.py index c4a9d1bf..a9c48f68 100644 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tags.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/flavors/tags.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from orm.common.orm_common.injector import injector from orm.common.orm_common.utils import api_error_utils as err_utils diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/logs.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/logs.py index e8d7b1bb..e56ee395 100644 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/logs.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/logs.py @@ -39,7 +39,7 @@ class LogsController(rest.RestController): logger.info("Changing log level to [{}]".format(level)) try: - log_level = logging._levelNames.get(level.upper()) + log_level = logging._nameToLevel.get(level.upper()) if log_level is not None: self._change_log_level(log_level) result = "Log level changed to {}.".format(level) @@ -49,7 +49,7 @@ class LogsController(rest.RestController): "The given log level [{}] doesn't exist.".format(level)) except Exception as e: result = "Fail to change log_level. Reason: {}".format( - e.message) + str(e)) logger.error(result) return LogChangeResult(result) diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/orm.py b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/orm.py index 1aa0c4fe..d4f4a23c 100644 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/orm/orm.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/orm/orm.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from orm.services.flavor_manager.fms_rest.controllers.v1.orm.configuration import ConfigurationController from orm.services.flavor_manager.fms_rest.controllers.v1.orm.flavors.flavors import FlavorController diff --git a/orm/services/flavor_manager/fms_rest/controllers/v1/v1.py b/orm/services/flavor_manager/fms_rest/controllers/v1/v1.py index 6adb0fe5..87033311 100644 --- a/orm/services/flavor_manager/fms_rest/controllers/v1/v1.py +++ b/orm/services/flavor_manager/fms_rest/controllers/v1/v1.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from orm.services.flavor_manager.fms_rest.controllers.v1.orm.orm import OrmController diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/data_manager.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/data_manager.py index 8265f223..eb9f7892 100755 --- a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/data_manager.py +++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/data_manager.py @@ -1,20 +1,8 @@ - -''' - * This file was generated by ProCG version 2.0 - * - * File name: fms\data\sql_alchemy\data_manager_base.py - * Language: Python - * Database: My Sql - * - * Copyright (c) 2002-2016 iGenXSoft. - * For more information visit http://www.igenxsoft.com -''' - import logging # from orm.services.flavor_manager.fms_rest.logic.error_base import DuplicateEntityError from orm.services.flavor_manager.fms_rest.data.sql_alchemy.flavor.flavor_record import FlavorRecord -from oslo_db.sqlalchemy import session as db_session +from oslo_db.sqlalchemy.enginefacade import LegacyEngineFacade from pecan import conf from sqlalchemy.event import listen @@ -40,7 +28,7 @@ class DataManager(object): connection_string = conf.database.connection_string try: - self._engine_facade = db_session.EngineFacade(connection_string, autocommit=False) + self._engine_facade = LegacyEngineFacade(connection_string, autocommit=False) except Exception: nagios_message = "CRITICAL|CONDB001 - " err_message = "Could not establish database connection" diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/db_models.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/db_models.py index 6a11142a..23349c42 100755 --- a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/db_models.py +++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/db_models.py @@ -1,4 +1,4 @@ -from __builtin__ import reversed +from builtins import reversed from orm.services.flavor_manager.fms_rest.logger import get_logger from orm.services.flavor_manager.fms_rest.logic.error_base import ErrorStatus @@ -147,7 +147,7 @@ class Flavor(Base, FMSBaseModel): def remove_region(self, region_name): region_deleted_flag = False - assert isinstance(region_name, basestring) + assert isinstance(region_name, str) try: LOG.debug("remove regions {0} from flavor {1}".format(region_name, str(self))) @@ -213,7 +213,7 @@ class Flavor(Base, FMSBaseModel): def remove_tag(self, tag_name): deleted_flag = False - assert isinstance(tag_name, basestring) + assert isinstance(tag_name, str) try: LOG.debug("remove tag {0} from flavor {1}".format(tag_name, str(self))) @@ -253,7 +253,7 @@ class Flavor(Base, FMSBaseModel): def remove_tenant(self, tenant_id): deleted_flag = False - assert isinstance(tenant_id, basestring) + assert isinstance(tenant_id, str) try: LOG.debug("remove tenants {0} from flavor {1}".format(tenant_id, str(self))) @@ -302,7 +302,7 @@ class Flavor(Base, FMSBaseModel): def remove_extra_spec(self, extra_spec_key_name): deleted_flag = False - assert isinstance(extra_spec_key_name, basestring) + assert isinstance(extra_spec_key_name, str) try: LOG.debug("remove extra_spec {} from flavor {}".format( extra_spec_key_name, str(self))) @@ -371,7 +371,7 @@ class FlavorExtraSpec(Base, FMSBaseModel): __tablename__ = "flavor_extra_spec" - flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'), + flavor_internal_id = Column(ForeignKey('flavor.internal_id'), primary_key=True) key_name = Column(String, primary_key=True) key_value = Column(String) @@ -406,7 +406,7 @@ class FlavorTag(Base, FMSBaseModel): __tablename__ = "flavor_tag" - flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'), + flavor_internal_id = Column(ForeignKey('flavor.internal_id'), primary_key=True) key_name = Column(String, primary_key=True) key_value = Column(String) @@ -441,7 +441,7 @@ class FlavorOption(Base, FMSBaseModel): __tablename__ = "flavor_option" - flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'), + flavor_internal_id = Column(ForeignKey('flavor.internal_id'), primary_key=True) key_name = Column(String, primary_key=True) key_value = Column(String) @@ -477,7 +477,7 @@ class FlavorRegion(Base, FMSBaseModel): __tablename__ = "flavor_region" - flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'), + flavor_internal_id = Column(ForeignKey('flavor.internal_id'), primary_key=True) region_name = Column(String, primary_key=True) region_type = Column(String) @@ -508,7 +508,7 @@ class FlavorTenant(Base, FMSBaseModel): __tablename__ = "flavor_tenant" - flavor_internal_id = Column(ForeignKey(u'flavor.internal_id'), + flavor_internal_id = Column(ForeignKey('flavor.internal_id'), primary_key=True) tenant_id = Column(String, primary_key=True) diff --git a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py index aef20afd..7cb1c6f5 100755 --- a/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py +++ b/orm/services/flavor_manager/fms_rest/data/sql_alchemy/flavor/flavor_record.py @@ -156,7 +156,7 @@ class FlavorRecord: if results: resource_status_dict = dict((id, (resource_id, region, status)) for id, resource_id, region, status in results) # using resource_status_dict, create flvr_region_dict with resource_id as key and (region, status) as value - for v in resource_status_dict.values(): + for v in list(resource_status_dict.values()): if v[0] in flvr_region_dict: flvr_region_dict[v[0]].append(v[1:]) else: diff --git a/orm/services/flavor_manager/fms_rest/data/wsme/models.py b/orm/services/flavor_manager/fms_rest/data/wsme/models.py index 03f48c3f..53e9a012 100755 --- a/orm/services/flavor_manager/fms_rest/data/wsme/models.py +++ b/orm/services/flavor_manager/fms_rest/data/wsme/models.py @@ -46,7 +46,7 @@ class ExtraSpecsWrapper(Model): def to_db_model(self): extra_spec = [] autogen_es = cfg.CONF.flavor_series_metadata.autogen_extra_specs - for key, value in self.os_extra_specs.iteritems(): + for key, value in self.os_extra_specs.items(): if key in autogen_es: continue extra_spec_rec = db_models.FlavorExtraSpec() @@ -85,7 +85,7 @@ class TagsWrapper(Model): def to_db_model(self): tag = [] - for key, value in self.tags.iteritems(): + for key, value in self.tags.items(): tags_rec = db_models.FlavorTag() tags_rec.key_name = key tags_rec.key_value = value @@ -262,7 +262,7 @@ class Flavor(Model): # flavor option values must be either 'true' or 'false' (in quotes) if self.options: - option_values = self.options.values() + option_values = list(self.options.values()) invalid_opt_vals = [x for x in option_values if (x.lower() not in ['true', 'false'])] if invalid_opt_vals: @@ -271,7 +271,7 @@ class Flavor(Model): # validate series and set flavor vcpu and vram limits requested_numa = [n for n in valid_numa if n in - self.options.keys() and + list(self.options.keys()) and self.options[n].lower() == 'true'] if requested_numa: @@ -300,13 +300,13 @@ class Flavor(Model): raise ErrorStatus(400, "swap must be a number") if self.ephemeral and not self.ephemeral.isdigit(): raise ErrorStatus(400, "ephemeral must be a number") - if int(self.ram) not in range(1024, vram_limit + 1, 1024): + if int(self.ram) not in list(range(1024, vram_limit + 1, 1024)): raise ErrorStatus(400, "ram value is out of range. Expected range" " is 1024(1GB)-%6d(%3dGB) and must be a" " multiple of 1024" % (vram_limit, vram_limit / 1024)) - if int(self.vcpus) not in range(1, vcpu_limit + 1): + if int(self.vcpus) not in list(range(1, vcpu_limit + 1)): raise ErrorStatus(400, "vcpus value is out of range. Expected" "range is 1-%2d" % (vcpu_limit)) if int(self.disk) < 0: @@ -315,13 +315,13 @@ class Flavor(Model): if not self.ephemeral: self.ephemeral = "0" elif (self.ephemeral and - int(self.ephemeral) not in range(0, ephemeral_limit + 1)): + int(self.ephemeral) not in list(range(0, ephemeral_limit + 1))): raise ErrorStatus(400, "ephemeral value is out of range. Expected" " range is 0-%5d(%2dTB)" % (ephemeral_limit, ephemeral_limit / 1000)) - if int(self.swap) not in range(0, swap_file_limit + 1, 1024): + if int(self.swap) not in list(range(0, swap_file_limit + 1, 1024)): raise ErrorStatus(400, "swap value is out of range. Expected" " range is 0-%6d(%3dGB) and must be a" @@ -331,7 +331,7 @@ class Flavor(Model): raise ErrorStatus(400, "ram, vcpus, disk, ephemeral and swap must" " be integers") - for symbol, value in self.extra_specs.iteritems(): + for symbol, value in self.extra_specs.items(): if symbol == 'numa_override' and value not in valid_numa: raise ErrorStatus(400, "Invalid value. numa_override possible" @@ -359,7 +359,7 @@ class Flavor(Model): tenants = [] autogen_es = cfg.CONF.flavor_series_metadata.autogen_extra_specs - for symbol, value in self.extra_specs.iteritems(): + for symbol, value in self.extra_specs.items(): if symbol in autogen_es: continue es = db_models.FlavorExtraSpec() @@ -370,13 +370,13 @@ class Flavor(Model): if self.series: extra_spec.extend(self.get_extra_spec_needed()) - for symbol, value in self.tag.iteritems(): + for symbol, value in self.tag.items(): tag = db_models.FlavorTag() tag.key_name = symbol tag.key_value = value tags.append(tag) - for symbol, value in self.options.iteritems(): + for symbol, value in self.options.items(): option = db_models.FlavorOption() option.key_name = symbol option.key_value = value.lower() @@ -454,7 +454,7 @@ class Flavor(Model): series_metadata = cfg.CONF['flavor_series_metadata'][self.series] # Retreive default extra specs and mixed options for series - for f_key, f_val in series_metadata.items(): + for f_key, f_val in list(series_metadata.items()): if f_key.startswith("es_default_"): es = db_models.FlavorExtraSpec(key_name_value=f_val) extra_spec_needed.append(es) @@ -468,7 +468,7 @@ class Flavor(Model): series_metadata['valid_options_numa'].split(',')] option_numa = [n for n in valid_numa if n in - self.options.keys() and + list(self.options.keys()) and self.options[n].lower() == 'true'] if not option_numa: @@ -487,7 +487,7 @@ class Flavor(Model): series_metadata['valid_options_pci'].split(',')] option_pci = [n for n in valid_pci if n in - self.options.keys() and + list(self.options.keys()) and self.options[n].lower() == 'true'] if option_pci: @@ -499,7 +499,7 @@ class Flavor(Model): series_metadata['valid_options_thread'].split(',')] option_thread = [n for n in valid_thread if n in - self.options.keys() and + list(self.options.keys()) and self.options[n].lower() == 'true' and self.visibility.lower() == 'private'] @@ -511,7 +511,7 @@ class Flavor(Model): # Evalulate mixed options assorted_opts = [] - for mixed_key, mixed_value in mixed_options.items(): + for mixed_key, mixed_value in list(mixed_options.items()): assorted_opts = [z for z in mixed_key.split('_')] mixed_present = True diff --git a/orm/services/flavor_manager/fms_rest/di_providers/prod_providers.py b/orm/services/flavor_manager/fms_rest/di_providers/prod_providers.py index 4db7d640..6ee5c4bb 100644 --- a/orm/services/flavor_manager/fms_rest/di_providers/prod_providers.py +++ b/orm/services/flavor_manager/fms_rest/di_providers/prod_providers.py @@ -1,5 +1,3 @@ -import requests - from orm.common.client.audit.audit_client.api import audit from orm.services.flavor_manager.fms_rest.data.sql_alchemy.data_manager import DataManager from orm.services.flavor_manager.fms_rest.logic import flavor_logic @@ -9,7 +7,6 @@ from orm.services.flavor_manager.fms_rest.utils import utils providers = [ ('rds_proxy', rds_proxy), ('flavor_logic', flavor_logic), - ('requests', requests), ('data_manager', DataManager), ('utils', utils), ('audit_client', audit) diff --git a/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py b/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py index a941239c..8fcbbf8f 100755 --- a/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py +++ b/orm/services/flavor_manager/fms_rest/logic/flavor_logic.py @@ -56,9 +56,9 @@ def create_flavor(flavor, flavor_uuid, transaction_id): except Exception as exp: LOG.log_exception("FlavorLogic - Failed to CreateFlavor", - str(exp.args)) + str(exp)) datamanager.rollback() - if "Duplicate entry" in exp.args: + if "Duplicate entry" in str(exp): raise ConflictError( 409, "Flavor {} already exists".format(flavor.flavor.name)) @@ -121,7 +121,7 @@ def update_flavor(flavor, flavor_uuid, transaction_id): # pragma: no cover return ret_flavor except Exception as exp: - LOG.log_exception("FlavorLogic - Failed to update flavor", exp) + LOG.log_exception("FlavorLogic - Failed to update flavor", str(exp)) datamanager.rollback() raise finally: @@ -158,7 +158,7 @@ def delete_flavor_by_uuid(flavor_uuid): # , transaction_id): resp = rds_proxy.get_status(sql_flavor.id) if resp.status_code == 200: status_resp = resp.json() - if 'status' in status_resp.keys(): + if 'status' in list(status_resp.keys()): LOG.debug( 'RDS returned status:{}'.format(status_resp['status'])) status = status_resp['status'] @@ -196,7 +196,7 @@ def delete_flavor_by_uuid(flavor_uuid): # , transaction_id): datamanager.flush() datamanager.commit() except Exception as exp: - LOG.log_exception("FlavorLogic - Failed to delete flavor", exp) + LOG.log_exception("FlavorLogic - Failed to delete flavor", str(exp)) datamanager.rollback() raise finally: @@ -241,13 +241,13 @@ def add_regions(flavor_uuid, regions, transaction_id): return ret except ErrorStatus as exp: - LOG.log_exception("FlavorLogic - Failed to update flavor", exp) + LOG.log_exception("FlavorLogic - Failed to update flavor", str(exp)) datamanager.rollback() raise exp except Exception as exp: - LOG.log_exception("FlavorLogic - Failed to add regions", exp) + LOG.log_exception("FlavorLogic - Failed to add regions", str(exp)) datamanager.rollback() - if "conflicts with persistent instance" in str(exp.args): + if "conflicts with persistent instance" in str(exp): raise ConflictError(409, "One or more regions already exists in Flavor") raise exp @@ -286,12 +286,12 @@ def delete_region(flavor_uuid, region_name, transaction_id, on_success_by_rds, datamanager.rollback() except ErrorStatus as exp: - LOG.log_exception("FlavorLogic - Failed to update flavor", exp) + LOG.log_exception("FlavorLogic - Failed to update flavor", str(exp)) datamanager.rollback() raise exp except Exception as exp: - LOG.log_exception("FlavorLogic - Failed to delete region", exp) + LOG.log_exception("FlavorLogic - Failed to delete region", str(exp)) datamanager.rollback() raise exp @@ -317,7 +317,7 @@ def add_tenants(flavor_uuid, tenants, transaction_id): existing_region_names = sql_flavor.get_existing_region_names() for tenant in tenants.tenants: - if not isinstance(tenant, basestring): + if not isinstance(tenant, str): raise ValueError("tenant type must be a string type," " got {} type".format(type(tenant))) @@ -334,13 +334,13 @@ def add_tenants(flavor_uuid, tenants, transaction_id): return ret except (ErrorStatus, ValueError) as exp: - LOG.log_exception("FlavorLogic - Failed to update flavor", exp) + LOG.log_exception("FlavorLogic - Failed to update flavor", str(exp)) datamanager.rollback() raise except Exception as exp: datamanager.rollback() - LOG.log_exception("FlavorLogic - Failed to add tenants", exp) - if "conflicts with persistent instance" in str(exp.args): + LOG.log_exception("FlavorLogic - Failed to add tenants", str(exp)) + if "conflicts with persistent instance" in str(exp): raise ConflictError(409, "One or more tenants already exist") raise finally: @@ -377,18 +377,18 @@ def delete_tenant(flavor_uuid, tenant_id, transaction_id): datamanager.commit() except NotFoundError as exp: datamanager.rollback() - LOG.log_exception("FlavorLogic - Flavor not found", exp) + LOG.log_exception("FlavorLogic - Flavor not found", str(exp)) raise except ErrorStatus as exp: datamanager.rollback() if exp.status_code == 404: - LOG.log_exception("FlavorLogic - Tenant not found", exp) + LOG.log_exception("FlavorLogic - Tenant not found", str(exp)) raise else: - LOG.log_exception("FlavorLogic - failed to delete tenant", exp) + LOG.log_exception("FlavorLogic - failed to delete tenant", str(exp)) raise except Exception as exp: - LOG.log_exception("FlavorLogic - Failed to delete tenant", exp) + LOG.log_exception("FlavorLogic - Failed to delete tenant", str(exp)) datamanager.rollback() raise finally: @@ -422,12 +422,12 @@ def get_extra_specs_uuid(flavor_id, transaction_id): except NotFoundError as exp: datamanager.rollback() - LOG.log_exception("FlavorLogic - Flavor Not Found", exp) + LOG.log_exception("FlavorLogic - Flavor Not Found", str(exp)) raise except Exception as exp: datamanager.rollback() - LOG.log_exception("FlavorLogic - Flavor Not Found", exp) + LOG.log_exception("FlavorLogic - Flavor Not Found", str(exp)) raise finally: datamanager.close() @@ -472,22 +472,22 @@ def delete_extra_specs(flavor_id, transaction_id, extra_spec=None): except NotFoundError as exp: datamanager.rollback() - LOG.log_exception("FlavorLogic - Flavor not found", exp) + LOG.log_exception("FlavorLogic - Flavor not found", str(exp)) raise except ErrorStatus as exp: datamanager.rollback() if exp.status_code == 404: - LOG.log_exception("FlavorLogic - extra specs not found", exp) + LOG.log_exception("FlavorLogic - extra specs not found", str(exp)) raise else: LOG.log_exception("FlavorLogic - failed to delete extra specs", - exp) + str(exp)) raise except Exception as exp: datamanager.rollback() - LOG.log_exception("FlavorLogic - fail to delete extra spec", exp) + LOG.log_exception("FlavorLogic - fail to delete extra spec", str(exp)) raise finally: datamanager.close() @@ -805,7 +805,7 @@ def update_region_statuses(flavor, sql_flavor): flavor_regions_list.append(region_data.region_name) # get region status if region in flavor_regions_list - if flavor_regions_list and 'regions' in rds_status_resp.keys(): + if flavor_regions_list and 'regions' in list(rds_status_resp.keys()): for rds_region_status in rds_status_resp['regions']: # check that the region read from RDS is in the # flavor_regions_list @@ -815,7 +815,7 @@ def update_region_statuses(flavor, sql_flavor): status=rds_region_status['status'], error_message=rds_region_status['error_msg'])) - if 'status' in rds_status_resp.keys(): + if 'status' in list(rds_status_resp.keys()): # if flavor not assigned to region set flavor.status to # 'no regions' if flavor_regions_list: @@ -956,7 +956,7 @@ def calculate_name(flavor): series_metadata if x.startswith("valid_options_")] options = [n for n in valid_options if n in - flavor.flavor.options.keys() and + list(flavor.flavor.options.keys()) and flavor.flavor.options[n].lower() == 'true'] if 'i2' in options and 'n0' not in options: diff --git a/orm/services/flavor_manager/fms_rest/proxies/rds_proxy.py b/orm/services/flavor_manager/fms_rest/proxies/rds_proxy.py index c39c089b..09409afd 100755 --- a/orm/services/flavor_manager/fms_rest/proxies/rds_proxy.py +++ b/orm/services/flavor_manager/fms_rest/proxies/rds_proxy.py @@ -1,5 +1,6 @@ import json import pprint +import requests from orm.common.orm_common.injector import injector from orm.services.flavor_manager.fms_rest.logger import get_logger @@ -14,10 +15,8 @@ LOG = get_logger(__name__) headers = {'content-type': 'application/json'} -@di.dependsOn('requests') def send_flavor(flavor_dict, transaction_id, action="put"): # action can be "post" for creating flavor or "delete" for deleting flavor - requests = di.resolver.unpack(send_flavor) data = { "service_template": @@ -94,10 +93,7 @@ def send_flavor(flavor_dict, transaction_id, action="put"): return content -@di.dependsOn('requests') def get_status(resource_id): - requests = di.resolver.unpack(send_flavor) - try: LOG.debug("Sending to RDS Server to get status: " + conf.api.rds_server.base + conf.api.rds_server.status + resource_id) resp = requests.get(conf.api.rds_server.base + conf.api.rds_server.status + resource_id, verify=conf.verify) diff --git a/orm/services/flavor_manager/fms_rest/utils/utils.py b/orm/services/flavor_manager/fms_rest/utils/utils.py index 01188dfd..c0681dbe 100755 --- a/orm/services/flavor_manager/fms_rest/utils/utils.py +++ b/orm/services/flavor_manager/fms_rest/utils/utils.py @@ -1,3 +1,4 @@ +import requests import time from orm.common.orm_common.injector import injector @@ -10,13 +11,11 @@ logger = get_logger(__name__) di = injector.get_di() -@di.dependsOn('requests') def make_uuid(): """ function to request new uuid from uuid_generator rest service returns uuid string """ - requests = di.resolver.unpack(make_uuid) url = conf.api.uuid_server.base + conf.api.uuid_server.uuids try: @@ -36,13 +35,11 @@ def make_uuid(): return resp['uuid'] -@di.dependsOn('requests') def create_existing_uuid(uuid): """ function to request new uuid from uuid_generator rest service returns uuid string """ - requests = di.resolver.unpack(make_uuid) url = conf.api.uuid_server.base + conf.api.uuid_server.uuids try: @@ -65,13 +62,11 @@ def create_existing_uuid(uuid): return resp['uuid'] -@di.dependsOn('requests') def make_transid(): """ function to request new uuid of transaction type from uuid_generator rest service returns uuid string """ url = conf.api.uuid_server.base + conf.api.uuid_server.uuids - requests = di.resolver.unpack(make_uuid) try: resp = requests.post(url, data={'uuid_type': 'transaction'}, @@ -113,7 +108,7 @@ def audit_trail(cmd, transaction_id, headers, resource_id, event_details=''): audit_setup = True try: - timestamp = long(round(time.time() * 1000)) + timestamp = int(round(time.time() * 1000)) application_id = headers['X-RANGER-Client'] if 'X-RANGER-Client' in headers else 'NA' tracking_id = headers['X-RANGER-Tracking-Id'] if 'X-RANGER-Tracking-Id' in headers else transaction_id # transaction_id is function argument diff --git a/orm/services/flavor_manager/tox.ini b/orm/services/flavor_manager/tox.ini deleted file mode 100755 index 8e9d9942..00000000 --- a/orm/services/flavor_manager/tox.ini +++ /dev/null @@ -1,19 +0,0 @@ -[tox] -envlist=py27,cover - -[testenv] -setenv= FMS_ENV=mock - PYTHONPATH={toxinidir}:{toxinidir}/fms_rest/external_mock/ -deps= -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - - -[testenv:pep8] -commands = - py.test --pep8 -m pep8 - -[testenv:cover] -commands= - coverage run setup.py test - coverage report - coverage html --omit=fms_rest/data/sql_alchemy/*,fms_rest/utils/utils.py,.tox/* diff --git a/orm/services/id_generator/requirements.txt b/orm/services/id_generator/requirements.txt deleted file mode 100644 index 6d5e36ac..00000000 --- a/orm/services/id_generator/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -pecan==1.0.2 -SQLAlchemy==0.9.7 -WSME>=0.6 -MySQL-python==1.2.5 -requests==2.2.1 -oslo.db==1.7.2 diff --git a/orm/services/id_generator/test-requirements.txt b/orm/services/id_generator/test-requirements.txt deleted file mode 100644 index 21922369..00000000 --- a/orm/services/id_generator/test-requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -# Hacking already pins down pep8, pyflakes and flake8 -mock -coverage -testfixtures -pytest-pep8 -oslo.db==1.7.2 diff --git a/orm/services/id_generator/tox.ini b/orm/services/id_generator/tox.ini deleted file mode 100755 index a6706fbe..00000000 --- a/orm/services/id_generator/tox.ini +++ /dev/null @@ -1,18 +0,0 @@ -[tox] -envlist=py27,cover - -[testenv] -setenv= PYTHONPATH={toxinidir}:{toxinidir}/uuidgen/external_mock/ -deps= -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:pep8] -commands= - py.test --pep8 -m pep8 - -[testenv:cover] -commands= - coverage run setup.py test - coverage report --omit=uuidgen/tests/* - coverage html --omit=uuidgen/tests/* -#commands={envpython} setup.py test -v {posargs} diff --git a/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py b/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py index 30535961..c31cab2e 100755 --- a/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py +++ b/orm/services/id_generator/uuidgen/controllers/v1/uuid_controller.py @@ -42,7 +42,7 @@ class UUIDController(RestController): if len(kw): response.status = 400 - messageToReturn = respond("badRequest", 400, 'Unknown parameter(s):' + ', '.join(kw.keys())) + messageToReturn = respond("badRequest", 400, 'Unknown parameter(s):' + ', '.join(list(kw.keys()))) LOG.info("UUIDController.post - " + str(messageToReturn)) return messageToReturn diff --git a/orm/services/id_generator/uuidgen/db/db_manager.py b/orm/services/id_generator/uuidgen/db/db_manager.py index b4c67ebc..02809f7b 100755 --- a/orm/services/id_generator/uuidgen/db/db_manager.py +++ b/orm/services/id_generator/uuidgen/db/db_manager.py @@ -1,7 +1,7 @@ import logging from orm.services.id_generator.uuidgen.db.uuid_db import UUID -from oslo_db.sqlalchemy import session as db_session +from oslo_db.sqlalchemy.enginefacade import LegacyEngineFacade from pecan import conf logger = logging.getLogger(__name__) @@ -13,7 +13,7 @@ class DBManager(object): if not connection_string: connection_string = conf.database.connection_string - self._engine_facade = db_session.EngineFacade(connection_string, autocommit=False) + self._engine_facade = LegacyEngineFacade(connection_string, autocommit=False) self._session = None def get_session(self): diff --git a/orm/services/image_manager/data_manager_test.py b/orm/services/image_manager/data_manager_test.py index 7c0ea79d..5de4eeb8 100755 --- a/orm/services/image_manager/data_manager_test.py +++ b/orm/services/image_manager/data_manager_test.py @@ -1,10 +1,10 @@ import os import traceback -from ims.logger import get_logger -from ims.persistency.sql_alchemy.data_manager import DataManager -from ims.persistency.sql_alchemy.db_models import (Image, ImageCustomer, - ImageProperty, ImageRegion) +from .ims.logger import get_logger +from .ims.persistency.sql_alchemy.data_manager import DataManager +from .ims.persistency.sql_alchemy.db_models import (Image, ImageCustomer, + ImageProperty, ImageRegion) from pecan import conf from pecan.testing import load_test_app @@ -20,7 +20,7 @@ def main(): try: # prepare_service() - print conf.database + print(conf.database) data_manager = DataManager() @@ -28,16 +28,16 @@ def main(): image = image_record.get_image(image_id) - print image.regions - print image.properties + print(image.regions) + print(image.properties) all_images = image_record.get_all_images(start=0, limit=50) - print all_images + print(all_images) # LOG.debug("TestDatabase finished well") except Exception as exception: - print("Exception" + str(exception)) + print(("Exception" + str(exception))) # LOG.error("Exception in TestDatabase: " + str(exception)) @@ -45,7 +45,7 @@ def delete(): try: # prepare_service() - print conf.database + print(conf.database) data_manager = DataManager() @@ -56,11 +56,11 @@ def delete(): result = image_record.delete_by_id(image_id) data_manager.commit() - print "Nm records deleted: " + str(result.rowcount) + print("Nm records deleted: " + str(result.rowcount)) # LOG.debug("TestDatabase finished well") except Exception as exception: - print("Exception" + str(exception)) + print(("Exception" + str(exception))) # LOG.error("Exception in TestDatabase: " + str(exception)) @@ -78,7 +78,7 @@ def main2(): "profile": "NS"} images = image_record.get_images_by_criteria(**criterias) - print len(images) + print(len(images)) except Exception as exception: LOG.log_exception("Failed to get_images_by_criteria: ", exception) @@ -92,7 +92,7 @@ def main3(): try: # prepare_service() - print conf.database + print(conf.database) data_manager = DataManager() @@ -100,9 +100,9 @@ def main3(): image = image_record.get_image(image_id) - print image.image_extra_specs - print image.image_regions - print image.image_tenants + print(image.image_extra_specs) + print(image.image_regions) + print(image.image_tenants) region = ImageRegion(region_name="Israel") image.add_region(region) @@ -121,7 +121,7 @@ def main3(): # LOG.debug("TestDatabase finished well") except Exception as exception: - print("Exception" + str(exception)) + print(("Exception" + str(exception))) # LOG.error("Exception in TestDatabase: " + str(exception)) @@ -129,7 +129,7 @@ def main4(): try: # prepare_service() - print conf.database + print(conf.database) data_manager = DataManager() @@ -137,9 +137,9 @@ def main4(): image = image_record.get_image(image_id) - print image.image_extra_specs - print image.image_regions - print image.image_tenants + print(image.image_extra_specs) + print(image.image_regions) + print(image.image_tenants) image.remove_region("Israel") image.remove_region("Israel2") @@ -152,7 +152,7 @@ def main4(): # LOG.debug("TestDatabase finished well") except Exception as exception: - print("Exception" + str(exception)) + print(("Exception" + str(exception))) # LOG.error("Exception in TestDatabase: " + str(exception)) @@ -160,7 +160,7 @@ def insert_data(): try: # prepare_service() - print conf.database + print(conf.database) data_manager = DataManager() @@ -198,22 +198,22 @@ def insert_data(): # LOG.debug("TestDatabase finished well") except Exception as exception: - print("Exception" + str(exception)) + print(("Exception" + str(exception))) # LOG.error("Exception in TestDatabase: " + str(exception)) def print_exception(): try: - print "*** print_exc:" + print("*** print_exc:") traceback.print_exc() - print "*** format_exception:" - print traceback.format_exc() - print "*** extract_tb:" - print traceback.extract_tb() - print "*** format_tb:" - print traceback.format_tb() + print("*** format_exception:") + print(traceback.format_exc()) + print("*** extract_tb:") + print(traceback.extract_tb()) + print("*** format_tb:") + print(traceback.format_tb()) except Exception as exception1: - print "*** print_exc:" + print("*** print_exc:") traceback.print_exc() diff --git a/orm/services/image_manager/ims/controllers/v1/orm/configuration.py b/orm/services/image_manager/ims/controllers/v1/orm/configuration.py index e97be2b8..b8b4cdda 100755 --- a/orm/services/image_manager/ims/controllers/v1/orm/configuration.py +++ b/orm/services/image_manager/ims/controllers/v1/orm/configuration.py @@ -1,5 +1,5 @@ """Configuration rest API input module.""" -from __future__ import absolute_import + import logging from orm.common.orm_common.utils import utils diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/images.py b/orm/services/image_manager/ims/controllers/v1/orm/images/images.py index 8105b375..4c4d9e28 100755 --- a/orm/services/image_manager/ims/controllers/v1/orm/images/images.py +++ b/orm/services/image_manager/ims/controllers/v1/orm/images/images.py @@ -177,7 +177,7 @@ class ImageController(rest.RestController): except ErrorStatus as exp: LOG.log_exception("ImageController - Failed to delete image", exp) raise err_utils.get_error(request.transaction_id, - message=exp.message, + message=str(exp), status_code=exp.status_code) except Exception as exp: diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/metadata.py b/orm/services/image_manager/ims/controllers/v1/orm/images/metadata.py index 7c7e1fb4..0a859c68 100644 --- a/orm/services/image_manager/ims/controllers/v1/orm/images/metadata.py +++ b/orm/services/image_manager/ims/controllers/v1/orm/images/metadata.py @@ -32,10 +32,10 @@ class MetadataController(rest.RestController): except ErrorStatus as exception: LOG.log_exception("MetadataController - Failed to add metadata", exception) raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=exception.status_code) except Exception as exception: LOG.log_exception("MetadataController - Failed to add metadata", exception) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) diff --git a/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py b/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py index 6a2baae0..bbb2dd91 100755 --- a/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py +++ b/orm/services/image_manager/ims/controllers/v1/orm/images/regions.py @@ -50,13 +50,13 @@ class RegionController(rest.RestController): except ErrorStatus as exception: LOG.log_exception("RegionController - Failed to add region", exception) raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=exception.status_code) except Exception as exception: LOG.log_exception("RegionController - Failed to add region", exception) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @wsexpose(RegionWrapper, str, body=RegionWrapper, rest_content_types='json', status_code=200) def put(self, image_id, region_wrapper): # add regions to image @@ -82,13 +82,13 @@ class RegionController(rest.RestController): except ErrorStatus as exception: LOG.log_exception("RegionController - Failed to replace region", exception) raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=exception.status_code) except Exception as exception: LOG.log_exception("RegionController - Failed to replace region", exception) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @wsexpose(None, str, str, str, rest_content_types='json', status_code=204) def delete(self, image_id, region_name, force_delete='False'): @@ -116,10 +116,10 @@ class RegionController(rest.RestController): except ErrorStatus as exception: # include NotFoundError LOG.log_exception("RegionController - Failed to delete region", exception) raise err_utils.get_error(request.transaction_id, - message=exception.message, + message=str(exception), status_code=exception.status_code) except Exception as exception: LOG.log_exception("RegionController - Failed to delete region", exception) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) diff --git a/orm/services/image_manager/ims/controllers/v1/orm/logs.py b/orm/services/image_manager/ims/controllers/v1/orm/logs.py index 6b672672..cebfafc3 100755 --- a/orm/services/image_manager/ims/controllers/v1/orm/logs.py +++ b/orm/services/image_manager/ims/controllers/v1/orm/logs.py @@ -41,10 +41,9 @@ class LogsController(rest.RestController): :param level: the log level text name :return: """ - logger.info("Changing log level to [{}]".format(level)) try: - log_level = logging._levelNames.get(level.upper()) + log_level = logging._nameToLevel.get(level.upper()) if log_level is not None: self._change_log_level(log_level) result = "Log level changed to {}.".format(level) @@ -54,9 +53,9 @@ class LogsController(rest.RestController): "The given log level [{}] doesn't exist.".format(level)) except Exception as e: result = "Fail to change log_level. Reason: {}".format( - e.message) + str(e)) logger.error(result) - raise ClientSideError(error=e.message) + raise ClientSideError(error=str(e)) return LogChangeResult(result) @staticmethod diff --git a/orm/services/image_manager/ims/controllers/v1/orm/orm.py b/orm/services/image_manager/ims/controllers/v1/orm/orm.py index 6c1d5159..2edb31e3 100644 --- a/orm/services/image_manager/ims/controllers/v1/orm/orm.py +++ b/orm/services/image_manager/ims/controllers/v1/orm/orm.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from orm.services.image_manager.ims.controllers.v1.orm.configuration import ConfigurationController from orm.services.image_manager.ims.controllers.v1.orm.images.images import ImageController diff --git a/orm/services/image_manager/ims/controllers/v1/v1.py b/orm/services/image_manager/ims/controllers/v1/v1.py index 83680ff4..8acb292c 100644 --- a/orm/services/image_manager/ims/controllers/v1/v1.py +++ b/orm/services/image_manager/ims/controllers/v1/v1.py @@ -1,4 +1,4 @@ -from __future__ import absolute_import + from orm.services.image_manager.ims.controllers.v1.orm.orm import OrmController diff --git a/orm/services/image_manager/ims/logic/image_logic.py b/orm/services/image_manager/ims/logic/image_logic.py index 93cd1279..d77d3cdc 100755 --- a/orm/services/image_manager/ims/logic/image_logic.py +++ b/orm/services/image_manager/ims/logic/image_logic.py @@ -340,7 +340,7 @@ def add_customers(image_uuid, customers, transaction_id): return ret_image except Exception as exp: - if 'conflicts with persistent instance' in exp.message or 'Duplicate entry' in exp.message: + if 'conflicts with persistent instance' in str(exp) or 'Duplicate entry' in str(exp): raise ErrorStatus(409, "Duplicate Customer for Image") LOG.log_exception("ImageLogic - Failed to add Customers", exp) datamanager.rollback() @@ -378,7 +378,7 @@ def replace_customers(image_uuid, customers, transaction_id): return ret_image except Exception as exp: - if 'conflicts with persistent instance' in exp.message or 'Duplicate entry' in exp.message: + if 'conflicts with persistent instance' in str(exp) or 'Duplicate entry' in str(exp): raise ErrorStatus(409, "Duplicate Customer for Image") LOG.log_exception("ImageLogic - Failed to add Customers", exp) datamanager.rollback() diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/data_manager.py b/orm/services/image_manager/ims/persistency/sql_alchemy/data_manager.py index 98340872..cabce042 100755 --- a/orm/services/image_manager/ims/persistency/sql_alchemy/data_manager.py +++ b/orm/services/image_manager/ims/persistency/sql_alchemy/data_manager.py @@ -1,7 +1,7 @@ from orm.services.image_manager.ims.logger import get_logger from orm.services.image_manager.ims.persistency.sql_alchemy.image.image_record import ImageRecord -from oslo_db.sqlalchemy import session as db_session +from oslo_db.sqlalchemy.enginefacade import LegacyEngineFacade from pecan import conf from sqlalchemy.event import listen @@ -10,7 +10,7 @@ LOG = get_logger(__name__) # event handling def on_before_flush(session, flush_context, instances): - print("on_before_flush:", str(flush_context)) + print(("on_before_flush:", str(flush_context))) for model in session.new: if hasattr(model, "validate"): model.validate("new") @@ -27,7 +27,7 @@ class DataManager(object): if not connection_string: connection_string = conf.database.connection_string - self._engine_facade = db_session.EngineFacade(connection_string, autocommit=False) + self._engine_facade = LegacyEngineFacade(connection_string, autocommit=False) self._session = None listen(self.session, 'before_flush', on_before_flush) self.image_record = None diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/db_models.py b/orm/services/image_manager/ims/persistency/sql_alchemy/db_models.py index d579a095..9477c840 100755 --- a/orm/services/image_manager/ims/persistency/sql_alchemy/db_models.py +++ b/orm/services/image_manager/ims/persistency/sql_alchemy/db_models.py @@ -151,7 +151,7 @@ class Image(Base, IMSBaseModel): try: LOG.debug("add region {0} to image {1}".format(str(image_region), str(self))) - region_list = filter(lambda region: region.region_name == image_region.region_name, self.regions) + region_list = [region for region in self.regions if region.region_name == image_region.region_name] if len(region_list) > 0: raise ErrorStatus(409, "Region {} already exist in Image {}".format(image_region.region_name, self.name)) self.regions.append(image_region) @@ -162,7 +162,7 @@ class Image(Base, IMSBaseModel): raise def remove_region(self, region_name): - assert isinstance(region_name, basestring) + assert isinstance(region_name, str) try: LOG.debug("remove regions {0} from image {1}".format(region_name, str(self))) @@ -201,7 +201,7 @@ class Image(Base, IMSBaseModel): LOG.log_exception("Failed to add customer {0} from image {1}".format(str(image_customer), str(self)), exception) def remove_customer(self, customer_id): - assert isinstance(customer_id, basestring) + assert isinstance(customer_id, str) try: LOG.debug("remove customers {0} from image {1}".format(customer_id, str(self))) diff --git a/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py b/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py index a16aa16a..0d2bdf13 100755 --- a/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py +++ b/orm/services/image_manager/ims/persistency/sql_alchemy/image/image_record.py @@ -101,7 +101,7 @@ class ImageRecord(Record): if results: resource_status_dict = dict((id, (resource_id, region, status)) for id, resource_id, region, status in results) # using resource_status_dict, create img_region_dict with resource_id as key and (region, status) as value - for v in resource_status_dict.values(): + for v in list(resource_status_dict.values()): if v[0] in img_region_dict: img_region_dict[v[0]].append(v[1:]) else: diff --git a/orm/services/image_manager/ims/persistency/wsme/models.py b/orm/services/image_manager/ims/persistency/wsme/models.py index 7849f472..3e447994 100755 --- a/orm/services/image_manager/ims/persistency/wsme/models.py +++ b/orm/services/image_manager/ims/persistency/wsme/models.py @@ -260,7 +260,7 @@ class Image(Model): 400, 'Invalid container format! {}'.format(self.container_format)) - if int(self.min_ram) not in range(0, self.min_ram + 1, 1024): + if int(self.min_ram) not in list(range(0, self.min_ram + 1, 1024)): raise ErrorStatus( 400, "mininum RAM value must be a multiple of 1024") @@ -284,7 +284,7 @@ class Image(Model): tag_rec.tag = tag tags.append(tag_rec) - for key, value in self.properties.iteritems(): + for key, value in self.properties.items(): prop = db_models.ImageProperty() prop.key_name = key prop.key_value = value diff --git a/orm/services/image_manager/ims/proxies/rds_proxy.py b/orm/services/image_manager/ims/proxies/rds_proxy.py index a3285496..005b8307 100755 --- a/orm/services/image_manager/ims/proxies/rds_proxy.py +++ b/orm/services/image_manager/ims/proxies/rds_proxy.py @@ -1,5 +1,6 @@ import json import pprint +import requests from orm.common.orm_common.injector import injector from orm.services.image_manager.ims.logger import get_logger @@ -14,10 +15,8 @@ LOG = get_logger(__name__) headers = {'content-type': 'application/json'} -@di.dependsOn('requests') def send_image(image_dict, transaction_id, action="put"): # action can be "post" for creating image or "delete" for deleting image - requests = di.resolver.unpack(send_image) data = { "service_template": @@ -102,10 +101,7 @@ def send_image(image_dict, transaction_id, action="put"): return content -@di.dependsOn('requests') def get_status(resource_id, json_convert=True): - requests = di.resolver.unpack(send_image) - resp = requests.get(conf.api.rds_server.base + conf.api.rds_server.status + resource_id, verify=conf.verify) if json_convert: resp = resp.json() diff --git a/orm/services/image_manager/tox.ini b/orm/services/image_manager/tox.ini deleted file mode 100755 index 04ce4ec0..00000000 --- a/orm/services/image_manager/tox.ini +++ /dev/null @@ -1,17 +0,0 @@ -[tox] -envlist=py27,pep8,cover - -[testenv] -setenv= PYTHONPATH={toxinidir}:{toxinidir}/ims/external_mock/ -deps= -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -[testenv:pep8] -commands= - py.test --pep8 -m pep8 - -[testenv:cover] -commands= - coverage run setup.py test - coverage report - coverage html diff --git a/orm/services/region_manager/csv2db.py b/orm/services/region_manager/csv2db.py index faa51550..d1ebb70a 100755 --- a/orm/services/region_manager/csv2db.py +++ b/orm/services/region_manager/csv2db.py @@ -1,9 +1,9 @@ import csv import logging -import config -from rms.storage.base_data_manager import SQLDBError -from rms.storage.my_sql.data_manager import DataManager +from . import config +from .rms.storage.base_data_manager import SQLDBError +from .rms.storage.my_sql.data_manager import DataManager logger = logging.getLogger(__name__) diff --git a/orm/services/region_manager/revert_csv2db.py b/orm/services/region_manager/revert_csv2db.py index bcd55310..626dd607 100644 --- a/orm/services/region_manager/revert_csv2db.py +++ b/orm/services/region_manager/revert_csv2db.py @@ -1,9 +1,9 @@ import csv import logging -import config -from rms.storage.base_data_manager import SQLDBError -from rms.storage.my_sql.data_manager import DataManager +from . import config +from .rms.storage.base_data_manager import SQLDBError +from .rms.storage.my_sql.data_manager import DataManager logger = logging.getLogger(__name__) diff --git a/orm/services/region_manager/rms/controllers/lcp_controller.py b/orm/services/region_manager/rms/controllers/lcp_controller.py index 1e118c5f..08c207bd 100755 --- a/orm/services/region_manager/rms/controllers/lcp_controller.py +++ b/orm/services/region_manager/rms/controllers/lcp_controller.py @@ -33,10 +33,10 @@ class LcpController(rest.RestController): return zones except Exception as exception: - logger.error(exception.message) + logger.error(str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @wsexpose(wtypes.text, str, rest_content_types='json') def get_one(self, lcp_id): @@ -50,10 +50,10 @@ class LcpController(rest.RestController): zones = get_zones() except Exception as exception: - logger.error(exception.message) + logger.error(str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) for zone in zones: if zone["id"] == lcp_id: diff --git a/orm/services/region_manager/rms/controllers/logs.py b/orm/services/region_manager/rms/controllers/logs.py index a6b680d3..0253402e 100755 --- a/orm/services/region_manager/rms/controllers/logs.py +++ b/orm/services/region_manager/rms/controllers/logs.py @@ -3,7 +3,6 @@ import wsme from orm.common.orm_common.utils import api_error_utils as err_utils from orm.services.region_manager.rms.utils import authentication - from pecan import request, rest from wsmeext.pecan import wsexpose @@ -44,7 +43,7 @@ class LogsController(rest.RestController): authentication.authorize(request, 'log:update') try: - log_level = logging._levelNames.get(level.upper()) + log_level = logging._nameToLevel.get(level.upper()) if log_level is not None: self._change_log_level(log_level) result = "Log level changed to {}.".format(level) @@ -57,10 +56,10 @@ class LogsController(rest.RestController): except Exception as exception: logger.error("Fail to change log_level. Reason: {}".format( - exception.message)) + str(exception))) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @staticmethod def _change_log_level(log_level): diff --git a/orm/services/region_manager/rms/controllers/root.py b/orm/services/region_manager/rms/controllers/root.py index 69950ab7..d1986dec 100755 --- a/orm/services/region_manager/rms/controllers/root.py +++ b/orm/services/region_manager/rms/controllers/root.py @@ -1,6 +1,6 @@ -from configuration import ConfigurationController -from lcp_controller import LcpController -from logs import LogsController +from .configuration import ConfigurationController +from .lcp_controller import LcpController +from .logs import LogsController import orm.base_config as config diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/metadata.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/metadata.py index 1b5df022..6c7cd2c8 100755 --- a/orm/services/region_manager/rms/controllers/v2/orm/resources/metadata.py +++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/metadata.py @@ -47,10 +47,10 @@ class RegionMetadataController(rest.RestController): message=exp.message, status_code=exp.status_code) except Exception as exp: - logger.exception(exp.message) + logger.exception(str(exp)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exp.message) + error_details=str(exp)) @wsexpose(MetaData, str, body=MetaData, status_code=201, rest_content_types='json') @@ -84,10 +84,10 @@ class RegionMetadataController(rest.RestController): message=e.message, status_code=e.status_code) except Exception as exception: - logger.error(exception.message) + logger.error(str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @wsexpose(MetaData, str, body=MetaData, status_code=201, rest_content_types='json') @@ -121,10 +121,10 @@ class RegionMetadataController(rest.RestController): message=e.message, status_code=e.status_code) except Exception as exception: - logger.error(exception.message) + logger.error(str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @wsexpose(None, str, str, status_code=204, rest_content_types='json') def delete(self, region_id, metadata_key): @@ -155,16 +155,16 @@ class RegionMetadataController(rest.RestController): message=e.message, status_code=e.status_code) except Exception as exception: - logger.error(exception.message) + logger.error(str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) def _validate_request_input(self): data_dict = json.loads(request.body) logger.debug("Got {}".format(data_dict)) - for k, v in data_dict['metadata'].iteritems(): - if isinstance(v, basestring): + for k, v in data_dict['metadata'].items(): + if isinstance(v, str): logger.error("Invalid json. value type list is expected, " "received string, for metadata key {}".format(k)) raise error_base.ErrorStatus(400, "Invalid json. Expecting list " diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/regions.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/regions.py index 43df71d0..cc2fba2d 100755 --- a/orm/services/region_manager/rms/controllers/v2/orm/resources/regions.py +++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/regions.py @@ -221,7 +221,7 @@ class RegionsController(rest.RestController): except Exception as e: raise err_utils.get_error(request.transaction_id, status_code=401, - message=e.message) + message=str(e)) @wsexpose(Regions, str, str, [str], str, str, str, str, str, str, str, str, str, str, str, status_code=200, rest_content_types='json') @@ -276,10 +276,10 @@ class RegionsController(rest.RestController): status_code=e.status_code) except Exception as exception: - logger.error(exception.message) + logger.error(str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - message=exception.message) + message=str(exception)) @wsexpose(RegionsData, str, status_code=200, rest_content_types='json') def get_one(self, id_or_name): @@ -297,10 +297,10 @@ class RegionsController(rest.RestController): message=exp.message, status_code=exp.status_code) except Exception as exp: - logger.exception(exp.message) + logger.exception(str(exp)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exp.message) + error_details=str(exp)) return result @@ -341,10 +341,10 @@ class RegionsController(rest.RestController): except Exception as exp: logger.exception( - "Error in creating region .. reason:- {}".format(exp)) + "Error in creating region .. reason:- {}".format(str(exp))) raise err_utils.get_error(request.transaction_id, status_code=500, - message=exp.message) + message=str(exp)) return result @@ -378,10 +378,10 @@ class RegionsController(rest.RestController): except Exception as exp: logger.exception( - "error in deleting region .. reason:- {}".format(exp)) + "error in deleting region .. reason:- {}".format(str(exp))) raise err_utils.get_error(request.transaction_id, status_code=500, - message=exp.message) + message=str(exp)) return else: region_resources_exist_msg = "Region {} cannot be deleted as " \ @@ -428,8 +428,8 @@ class RegionsController(rest.RestController): logger.exception( "API: error in updating region {}.. " "reason:- {}".format(region_id, - exp)) + str(exp))) raise err_utils.get_error(request.transaction_id, status_code=500, - message=exp.message) + message=str(exp)) return result diff --git a/orm/services/region_manager/rms/controllers/v2/orm/resources/status.py b/orm/services/region_manager/rms/controllers/v2/orm/resources/status.py index df3107b2..02cb718f 100755 --- a/orm/services/region_manager/rms/controllers/v2/orm/resources/status.py +++ b/orm/services/region_manager/rms/controllers/v2/orm/resources/status.py @@ -78,10 +78,10 @@ class RegionStatusController(rest.RestController): message=e.message, status_code=e.status_code) except Exception as exception: - logger.error(exception.message) + logger.error(str(exception)) raise err_utils.get_error(request.transaction_id, status_code=500, - error_details=exception.message) + error_details=str(exception)) @wsexpose(str, str, rest_content_types='json') def get(self, region_id): diff --git a/orm/services/region_manager/rms/controllers/v2/root.py b/orm/services/region_manager/rms/controllers/v2/root.py index c5add9bc..d58e3d75 100755 --- a/orm/services/region_manager/rms/controllers/v2/root.py +++ b/orm/services/region_manager/rms/controllers/v2/root.py @@ -1,5 +1,5 @@ """V2 root controller module.""" -from __future__ import absolute_import + from orm.services.region_manager.rms.controllers.v2.orm import root diff --git a/orm/services/region_manager/rms/model/url_parm.py b/orm/services/region_manager/rms/model/url_parm.py index 79c18731..edece8bd 100755 --- a/orm/services/region_manager/rms/model/url_parm.py +++ b/orm/services/region_manager/rms/model/url_parm.py @@ -100,7 +100,7 @@ class UrlParms(object): :return:regin dict """ regiondict = {} - for key, value in self.__dict__.items(): + for key, value in list(self.__dict__.items()): if key != 'metadata': regiondict[key] = value return regiondict diff --git a/orm/services/region_manager/rms/services/error_base.py b/orm/services/region_manager/rms/services/error_base.py index 46decc21..a39268de 100755 --- a/orm/services/region_manager/rms/services/error_base.py +++ b/orm/services/region_manager/rms/services/error_base.py @@ -8,6 +8,7 @@ class Error(Exception): class ErrorStatus(Error): def __init__(self, status_code, message=""): + super(ErrorStatus, self).__init__(message) self.status_code = status_code self.message = message @@ -15,6 +16,7 @@ class ErrorStatus(Error): class NotFoundError(ErrorStatus): def __init__(self, status_code=404, message="Not found"): + super(NotFoundError, self).__init__(message) self.status_code = status_code self.message = message diff --git a/orm/services/region_manager/rms/services/services.py b/orm/services/region_manager/rms/services/services.py index 99061bc8..5f73e57e 100755 --- a/orm/services/region_manager/rms/services/services.py +++ b/orm/services/region_manager/rms/services/services.py @@ -62,10 +62,10 @@ def update_region(region_id, region): result = get_region_by_id_or_name(region_id) except error_base.NotFoundError as exp: - LOG.exception("fail to update region {}".format(exp.message)) + LOG.exception("fail to update region {}".format(str(exp))) raise except Exception as exp: - LOG.exception("fail to update region {}".format(exp)) + LOG.exception("fail to update region {}".format(str(exp))) raise return result @@ -88,7 +88,7 @@ def delete_region(region_id): LOG.debug("region deleted") except Exception as exp: - LOG.exception("fail to delete region {}".format(exp)) + LOG.exception("fail to delete region {}".format(str(exp))) raise return @@ -114,13 +114,13 @@ def create_full_region(full_region): result = get_region_by_id_or_name(full_region.id) except error_base.InputValueError as exp: - LOG.exception("error in save region {}".format(exp.message)) + LOG.exception("error in save region {}".format(str(exp))) raise except base_data_manager.DuplicateEntryError as exp: - LOG.exception("error in save region {}".format(exp.message)) - raise error_base.ConflictError(message=exp.message) + LOG.exception("error in save region {}".format(str(exp))) + raise error_base.ConflictError(message=str(exp)) except Exception as exp: - LOG.exception("error in save region {}".format(exp.message)) + LOG.exception("error in save region {}".format(str(exp))) raise return result @@ -198,7 +198,7 @@ def get_all_groups(): except Exception as exp: LOG.error("fail to get all groups") - LOG.exception(exp) + LOG.exception(str(exp)) raise return all_groups @@ -222,7 +222,7 @@ def delete_group(group_id): db.delete_group(group_id) except Exception as exp: - LOG.exception(exp) + LOG.exception(str(exp)) raise return @@ -247,7 +247,7 @@ def create_group_in_db(group): raise error_base.ConflictError( message="Group {} already exists".format(group.id)) except error_base.InputValueError as e: - LOG.exception(e.message) + LOG.exception(str(e)) raise @@ -272,7 +272,7 @@ def update_group(group, group_id): message="Some of the regions not found") except Exception as exp: LOG.error("Failed to update group {}".format(group.group_id)) - LOG.exception(exp) + LOG.exception(str(exp)) raise return Groups(**groups) diff --git a/orm/services/region_manager/rms/storage/base_data_manager.py b/orm/services/region_manager/rms/storage/base_data_manager.py index c1928854..3f388c02 100755 --- a/orm/services/region_manager/rms/storage/base_data_manager.py +++ b/orm/services/region_manager/rms/storage/base_data_manager.py @@ -1,4 +1,5 @@ + class BaseDataManager(object): def __init__(self, url, diff --git a/orm/services/region_manager/rms/storage/my_sql/data_manager.py b/orm/services/region_manager/rms/storage/my_sql/data_manager.py index 6d71d2ea..2a0dd441 100755 --- a/orm/services/region_manager/rms/storage/my_sql/data_manager.py +++ b/orm/services/region_manager/rms/storage/my_sql/data_manager.py @@ -8,9 +8,9 @@ from orm.services.region_manager.rms.storage.base_data_manager import (BaseDataM EntityNotFound) import oslo_db -from data_models import (Group, GroupRegion, Region, RegionEndPoint, - RegionMetaData) -from oslo_db.sqlalchemy import session as db_session +from .data_models import (Group, GroupRegion, Region, RegionEndPoint, + RegionMetaData) +from oslo_db.sqlalchemy.enginefacade import LegacyEngineFacade from sqlalchemy.ext.declarative.api import declarative_base from sqlalchemy.sql import or_ @@ -21,9 +21,9 @@ logger = logging.getLogger(__name__) class DataManager(BaseDataManager): def __init__(self, url, max_retries, retries_interval): - self._engine_facade = db_session.EngineFacade(url, - max_retries=max_retries, - retry_interval=retries_interval) + self._engine_facade = LegacyEngineFacade(url, + max_retries=max_retries, + retry_interval=retries_interval) def add_region(self, region_id, @@ -80,7 +80,7 @@ class DataManager(BaseDataManager): region.end_points.append(region_end_point) if meta_data_dict is not None: - for k, v in meta_data_dict.iteritems(): + for k, v in meta_data_dict.items(): for list_item in v: region.meta_data.append( RegionMetaData(region_id=region_id, @@ -155,7 +155,7 @@ class DataManager(BaseDataManager): record.end_points.append(region_end_point) if meta_data_dict is not None: - for k, v in meta_data_dict.iteritems(): + for k, v in meta_data_dict.items(): for list_item in v: record.meta_data.append( RegionMetaData(region_id=region_id, @@ -168,7 +168,7 @@ class DataManager(BaseDataManager): logger.exception( "fail to update entity with id {} not found".format( region_to_update)) - raise error_base.NotFoundError(message=exp.message) + raise error_base.NotFoundError(message=str(exp)) except Exception as exp: logger.exception("fail to update region {}".format(str(exp))) raise @@ -276,7 +276,7 @@ class DataManager(BaseDataManager): if record is not None: region_metadata = [] - for k, v in metadata_dict.iteritems(): + for k, v in metadata_dict.items(): for list_item in v: region_metadata.append(RegionMetaData(region_id=region_id, meta_data_key=k, @@ -314,7 +314,7 @@ class DataManager(BaseDataManager): filter_by(region_id=region_id).delete() region_metadata = [] - for k, v in metadata_dict.iteritems(): + for k, v in metadata_dict.items(): for list_item in v: region_metadata.append(RegionMetaData(region_id=region_id, meta_data_key=k, @@ -478,7 +478,7 @@ class DataManager(BaseDataManager): raise error_base.InputValueError("Reference error") except Exception as exp: logger.error("failed to update group {}".format(group_id)) - logger.exception(exp) + logger.exception(str(exp)) raise return diff --git a/orm/services/region_manager/rms/storage/my_sql/data_models.py b/orm/services/region_manager/rms/storage/my_sql/data_models.py index 9e2c5fdf..7645395f 100755 --- a/orm/services/region_manager/rms/storage/my_sql/data_models.py +++ b/orm/services/region_manager/rms/storage/my_sql/data_models.py @@ -32,8 +32,8 @@ class Region(Base): created = Column(DateTime(timezone=False), default=datetime.datetime.now()) modified = Column(DateTime(timezone=False)) - end_points = relationship(u'RegionEndPoint') - meta_data = relationship(u'RegionMetaData') + end_points = relationship('RegionEndPoint') + meta_data = relationship('RegionMetaData') def __json__(self): pass @@ -107,8 +107,8 @@ class Group(Base): class GroupRegion(Base): __tablename__ = 'group_region' - group_id = Column(ForeignKey(u'rms_groups.group_id'), primary_key=True) - region_id = Column(ForeignKey(u'region.region_id'), primary_key=True) + group_id = Column(ForeignKey('rms_groups.group_id'), primary_key=True) + region_id = Column(ForeignKey('region.region_id'), primary_key=True) def __json__(self): return dict( @@ -123,7 +123,7 @@ class GroupRegion(Base): class RegionEndPoint(Base): __tablename__ = 'region_end_point' - region_id = Column(ForeignKey(u'region.region_id'), primary_key=True) + region_id = Column(ForeignKey('region.region_id'), primary_key=True) end_point_type = Column(String(64), primary_key=True) public_url = Column(String(64), nullable=False) @@ -143,7 +143,7 @@ class RegionMetaData(Base): __tablename__ = 'region_meta_data' id = Column(Integer, primary_key=True) - region_id = Column(ForeignKey(u'region.region_id'), nullable=False) + region_id = Column(ForeignKey('region.region_id'), nullable=False) meta_data_key = Column(String(64), nullable=False) meta_data_value = Column(String(255), nullable=False) diff --git a/orm/services/region_manager/rms/utils/authentication.py b/orm/services/region_manager/rms/utils/authentication.py index 3f37a846..dfaa709e 100755 --- a/orm/services/region_manager/rms/utils/authentication.py +++ b/orm/services/region_manager/rms/utils/authentication.py @@ -69,7 +69,7 @@ def _get_request_keystone_ep(request): for endpoint in endpoints if endpoint.get('type') == 'identity'] keystone_ep = endpoint_url[0] if endpoint_url else None - except Exception: + except RangerException: keystone_ep = None return keystone_ep diff --git a/orm/services/region_manager/tox.ini b/orm/services/region_manager/tox.ini deleted file mode 100755 index d1ea4254..00000000 --- a/orm/services/region_manager/tox.ini +++ /dev/null @@ -1,27 +0,0 @@ -[tox] -envlist = py27 - -[testenv] -setenv = PYTHONPATH = {toxinidir}:{toxinidir}/rms/external_mock/ -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -commands = - python setup.py testr --coverage --slowest --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py - coverage report --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py - coverage html --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py - -[testenv:cover] -setenv = PYTHONPATH = {toxinidir}:{toxinidir}/rms/external_mock/ -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -commands = - python setup.py testr --coverage --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py - coverage report --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py - coverage html --omit=rms/storage/my_sql/data_models.py,rms/tests/*,.tox/*,external_mock/*,setup.py,rms/logger/*,rms/app.py - -[testenv:pep8] -commands = - - py.test --pep8 -m pep8 diff --git a/orm/services/resource_distributor/doc/source/conf.py b/orm/services/resource_distributor/doc/source/conf.py index a3105447..7584eea7 100644 --- a/orm/services/resource_distributor/doc/source/conf.py +++ b/orm/services/resource_distributor/doc/source/conf.py @@ -37,8 +37,8 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'orm_rds' -copyright = u'2013, OpenStack Foundation' +project = 'orm_rds' +copyright = '2013, OpenStack Foundation' # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = True @@ -67,8 +67,8 @@ htmlhelp_basename = '%sdoc' % project latex_documents = [ ('index', '%s.tex' % project, - u'%s Documentation' % project, - u'OpenStack Foundation', 'manual'), + '%s Documentation' % project, + 'OpenStack Foundation', 'manual'), ] # Example configuration for intersphinx: refer to the Python standard library. diff --git a/orm/services/resource_distributor/rds/app.py b/orm/services/resource_distributor/rds/app.py index ac480335..776518bf 100755 --- a/orm/services/resource_distributor/rds/app.py +++ b/orm/services/resource_distributor/rds/app.py @@ -2,14 +2,15 @@ import logging import os import sys +from .services import region_resource_id_status +from .sot import sot_factory +from .storage import factory from oslo_config import cfg from orm.common.client.audit.audit_client.api import audit from pecan import conf, make_app from pecan.commands import CommandRunner -from services import region_resource_id_status -from sot import sot_factory -from storage import factory + logger = logging.getLogger(__name__) @@ -76,5 +77,6 @@ def main(argv=None): runner = CommandRunner() runner.run(['serve', path + '/config.py']) + if __name__ == "__main__": main() diff --git a/orm/services/resource_distributor/rds/controllers/v1/logs.py b/orm/services/resource_distributor/rds/controllers/v1/logs.py index e8d7b1bb..e56ee395 100644 --- a/orm/services/resource_distributor/rds/controllers/v1/logs.py +++ b/orm/services/resource_distributor/rds/controllers/v1/logs.py @@ -39,7 +39,7 @@ class LogsController(rest.RestController): logger.info("Changing log level to [{}]".format(level)) try: - log_level = logging._levelNames.get(level.upper()) + log_level = logging._nameToLevel.get(level.upper()) if log_level is not None: self._change_log_level(log_level) result = "Log level changed to {}.".format(level) @@ -49,7 +49,7 @@ class LogsController(rest.RestController): "The given log level [{}] doesn't exist.".format(level)) except Exception as e: result = "Fail to change log_level. Reason: {}".format( - e.message) + str(e)) logger.error(result) return LogChangeResult(result) diff --git a/orm/services/resource_distributor/rds/controllers/v1/resources/root.py b/orm/services/resource_distributor/rds/controllers/v1/resources/root.py index 12a88e30..c5b9762f 100755 --- a/orm/services/resource_distributor/rds/controllers/v1/resources/root.py +++ b/orm/services/resource_distributor/rds/controllers/v1/resources/root.py @@ -200,10 +200,10 @@ class CreateNewResource(rest.RestController): except ConflictValue as e: my_logger.error("the request blocked need to wait " "for previous operation to be done ") - raise LockedEntity(e.message) + raise LockedEntity(str(e)) except Exception as e: - my_logger.error("error :- %s " % str(e.message)) - raise ClientSideError(e.message) + my_logger.error("error :- %s " % str(e)) + raise ClientSideError(str(e)) @wsexpose(Result, body=Resource, status_code=201, rest_content_types='json') @@ -244,10 +244,10 @@ class CreateNewResource(rest.RestController): except ConflictValue as e: my_logger.error("the request blocked need to wait " "for previous operation to be done ") - raise LockedEntity(e.message) + raise LockedEntity(str(e)) except Exception as e: - my_logger.error("error :- %s " % str(e.message)) - raise ClientSideError(e.message) + my_logger.error("error :- %s " % str(e)) + raise ClientSideError(str(e)) @wsexpose(str, body=Resource, status_code=200, rest_content_types='json') @@ -279,7 +279,7 @@ class CreateNewResource(rest.RestController): except ConflictValue as e: my_logger.error("the request blocked need to wait" " for previous operation to be done ") - raise LockedEntity(e.message) + raise LockedEntity(str(e)) except Exception as e: - my_logger.error("error :- %s " % str(e.message)) - raise ClientSideError(e.message) + my_logger.error("error :- %s " % str(e)) + raise ClientSideError(str(e)) diff --git a/orm/services/resource_distributor/rds/controllers/v1/status/resource_status.py b/orm/services/resource_distributor/rds/controllers/v1/status/resource_status.py index 37586017..3c98a574 100755 --- a/orm/services/resource_distributor/rds/controllers/v1/status/resource_status.py +++ b/orm/services/resource_distributor/rds/controllers/v1/status/resource_status.py @@ -151,7 +151,6 @@ class Status(rest.RestController): utils.post_data_to_image(data_to_save) except ErrorMessage as exp: logger.error(exp.message) - # raise ClientSideError(status_code=400, error=exp.message) except InputError as e: logger.error("Invalid value for input {}: {}".format(str(e.name), str(e.value))) diff --git a/orm/services/resource_distributor/rds/services/base.py b/orm/services/resource_distributor/rds/services/base.py index 6d5000b2..b30daff6 100644 --- a/orm/services/resource_distributor/rds/services/base.py +++ b/orm/services/resource_distributor/rds/services/base.py @@ -1,4 +1,3 @@ - class Error(Exception): pass diff --git a/orm/services/resource_distributor/rds/services/resource.py b/orm/services/resource_distributor/rds/services/resource.py index 6f45858e..f50ccedf 100755 --- a/orm/services/resource_distributor/rds/services/resource.py +++ b/orm/services/resource_distributor/rds/services/resource.py @@ -181,12 +181,12 @@ def main(jsondata, external_transaction_id, resource_type, operation): except ConflictValue: raise except ErrorMessage as exp: - my_logger.error(exp.message) - my_logger.exception(exp) + my_logger.error(str(exp)) + my_logger.exception(str(exp)) raise except Exception as e: - my_logger.exception(e) + my_logger.exception(str(e)) _set_all_statuses_to_error(input_data) - my_logger.error("deleting fails ,Error : {}".format(str(e.message))) - raise ErrorMessage(str(e.message)) + my_logger.error("deleting fails ,Error : {}".format(str(e))) + raise ErrorMessage(str(e)) return input_data.resource_id diff --git a/orm/services/resource_distributor/rds/services/yaml_customer_builder.py b/orm/services/resource_distributor/rds/services/yaml_customer_builder.py index cdf0e57c..b0682d65 100755 --- a/orm/services/resource_distributor/rds/services/yaml_customer_builder.py +++ b/orm/services/resource_distributor/rds/services/yaml_customer_builder.py @@ -22,7 +22,7 @@ def get_users_quotas(data, region): def _metadata_to_tags(metadata): return '[' + ','.join( - str(k) + '=' + str(v) for i in metadata for k, v in i.iteritems()) + ']' + str(k) + '=' + str(v) for i in metadata for k, v in i.items()) + ']' def yamlbuilder(alldata, region): @@ -139,7 +139,7 @@ class CMSAdjustResource(): for item in items: # rename quota keys as needed - for quota_item in items[item].keys()[:]: + for quota_item in list(items[item].keys())[:]: if quota_item in quotas_keys: items[item][quotas_keys[quota_item]] = items[item][quota_item] new_quota_item_key = quotas_keys[quota_item] diff --git a/orm/services/resource_distributor/rds/services/yaml_flavor_bulder.py b/orm/services/resource_distributor/rds/services/yaml_flavor_bulder.py index 14d1cbc5..af3d5537 100755 --- a/orm/services/resource_distributor/rds/services/yaml_flavor_bulder.py +++ b/orm/services/resource_distributor/rds/services/yaml_flavor_bulder.py @@ -40,15 +40,15 @@ def yamlbuilder(alldata, region): description = {'description': 'yaml file for region - %s' % region['name']} ram = int(alldata['ram']) swap = int(alldata['swap']) - for key, value in alldata['extra_specs'].items(): + for key, value in list(alldata['extra_specs'].items()): extra_specs[key] = value # Handle tags if 'tag' in alldata: - for key, value in alldata['tag'].items(): + for key, value in list(alldata['tag'].items()): extra_specs[key] = value # Handle options if 'options' in alldata: - for key, value in alldata['options'].items(): + for key, value in list(alldata['options'].items()): extra_specs[key] = value # Handle tenants for tenant in alldata['tenants']: diff --git a/orm/services/resource_distributor/rds/services/yaml_image_builder.py b/orm/services/resource_distributor/rds/services/yaml_image_builder.py index 6546a0af..8f6099ea 100755 --- a/orm/services/resource_distributor/rds/services/yaml_image_builder.py +++ b/orm/services/resource_distributor/rds/services/yaml_image_builder.py @@ -18,7 +18,7 @@ def create_full_yaml(title, resources, description, outputs): def _properties(alldata, region): - public = True if alldata['visibility'] == "public" else False + public = alldata['visibility'] protected = {0: False, 1: True}[alldata['protected']] tenants = [tenant['customer_id'] for tenant in alldata['customers']] properties = dict( @@ -30,24 +30,23 @@ def _properties(alldata, region): id=str(uuid.UUID(alldata['id'])), tags=alldata['tags'], protected=protected, - copy_from=alldata["url"], + location=alldata["url"], owner=alldata["owner"], - is_public=public, - tenants=str(tenants) + visibility=alldata['visibility'] ) if region['action'] != 'create': properties['deactivate'] = {1: False, 0: True}[alldata['enabled']] - if alldata['properties']: - properties['extra_properties'] = alldata['properties'] + # if alldata['properties']: + # properties['extra_properties'] = alldata['properties'] return properties def _glanceimage(alldata, region): return dict( - type="OS::Glance::Image2", + type="OS::Glance::WebImage", properties=_properties(alldata, region) ) @@ -61,6 +60,6 @@ def yamlbuilder(alldata, region): description = {'description': 'yaml file for region - %s' % region['name']} resources['resources'] = {"glance_image": _glanceimage(alldata, region)} outputs['outputs'] = { - '%s_id' % image_type: {"value": {"get_resource": "%s" % image_type}}} + '%s_id' % image_type: {"value": "{get_resource: %s}" % image_type}} full_yaml = create_full_yaml(title, resources, description, outputs) return full_yaml diff --git a/orm/services/resource_distributor/rds/sot/base_sot.py b/orm/services/resource_distributor/rds/sot/base_sot.py index f73870cd..f0e8332d 100644 --- a/orm/services/resource_distributor/rds/sot/base_sot.py +++ b/orm/services/resource_distributor/rds/sot/base_sot.py @@ -1,5 +1,4 @@ -""" SoT interface definition -""" +""" SoT interface definition""" class BaseSoT(object): diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_base.py b/orm/services/resource_distributor/rds/sot/git_sot/git_base.py deleted file mode 100644 index 899de37a..00000000 --- a/orm/services/resource_distributor/rds/sot/git_sot/git_base.py +++ /dev/null @@ -1,31 +0,0 @@ - - -class BaseGit(object): - - def git_init(self): - raise NotImplementedError("Please Implement this method") - - def git_upload_changes(self): - raise NotImplementedError("Please Implement this method") - - def git_reset_changes(self): - raise NotImplementedError("Please Implement this method") - - def validate_git(self): - raise NotImplementedError("Please Implement this method") - - -class GitInitError(Exception): - pass - - -class GitUploadError(Exception): - pass - - -class GitResetError(Exception): - pass - - -class GitValidateError(Exception): - pass diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_factory.py b/orm/services/resource_distributor/rds/sot/git_sot/git_factory.py index 542c66e8..5183abe2 100644 --- a/orm/services/resource_distributor/rds/sot/git_sot/git_factory.py +++ b/orm/services/resource_distributor/rds/sot/git_sot/git_factory.py @@ -1,13 +1,10 @@ -from git_gittle import GitGittle -from git_native import GitNative +from .git_native import GitNative def get_git_impl(git_type): """Return the correct Git implementation according to git_type""" git_impl = None - if git_type == 'gittle': - git_impl = GitGittle() - elif git_type == 'native': + if git_type == 'native': git_impl = GitNative() else: raise RuntimeError("Invalid Git implementation!!") diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_gittle.py b/orm/services/resource_distributor/rds/sot/git_sot/git_gittle.py deleted file mode 100755 index d71ed951..00000000 --- a/orm/services/resource_distributor/rds/sot/git_sot/git_gittle.py +++ /dev/null @@ -1,62 +0,0 @@ -import logging - -from git_base import BaseGit, GitInitError, GitUploadError -from gittle import Gittle -from pecan import conf - -logger = logging.getLogger(__name__) - - -class GitGittle(BaseGit): - - def __init__(self): - self.repo = None - - def git_init(self): - try: - # Init repository - logger.debug("Local repository path:{}, Git server url: {}".format(conf.git.local_repository_path, - conf.git.git_server_url)) - self.repo = Gittle(conf.git.local_repository_path, origin_uri=conf.git.git_server_url) - - logger.info("Pulling from git..") - # Update local working copy - self.repo.pull() - - logger.info("GitGittle - Git is up to date !") - - except Exception as exc: - logger.error("GitGittle - Failed to initialize Git. Reason: {}".format(exc.message)) - raise GitInitError(exc.message) - - def git_upload_changes(self): - commit_id = "" - try: - - logger.info("Commit changes in progress ..") - # Stage modified files - self.repo.stage(self.repo.pending_files) - - commit_message = conf.git.commit_message_format.format(self.repo.added_files) - # Commit the change - commit_id = self.repo.commit(conf.git.commit_user, - conf.git.commit_email, - commit_message) - - logger.info("Commit details: commit_user:{}, commit_email:{}, " - "commit_message:{}, commit_id:{}".format(conf.git.commit_user, - conf.git.commit_email, - commit_message, - commit_id)) - - # Push to repository - self.repo.push() - - except Exception as exc: - logger.error("GitGittle - Filed to upload file to git.") - raise GitUploadError("Failed to upload file to Git") - - return commit_id - - def validate_git(self): - pass diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_native.py b/orm/services/resource_distributor/rds/sot/git_sot/git_native.py index cb5b9e3c..c1fa7b2f 100644 --- a/orm/services/resource_distributor/rds/sot/git_sot/git_native.py +++ b/orm/services/resource_distributor/rds/sot/git_sot/git_native.py @@ -2,17 +2,15 @@ import logging import shlex import subprocess -from threading import Timer +from subprocess import TimeoutExpired as ProcessTimeout import time -from git_base import (BaseGit, GitInitError, GitResetError, GitUploadError, - GitValidateError) from pecan import conf logger = logging.getLogger(__name__) -class GitNative(BaseGit): +class GitNative(object): """The native Git implementation.""" def git_init(self): @@ -38,7 +36,7 @@ class GitNative(BaseGit): except GitResetError as exc: msg = "Failed to initialize git repository. " \ - "Reason: {}".format(exc.message) + "Reason: {}".format(str(exc)) logger.error(msg) raise GitInitError(msg) @@ -69,14 +67,14 @@ class GitNative(BaseGit): out, error = self._git_pull(conf.git.local_repository_path) # This check is needed only for Pull before Push. if self._is_error(error): - raise GitNativeError("Git pull error! [{}]".format(error)) + raise GitNativeError("Git pull error: [{}]".format(error)) # Push to repository self._git_push(conf.git.local_repository_path) except GitNativeError as exc: msg = "Failed to upload file to git. " \ - "Reason: {}".format(exc.message) + "Reason: {}".format(str(exc)) logger.error(msg) raise GitUploadError(msg) @@ -94,7 +92,7 @@ class GitNative(BaseGit): logger.info("Git pull error, reset ...") self._git_commit(conf.git.commit_user, conf.git.commit_email, - "Git pull error found !!!", + "Git pull error found.", conf.git.local_repository_path) self._git_reset(conf.git.local_repository_path) @@ -110,16 +108,16 @@ class GitNative(BaseGit): out, error = self._git_pull(conf.git.local_repository_path) # This check is needed only for pull before push. if self._is_error(error): - raise GitNativeError("Git pull error! [{}]".format(error)) + raise GitNativeError("Git pull error: [{}]".format(error)) self._git_push(conf.git.local_repository_path) - logger.info("Git repository state validation check done !") + logger.info("Git repository state validation check done.") except GitNativeError as exc: logger.error("Git state invalid. Reason: [{}]".format( - exc.message)) - raise GitValidateError("Git state invalid !") + str(exc))) + raise GitValidateError("Git state invalid.") def git_reset_changes(self, msg): logger.info("Reset local repository to Git server started.") @@ -135,7 +133,7 @@ class GitNative(BaseGit): except GitNativeError as exc: msg = "Git reset changes failed. " \ - "Reason: {}".format(exc.message) + "Reason: {}".format(str(exc)) logger.error(msg) raise GitResetError(msg) @@ -152,7 +150,7 @@ class GitNative(BaseGit): def _git_add(self, repo_dir): logger.info("Git add started.") - cmd = 'git add --all' + cmd = 'git add -A' out, error = self._execute_git_cmd(cmd, repo_dir) logger.info("Git add done.") return out, error @@ -195,24 +193,20 @@ class GitNative(BaseGit): error = "" proc = subprocess.Popen(shlex.split(cmd), cwd=repo_dir, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - timeout = conf.git.git_cmd_timeout - timer = Timer(timeout, on_subprocess_timeout, [cmd, proc]) + stderr=subprocess.PIPE, + universal_newlines=True) try: - timer.start() - (out, error) = proc.communicate() + (out, error) = proc.communicate(timeout=conf.git.git_cmd_timeout) logger.debug("Cmd proc id: {}".format(proc.pid)) proc.wait() - finally: - if not timer.is_alive(): - msg = "Git command '{}' timed out !!".format(cmd) - logger.error(msg) - # the word error must be in message - error = "error:" + msg - timer.cancel() + except ProcessTimeout: + msg = "Git command '{}' timed out.".format(cmd) + logger.error(msg) + # the word error must be in message + error = "error:" + msg if self._is_error(error): - raise GitNativeError("Git error! [{}]".format(error)) + raise GitNativeError("Git error: [{}]".format(error)) return out, error def _git_pull(self, repo_dir): @@ -222,21 +216,17 @@ class GitNative(BaseGit): start_time = time.time() proc = subprocess.Popen(shlex.split(cmd), cwd=repo_dir, stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - timeout = conf.git.git_cmd_timeout - timer = Timer(timeout, on_subprocess_timeout, [cmd, proc]) + stderr=subprocess.PIPE, + universal_newlines=True) try: - timer.start() - (out, error) = proc.communicate() + (out, error) = proc.communicate(timeout=conf.git.git_cmd_timeout) logger.debug("Cmd proc id: {}".format(proc.pid)) proc.wait() - finally: - if not timer.is_alive(): - msg = "Git command '{}' timed out !!".format(cmd) + except TimeoutError: + msg = "Git command '{}' timed out.".format(cmd) logger.error(msg) # the word error must be in message error = "error:" + msg - timer.cancel() # Special case for pull caller method will check the output if not self._is_error(error): @@ -246,7 +236,7 @@ class GitNative(BaseGit): return out, error def _is_error(self, error): - if error: + if error is not None: l_error = error.lower() if 'error' in l_error or 'fatal' in l_error: logger.error("Git operation returned with " @@ -255,7 +245,7 @@ class GitNative(BaseGit): return False def _is_conflict(self, out): - if out: + if out is not None: l_out = out.lower() if 'conflict' in l_out: logger.info("Git operation returned with " @@ -265,12 +255,27 @@ class GitNative(BaseGit): def on_subprocess_timeout(cmd, proc): - logger.error("Subprocess for command : {}, timed out!".format(cmd)) + logger.error("Subprocess for command: {}, timed out.".format(cmd)) logger.info("Terminating subprocess id: {}".format(proc.pid)) proc.kill() class GitNativeError(Exception): """Describes a generic error in a Git operation.""" - + pass + + +class GitInitError(Exception): + pass + + +class GitUploadError(Exception): + pass + + +class GitResetError(Exception): + pass + + +class GitValidateError(Exception): pass diff --git a/orm/services/resource_distributor/rds/sot/git_sot/git_sot.py b/orm/services/resource_distributor/rds/sot/git_sot/git_sot.py index cbdc78a5..69a1f8c9 100755 --- a/orm/services/resource_distributor/rds/sot/git_sot/git_sot.py +++ b/orm/services/resource_distributor/rds/sot/git_sot/git_sot.py @@ -1,18 +1,14 @@ import logging import os import threading -import time -import git_factory -from git_base import (GitInitError, GitResetError, GitUploadError, - GitValidateError) -from orm.services.resource_distributor.rds.ordupdate.ord_notifier \ - import notify_ord +from . import git_factory +from .git_native import (GitInitError, GitResetError, GitUploadError, + GitValidateError) +from orm.services.resource_distributor.rds.ordupdate.ord_notifier import notify_ord from orm.services.resource_distributor.rds.sot import base_sot from orm.services.resource_distributor.rds.sot.base_sot import SoTError -from pecan import conf - logger = logging.getLogger(__name__) lock = threading.Lock() @@ -53,66 +49,44 @@ class GitSoT(base_sot.BaseSoT): thread.start() -def update_sot_with_retries( - git_impl, my_lock, resource_list, retries_interval=1, retries=1): - commit_id = "" - # Only retry when GitUploadError occurs - while(retries > 0): - try: - logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") - logger.info("Acquire Git lock...") - # Lock the entire git operations, so that no other threads - # change local # files. - my_lock.acquire() - logger.info("Git lock acquired !!!!") - logger.info("Update sot retries count: {}".format(retries)) - - init_git(git_impl) - handle_file_operations(resource_list) - commit_id = update_git(git_impl) - break - except SoTError as exc: - logger.error("Save resource to SoT Git repository failed. " - "Reason: {}.". - format(exc.message)) - break - except GitInitError as init_exc: - logger.error("Initializing Git repository Failed. Reason: {}.". - format(init_exc.message)) - break - except GitUploadError as upload_exc: - logger.error("Uploading to Git repository Failed. Reason: {}.". - format(upload_exc.message)) - cleanup(git_impl) - retries -= 1 - if (retries > 0): - time.sleep(retries_interval) - except Exception as e: - logger.error("Unknown Exception when updating sot: {}".format( - e.message)) - break - finally: - logger.info("Release Git lock...") - my_lock.release() - logger.info("Git lock released !!!!") - logger.info("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") - - return commit_id - - def update_sot(git_impl, my_lock, tracking_id, transaction_id, resource_list, application_id, user_id, headers={}): logger.info("Save resource to SoT. start ...") + commit_id = "" + result = False + logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") + logger.info("Acquiring Git lock...") + # Lock the entire git operations, so that no other threads change local + # files. + my_lock.acquire() + logger.info("Git lock acquired.") + try: + init_git(git_impl) - commit_id = update_sot_with_retries( - git_impl, - my_lock, - resource_list, - retries_interval=conf.git.git_retries_interval, - retries=conf.git.git_retries) + handle_file_operations(resource_list) - if commit_id: - logger.info("All files were successfully updated in Git server :-)\n") + commit_id = update_git(git_impl) + + logger.info("All files were successfully updated in Git server") + + result = True + + except SoTError as exc: + logger.error("Saving resource to SoT Git repository failed. " + "Reason: {}.". + format(str(exc))) + except GitInitError as init_exc: + logger.error("Initializing Git repository Failed. Reason: {}.". + format(str(init_exc))) + except GitUploadError as upload_exc: + logger.error("Uploading to Git repository Failed. Reason: {}.". + format(str(upload_exc))) + cleanup(git_impl) + finally: + logger.info("Releasing Git lock...") + my_lock.release() + logger.info("Git lock released.") + logger.info("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") # This method is called also in case exception raised. # Notification to ords will not be sent but status db and audit @@ -131,11 +105,11 @@ def update_sot(git_impl, my_lock, tracking_id, transaction_id, resource_list, application_id, # application_id is not available user_id, # user_id is not available "NA", # external_id is not available - not commit_id, + not result, headers) except Exception as e: - logger.error("Error in updating ORD! Error: {}".format( - e.message + logger.error("Error in updating ORD. Error: {}".format( + str(e) )) @@ -152,11 +126,11 @@ def handle_file_operations(resource_list): logger.info("File successfully deleted!") except OSError as ex: msg = "Could not delete file. " \ - "Reason: {}".format(ex.message) + "Reason: {}".format(str(ex)) logger.error(msg) raise SoTError(msg) else: - logger.info("File does not exist, nothing to delete..") + logger.info("File does not exist, nothing to delete.") else: # for all other operations "modify", "create" logger.info("Adding file: {}".format(file_path)) @@ -178,7 +152,7 @@ def create_file_in_path(file_path, file_data): logger.info("Creating file : {}".format(file_path)) create_dir(file_path) - logger.debug("Directory path created..") + logger.debug("Directory path created.") write_data_to_file(file_path, file_data) logger.info("Data written to file.") @@ -192,7 +166,7 @@ def create_dir(file_path): os.makedirs(f_path) except OSError as ex: msg = "Failed to create directory path. " \ - "Reason: {}".format(ex.message) + "Reason: {}".format(str(ex)) logger.error(msg) raise SoTError(msg) @@ -204,7 +178,7 @@ def write_data_to_file(file_path, file_data): fo.write(file_data) except IOError as ex: msg = "Could not write data to file. " \ - "Reason: {}".format(ex.message) + "Reason: {}".format(str(ex)) logger.error(msg) raise SoTError(msg) else: @@ -215,9 +189,10 @@ def init_git(git_impl): try: git_impl.git_init() except GitInitError as exc: - logger.error("Failed to initialize Git. " - "Reason: {}".format(exc.message)) - raise + msg = "Failed to initialize Git. " \ + "Reason: {}".format(str(exc)) + logger.error(msg) + raise GitInitError(msg) def update_git(git_impl): @@ -225,32 +200,32 @@ def update_git(git_impl): try: commit_id = git_impl.git_upload_changes() except GitUploadError as exc: - logger.error(exc.message) - raise + logger.error(str(exc)) + raise GitUploadError(str(exc)) return commit_id def validate_git(git_impl, my_lock): logger.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") - logger.info("Acquire Git lock...") + logger.info("Acquiring Git lock...") my_lock.acquire() - logger.info("Git lock acquired !!!!") + logger.info("Git lock acquired.") try: git_impl.validate_git() except GitValidateError as exc: logger.error("Git validation error. Reason: {}.". - format(exc.message)) + format(str(exc))) finally: - logger.info("Release Git lock...") + logger.info("Releasing Git lock...") my_lock.release() - logger.info("Git lock released !!!!") + logger.info("Git lock released.") logger.info("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") def cleanup(git_impl): logger.info("Cleanup started...") try: - git_impl.git_reset_changes("Clean up changes due to upload error.") + git_impl.git_reset_changes("Cleaning up changes due to an upload error.") except GitResetError as exc: - logger.error(exc.message) - raise SoTError(exc.message) + logger.error(str(exc)) + raise SoTError(str(exc)) diff --git a/orm/services/resource_distributor/rds/sot/sot_utils.py b/orm/services/resource_distributor/rds/sot/sot_utils.py index 12978d79..ad629ee9 100644 --- a/orm/services/resource_distributor/rds/sot/sot_utils.py +++ b/orm/services/resource_distributor/rds/sot/sot_utils.py @@ -11,7 +11,7 @@ def merge_yamls(document, section): # source is being merged into destiantion def merge_dict(source, destination): - for key, value in source.items(): + for key, value in list(source.items()): if isinstance(value, dict): # get node or create one node = destination.setdefault(key, {}) @@ -40,4 +40,4 @@ section = """ h1: h2 """ -print(merge_yamls(document, section)) +print((merge_yamls(document, section))) diff --git a/orm/services/resource_distributor/rds/storage/mysql/region_resource_id_status.py b/orm/services/resource_distributor/rds/storage/mysql/region_resource_id_status.py index e015e439..8eb344f6 100755 --- a/orm/services/resource_distributor/rds/storage/mysql/region_resource_id_status.py +++ b/orm/services/resource_distributor/rds/storage/mysql/region_resource_id_status.py @@ -2,7 +2,7 @@ import logging import oslo_db import time -from oslo_db.sqlalchemy import session as db_session +from oslo_db.sqlalchemy.enginefacade import LegacyEngineFacade from pecan import conf from orm.services.resource_distributor.rds.services.model.region_resource_id_status \ @@ -37,7 +37,7 @@ class ResourceStatusRecord(Base): class ImageMetadData(Base): __tablename__ = 'image_metadata' - image_meta_data_id = Column(ForeignKey(u'resource_status.id'), + image_meta_data_id = Column(ForeignKey('resource_status.id'), primary_key=True) checksum = Column(Text, primary_key=False) virtual_size = Column(Text, primary_key=False) @@ -47,7 +47,7 @@ class ImageMetadData(Base): class RegionEndPoint(Base): __tablename__ = 'region_end_point' - region_id = Column(ForeignKey(u'region.region_id'), primary_key=True) + region_id = Column(ForeignKey('region.region_id'), primary_key=True) end_point_type = Column(String(64), primary_key=True) public_url = Column(String(64), nullable=False) @@ -68,7 +68,7 @@ class Connection(region_resource_id_status.Base): """ Implements mysql DB """ def __init__(self, url): - self._engine_facade = db_session.EngineFacade(url) + self._engine_facade = LegacyEngineFacade(url) def add_update_status_record(self, timestamp, diff --git a/orm/services/resource_distributor/tox.ini b/orm/services/resource_distributor/tox.ini deleted file mode 100755 index 9891056a..00000000 --- a/orm/services/resource_distributor/tox.ini +++ /dev/null @@ -1,21 +0,0 @@ -[tox] -envlist = py27, cover - -[testenv:cover] - -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - -install_command = pip install -U {opts} {packages} - -setenv = PYTHONPATH = {toxinidir}:{toxinidir}/rds/utils/module_mocks/ - -commands = - python setup.py testr --slowest --coverage - coverage report --omit=rds/storage/factory.py,rds/api/app.py,rds/tests/*,rds/utils/authentication.py,rds/sot/sot_utils.py,rds/utils/module_mocks/* - coverage html --omit=rds/storage/factory.py,rds/api/app.py,rds/tests/*,rds/utils/authentication.py,rds/sot/sot_utils.py,rds/utils/module_mocks/* - -[testenv:pep8] -whitelist_externals=true -commands=true - diff --git a/orm/tests/unit/audit_server/storage/mysql/test_transaction.py b/orm/tests/unit/audit_server/storage/mysql/test_transaction.py index a5f6c9fa..1ee7cb94 100755 --- a/orm/tests/unit/audit_server/storage/mysql/test_transaction.py +++ b/orm/tests/unit/audit_server/storage/mysql/test_transaction.py @@ -1,14 +1,13 @@ """test_transaction module.""" -import unittest - from orm.services.audit_trail_manager.audit_server.model.transaction import Model as TransactionModel from orm.services.audit_trail_manager.audit_server.model.transaction_query import Model as TransactionQueryModel -from orm.services.audit_trail_manager.audit_server.storage.mysql.transaction import Connection, Record -from mock import patch from sqlalchemy import create_engine -from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import sessionmaker +import unittest +from unittest.mock import patch + +from orm.services.audit_trail_manager.audit_server.storage.mysql.transaction import Connection, Record class Test(unittest.TestCase): @@ -58,10 +57,9 @@ class Test(unittest.TestCase): test that when session.add throws Duplicate Entry exception, no expcetion is thrown back. """ - side_effect = IntegrityError(None, None, None, None) - side_effect.message = "Duplicate entry" + side_effect = Exception("Duplicate entry") mock_session = self.mock_sessionmaker.return_value.__call__ - mock_add = mock_session.im_self.add + mock_add = mock_session.__self__.add mock_add.side_effect = side_effect self.conn.add_record(self.transaction) @@ -71,13 +69,12 @@ class Test(unittest.TestCase): test that when session.add throws a different exception than Duplicate Entry it will be rasied up. """ - side_effect = IntegrityError(None, None, None, None) - side_effect.message = "Some other integrity error" + side_effect = Exception("Some other integrity error") mock_session = self.mock_sessionmaker.return_value.__call__ - mock_add = mock_session.im_self.add - mock_add.side_effect = IntegrityError("Some other integrity error", - None, None, None) - self.assertRaises(IntegrityError, self.conn.add_record, + mock_add = mock_session.__self__.add + mock_add.side_effect = Exception("Some other integrity error") +# None, None, None) + self.assertRaises(Exception, self.conn.add_record, self.transaction) def test_get_records(self): @@ -106,9 +103,9 @@ class Test(unittest.TestCase): # order_by().limit() Therefore we will need to mock the entire # call tree in order to set the required returned value mock_session = self.mock_sessionmaker.return_value.__call__ - mock_query = mock_session.im_self.query + mock_query = mock_session.__self__.query mock_filter = mock_query.return_value.filter - for key in range(len(self.transaction_query.__dict__.keys()) - 1): + for key in range(len(list(self.transaction_query.__dict__.keys())) - 1): mock_filter = mock_filter.return_value.filter mock_order_by = mock_filter.return_value.order_by mock_limit = mock_order_by.return_value.limit diff --git a/orm/tests/unit/cms/config.py b/orm/tests/unit/cms/config.py index aaab6997..d0cca62c 100755 --- a/orm/tests/unit/cms/config.py +++ b/orm/tests/unit/cms/config.py @@ -108,7 +108,7 @@ if not ('CMS_ENV' in os.environ) or not (os.environ['CMS_ENV'] in api_options): cms_mode = 'dev' else: cms_mode = os.environ['CMS_ENV'] - print('Environment variable found, running under <{0}> environment'.format(cms_mode)) + print(('Environment variable found, running under <{0}> environment'.format(cms_mode))) api = api_options[cms_mode] diff --git a/orm/tests/unit/cms/test_customer.py b/orm/tests/unit/cms/test_customer.py index b5ed27c3..7d27a77f 100755 --- a/orm/tests/unit/cms/test_customer.py +++ b/orm/tests/unit/cms/test_customer.py @@ -1,11 +1,11 @@ import requests +import sqlalchemy from orm.services.customer_manager.cms_rest.controllers.v1.orm.customer import root from orm.services.customer_manager.cms_rest.logic.error_base import ErrorStatus from orm.services.customer_manager.cms_rest.model import Models from orm.tests.unit.cms import FunctionalTest, test_utils -import mock -import sqlalchemy +from unittest import mock from wsme.exc import ClientSideError customer_logic_mock = None @@ -72,7 +72,6 @@ class TestCustomerController(FunctionalTest): response = self.app.post_json('/v1/orm/customers', CUSTOMER_JSON, expect_errors=True) - self.assertEqual(response.status_int, 409) def test_create_flavor_duplicate_uuid(self): diff --git a/orm/tests/unit/common/test_api_error_hook.py b/orm/tests/unit/common/test_api_error_hook.py index 3eabe613..cad0d792 100755 --- a/orm/tests/unit/common/test_api_error_hook.py +++ b/orm/tests/unit/common/test_api_error_hook.py @@ -1,6 +1,6 @@ import json import logging -from unittest import TestCase +from unittest import mock, TestCase import mock from orm.common.orm_common.hooks import api_error_hook @@ -9,6 +9,7 @@ logger = logging.getLogger(__name__) class TestAPIErrorHook(TestCase): + @mock.patch.object(api_error_hook, 'err_utils') @mock.patch.object(api_error_hook, 'json') def test_after_401(self, mock_json, mock_err_utils): @@ -21,7 +22,7 @@ class TestAPIErrorHook(TestCase): state.response.status_code = 401 a.after(state) self.assertEqual(state.response.body, - json.dumps(mock_err_utils.get_error_dict.return_value)) + json.dumps(mock_err_utils.get_error_dict.return_value).encode("UTF-8")) @mock.patch.object(api_error_hook, 'err_utils') def test_after_not_an_error(self, mock_err_utils): @@ -30,40 +31,46 @@ class TestAPIErrorHook(TestCase): mock_err_utils.get_error_dict.return_value = 'B' state.response.body = 'AAAA' - temp = state.response.body + temp = state.response.json # A successful status code state.response.status_code = 201 a.after(state) # Assert that the response body hasn't changed - self.assertEqual(state.response.body, temp) + self.assertEqual(state.response.json, temp) @mock.patch.object(api_error_hook, 'err_utils') - @mock.patch.object(api_error_hook.json, 'loads', - side_effect=ValueError('test')) + @mock.patch.object(api_error_hook, 'json') def test_after_error(self, mock_json, mock_err_utils): + # real object to test mock state a = api_error_hook.APIErrorHook() + # create mock state state = mock.MagicMock() - - mock_err_utils.get_error_dict.return_value = 'B' - state.response.body = 'AAAA' - - mock_json.loads = mock.MagicMock(side_effect=ValueError('sd')) + # assign relevant state values for testing failure of api_error_hook state.response.status_code = 402 + state.response.body = json.dumps({'AAAA': 'a'}).encode("UTF-8") + + # re-create json loading functionality but produces mock side effect + mock_json.dumps = json.dumps + mock_json.loads = json.loads + mock_json.loads = mock.Mock(side_effect=ValueError('sd')) + + # assume err_utils will return this content and will set state.response.body to it + mock_err_utils.get_error_dict.return_value = json.loads('{"B" : "b"}') a.after(state) - self.assertEqual(state.response.body, - json.dumps(mock_err_utils.get_error_dict.return_value)) + + # assert previous assumption is true + self.assertEqual(json.loads(state.response.body), + mock_err_utils.get_error_dict.return_value) @mock.patch.object(api_error_hook, 'err_utils') @mock.patch.object(api_error_hook, 'json') def test_after_success(self, mock_json, mock_err_utils): a = api_error_hook.APIErrorHook() state = mock.MagicMock() - - mock_err_utils.get_error_dict.return_value = 'B' + state.response.status_code = 404 + state.response.body = json.dumps({"debuginfo": "null", "faultcode": "Client", "faultstring": '{"type": "Not Found", "created": "1475768730.95", "message": "customer: q not found"}'}).encode("UTF-8") mock_json.loads = json.loads mock_json.dumps = json.dumps - mock_json.loads = json.loads - state.response.body = '{"debuginfo": null, "faultcode": "Client", "faultstring": "{\\"code\\": 404, \\"created\\": \\"1475768730.95\\", \\"details\\": \\"\\", \\"message\\": \\"customer: q not found\\", \\"type\\": \\"Not Found\\", \\"transaction_id\\": \\"mock_json5efa7416fb4d408cc0e30e4373cf00\\"}"}' - state.response.status_code = 400 + mock_err_utils.get_error_dict.return_value = json.loads('{"message": "customer: q not found", "created": "1475768730.95", "type": "Not Found", "details": "", "code": 404, "transaction_id": "mock_json5efa7416fb4d408cc0e30e4373cf00"}') a.after(state) - self.assertEqual(json.loads(state.response.body), json.loads('{"message": "customer: q not found", "created": "1475768730.95", "type": "Not Found", "details": "", "code": 404, "transaction_id": "mock_json5efa7416fb4d408cc0e30e4373cf00"}')) + self.assertEqual(json.loads(state.response.body), mock_err_utils.get_error_dict.return_value) diff --git a/orm/tests/unit/common/test_api_error_utils.py b/orm/tests/unit/common/test_api_error_utils.py index 7f840d50..e76c7c3a 100755 --- a/orm/tests/unit/common/test_api_error_utils.py +++ b/orm/tests/unit/common/test_api_error_utils.py @@ -9,7 +9,7 @@ class TestCrossApiUtil(TestCase): @mock.patch.object(api_error_utils.utils, 'get_time_human', return_value=1.337) def test_get_error_default_message(self, mock_time): self.assertEqual( - json.loads(api_error_utils.get_error('test', 'a').message), + json.loads(str(api_error_utils.get_error('test', 'a'))), {"details": "a", "message": "Incompatible JSON body", "created": "1.337", "code": 400, "type": "Bad Request", "transaction_id": "test"}) diff --git a/orm/tests/unit/common/test_audit.py b/orm/tests/unit/common/test_audit.py index f6cceb8f..13b21998 100755 --- a/orm/tests/unit/common/test_audit.py +++ b/orm/tests/unit/common/test_audit.py @@ -1,14 +1,11 @@ -"""test_audit module.""" - import json import threading import unittest -import urllib2 - -from orm.common.client.audit.audit_client.api import audit -from orm.common.client.audit.audit_client.api.exceptions.audit_exception import AuditException +import urllib.request from mock import patch +from orm.common.client.audit.audit_client.api import audit +from orm.common.client.audit.audit_client.api.exceptions.audit_exception import AuditException class Test(unittest.TestCase): @@ -148,11 +145,11 @@ class Test(unittest.TestCase): audit.config['TIME_WAIT_BETWEEN_RETRIES'] = None self.assertRaises(AuditException, audit._validate) - @patch.object(urllib2, 'urlopen') + @patch.object(urllib.request, 'urlopen') @patch.object(json, 'load', return_value=data) def test_get_audits(self, mock_urlopen, mock_load): """test get_audits.""" - audit_server_url = "audit_server_url_1" + audit_server_url = "http://audit_server_url_1" num_of_send_retries = 5 time_wait_between_retries = 10 audit.init(audit_server_url, num_of_send_retries, @@ -160,11 +157,11 @@ class Test(unittest.TestCase): result = audit.get_audits() self.assertEqual(len(result.transactions), 3) - @patch.object(urllib2, 'urlopen') + @patch.object(urllib.request, 'urlopen') @patch.object(json, 'load') def test_audit_thread(self, mock_urlopen, mock_load): """Test audit_thread is executed with no exceptions.""" - audit_server_url = "audit_server_url_1" + audit_server_url = "http://audit_server_url_1" num_of_send_retries = 5 time_wait_between_retries = 10 audit.init(audit_server_url, num_of_send_retries, @@ -184,18 +181,18 @@ class Test(unittest.TestCase): resource_id, service_name, user_id, external_id, event_details) - @patch.object(urllib2, 'urlopen') + @patch.object(urllib.request, 'urlopen') @patch.object(json, 'load') def test_post_data(self, mock_urlopen, mock_load): """test that post_data is executed with no exceptions.""" - audit_server_url = "audit_server_url_1" + audit_server_url = "http://audit_server_url_1" num_of_send_retries = 5 time_wait_between_retries = 10 audit.init(audit_server_url, num_of_send_retries, time_wait_between_retries) audit._post_data(None) - @patch.object(urllib2, 'urlopen', side_effect=Exception) + @patch.object(urllib.request, 'urlopen', side_effect=Exception) @patch.object(json, 'load') def test_post_data_with_retry_exception(self, mock_urlopen, mock_load): """test post data with retry_exception. @@ -203,7 +200,7 @@ class Test(unittest.TestCase): test that post_data throws an exception when trying to send a data for num_of_send_retries """ - audit_server_url = "audit_server_url_1" + audit_server_url = "http://audit_server_url_1" num_of_send_retries = 1 time_wait_between_retries = 1 audit.init(audit_server_url, num_of_send_retries, @@ -235,7 +232,7 @@ class Test(unittest.TestCase): @patch.object(threading, 'Thread') def test_audit(self, mock_thread): """test that audit is exceuted with no exception.""" - audit_server_url = "audit_server_url_1" + audit_server_url = "http://audit_server_url_1" num_of_send_retries = 1 time_wait_between_retries = 1 audit.init(audit_server_url, num_of_send_retries, @@ -256,7 +253,7 @@ class Test(unittest.TestCase): def test_get_data(self): """test get data.""" - audit_server_url = "audit_server_url_1" + audit_server_url = "http://audit_server_url_1" num_of_send_retries = 1 time_wait_between_retries = 1 audit.init(audit_server_url, num_of_send_retries, diff --git a/orm/tests/unit/common/test_injector.py b/orm/tests/unit/common/test_injector.py index 09303d70..201caf31 100755 --- a/orm/tests/unit/common/test_injector.py +++ b/orm/tests/unit/common/test_injector.py @@ -1,9 +1,9 @@ +import importlib import logging -import os -from unittest import TestCase - -import mock from orm.common.orm_common.injector import injector +import os +from unittest import mock, TestCase + logger = logging.getLogger(__name__) @@ -35,24 +35,23 @@ class TestInjector(TestCase): def test_get_di(self): injector.get_di() - @mock.patch.object(injector, 'logger') - def test_import_file_by_name_ioerror(self, mock_logger): - injector.logger = mock.MagicMock() - # Calling it with ('', '.') should raise an IOError + def test_import_file_by_name_file_not_found_error(self): + # Calling it with ('', '.') should raise a FileNotFoundError # (no such file or directory) - self.assertRaises(IOError, injector._import_file_by_name, '', '.') + self.assertRaises(FileNotFoundError, injector._import_file_by_name, '', '.') - @mock.patch.object(injector.imp, 'load_source', return_value='test') - def test_import_file_by_name_sanity(self, mock_load_source): - self.assertEqual(injector._import_file_by_name('', '.'), 'test') + @mock.patch.object(injector.os.path, 'join') + @mock.patch.object(injector.importlib.util, 'module_from_spec') + @mock.patch.object(injector.importlib.util, 'spec_from_file_location') + def test_import_file_by_name_sanity(self, mock_spec, mock_module, mock_os): + mock_os.return_value = ['mock_providers.py'] + mock_spec.return_value = mock.Mock() + mock_module.return_value = type('mock_providers', (object,), {'providers': ['a1']})() + mock_provider = injector._import_file_by_name('mock', '') + test_module = importlib.util.module_from_spec(type('mock_providers', (object,), {'providers': ['a1']})()) + self.assertIsInstance(mock_provider, type(test_module)) @mock.patch.object(injector._di.providers, 'register_instance') def test_override_injected_dependency(self, mock_di): injector.override_injected_dependency((1, 2,)) self.assertTrue(mock_di.called) - - ''' - @mock.patch.object(ResourceProviderRegister, 'register_instance') - def test_override_injected_dependency(self, mock_resourceProviderRegister): - injector.override_injected_dependency(mock.Mock()) - ''' diff --git a/orm/tests/unit/common/test_utils.py b/orm/tests/unit/common/test_utils.py index 930a116f..02c69bfc 100755 --- a/orm/tests/unit/common/test_utils.py +++ b/orm/tests/unit/common/test_utils.py @@ -1,9 +1,7 @@ -import logging -import mock -from orm.common.orm_common.utils import utils import pprint -from testfixtures import log_capture -from unittest import TestCase + +from orm.common.orm_common.utils import utils +from unittest import mock, TestCase class TestUtil(TestCase): @@ -23,7 +21,7 @@ class TestUtil(TestCase): uuid = utils.create_or_validate_uuid('', 'uuidtype') self.assertEqual(uuid, '987654321') - @log_capture('orm.common.orm_common.utils.utils', level=logging.INFO) + @mock.patch('orm.common.orm_common.utils.utils.LOG') @mock.patch('requests.post') def test_make_uuid_offline(self, mock_post, log): mock_post.side_effect = Exception('boom') @@ -38,8 +36,8 @@ class TestUtil(TestCase): uuid = utils.make_transid() self.assertEqual(uuid, '987654321') + @mock.patch('orm.common.orm_common.utils.utils.LOG') @mock.patch('requests.post') - @log_capture('orm_common.utils.utils', level=logging.INFO) def test_make_transid_offline(self, mock_post, l): mock_post.side_effect = Exception('boom') uuid = utils.make_transid() diff --git a/orm/tests/unit/fms/test_rds_proxy.py b/orm/tests/unit/fms/test_rds_proxy.py index ee3b1ca9..e3fc5a2c 100755 --- a/orm/tests/unit/fms/test_rds_proxy.py +++ b/orm/tests/unit/fms/test_rds_proxy.py @@ -1,9 +1,8 @@ from orm.services.flavor_manager.fms_rest.data.sql_alchemy import db_models -from orm.services.flavor_manager.fms_rest import proxies +from orm.services.flavor_manager.fms_rest.proxies import rds_proxy from orm.tests.unit.fms import FunctionalTest import mock -from testfixtures import log_capture class Response: @@ -17,29 +16,29 @@ class Response: class TestUtil(FunctionalTest): - @log_capture('orm.services.flavor_manager.fms_rest.proxies.rds_proxy') - @mock.patch.object(proxies.rds_proxy, 'request') + @mock.patch('orm.services.flavor_manager.fms_rest.proxies.rds_proxy.LOG') + @mock.patch.object(rds_proxy, 'request') @mock.patch('requests.post') - def test_send_good(self, mock_post, mock_request, l): + def test_send_good(self, mock_post, mock_request, mock_log): resp = Response(200, 'my content') mock_post.return_value = resp - send_res = proxies.rds_proxy.send_flavor(db_models.Flavor().todict(), "1234", "post") - # self.assertRegexpMatches(l.records[-2].getMessage(), 'Wrapper JSON before sending action') - # self.assertRegexpMatches(l.records[-1].getMessage(), 'return from rds server status code') + send_res = rds_proxy.send_flavor(db_models.Flavor().todict(), "1234", "post") + # self.assertRegexpMatches(mock_log.records[-2].getMessage(), 'Wrapper JSON before sending action') + # self.assertRegexpMatches(mock_log.records[-1].getMessage(), 'return from rds server status code') + @mock.patch('orm.services.flavor_manager.fms_rest.proxies.rds_proxy.LOG') @mock.patch('requests.post') - @log_capture('orm.services.flavor_manager.fms_rest.proxies.rds_proxy') - def test_bad_status(self, mock_post, l): + def test_bad_status(self, mock_post, mock_log): resp = Response(400, 'my content') mock_post.return_value = resp - # self.assertRegexpMatches(l.records[-2].getMessage(), 'Wrapper JSON before sending action') - # self.assertRegexpMatches(l.records[-1].getMessage(), 'return from rds server status code') + # self.assertRegexpMatches(mock_log.records[-2].getMessage(), 'Wrapper JSON before sending action') + # self.assertRegexpMatches(mock_log.records[-1].getMessage(), 'return from rds server status code') + @mock.patch('orm.services.flavor_manager.fms_rest.proxies.rds_proxy.LOG') @mock.patch('requests.post') - @log_capture('orm.services.flavor_manager.fms_rest.proxies.rds_proxy') - def test_no_content(self, mock_post, l): + def test_no_content(self, mock_post, mock_log): resp = Response(200, None) mock_post.return_value = resp # self.assertRaises(ErrorStatus, proxies.rds_proxy.send_flavor, db_models.Flavor(), "1234") - for r in l.records: + for r in mock_log.records: self.assertNotRegexpMatches(r.getMessage(), 'return from rds server status code') diff --git a/orm/tests/unit/ims/controllers/v1/orm/images/test_metadata.py b/orm/tests/unit/ims/controllers/v1/orm/images/test_metadata.py index 4ad15b8e..fcad159e 100755 --- a/orm/tests/unit/ims/controllers/v1/orm/images/test_metadata.py +++ b/orm/tests/unit/ims/controllers/v1/orm/images/test_metadata.py @@ -51,7 +51,7 @@ class TestMetaDataController(FunctionalTest): metadata_input, expect_errors=True) self.assertEqual(404, response.status_code) self.assertEqual(json.loads(response.json['faultstring'])['message'], - 'not found') + "(404, 'not found')") @mock.patch.object(metadata, 'err_utils') @mock.patch.object(metadata, 'di') diff --git a/orm/tests/unit/ims/controllers/v1/orm/test_logs.py b/orm/tests/unit/ims/controllers/v1/orm/test_logs.py index 6672a47f..1727863c 100755 --- a/orm/tests/unit/ims/controllers/v1/orm/test_logs.py +++ b/orm/tests/unit/ims/controllers/v1/orm/test_logs.py @@ -25,7 +25,7 @@ class TestLogsController(FunctionalTest): level = "not_valid_level" response = self.app.put('/v1/orm/logs/{}'.format(level), expect_errors=True) - print response + print(response) self.assertEqual(response.status_code, 400) self.assertEqual(response.json['faultstring'], "The given log level [{}] doesn't exist.".format( @@ -35,8 +35,9 @@ class TestLogsController(FunctionalTest): level = "not_valid_level" response = self.app.put('/v1/orm/logs/{}'.format(level), expect_errors=True) - print response + print(response) self.assertEqual(response.status_code, 400) + print(response.json['faultstring']) self.assertEqual(response.json['faultstring'], "The given log level [{}] doesn't exist.".format( level)) diff --git a/orm/tests/unit/ims/logic/test_image_logic.py b/orm/tests/unit/ims/logic/test_image_logic.py index 54d22265..db2c5693 100755 --- a/orm/tests/unit/ims/logic/test_image_logic.py +++ b/orm/tests/unit/ims/logic/test_image_logic.py @@ -65,16 +65,17 @@ resolved_regions = [{'type': 'single', 'name': 'rdm1'}] visibility = "private" regions = [] -image_status_dict = {u'regions': [{u'status': u'Submitted', - u'resource_id': - u'edf1a8152b974eb28a6f4aa3dee3190d', - u'timestamp': 1471954276950, - u'region': u'rdm1', - u'ord_notifier_id': u'', - u'ord_transaction_id': - u'b18836a0-692a-11e6-82f3-005056a5129b', - u'error_code': u'', u'error_msg': u''}], - u'status': u'Pending'} + +image_status_dict = {'regions': [{ + 'status': 'Submitted', + 'resource_id': 'edf1a8152b974eb28a6f4aa3dee3190d', + 'timestamp': 1471954276950, + 'region': 'rdm1', + 'ord_notifier_id': '', + 'ord_transaction_id': 'b18836a0-692a-11e6-82f3-005056a5129b', + 'error_code': '', + 'error_msg': '', + }], 'status': 'Pending'} class TestImageLogic(FunctionalTest): @@ -303,7 +304,7 @@ class TestActivateImageLogic(FunctionalTest): try: image_logic.enable_image("test_id", 1, "transaction_id") except Exception as e: - self.assertEqual(e.message, 'activate_test') + self.assertEqual(str(e), 'activate_test') class TestListImageLogic(FunctionalTest): @@ -335,7 +336,7 @@ class TestListImageLogic(FunctionalTest): try: image_logic.get_image_list_by_params('a', 'b', 'c') except Exception as e: - self.assertEqual(e.message, '') + self.assertEqual(str(e), '') @mock.patch.object(image_logic, 'di') @mock.patch.object(image_logic, 'ImageWrapper') diff --git a/orm/tests/unit/ormcli/test_cmscli.py b/orm/tests/unit/ormcli/test_cmscli.py index c4147542..8cd895fa 100755 --- a/orm/tests/unit/ormcli/test_cmscli.py +++ b/orm/tests/unit/ormcli/test_cmscli.py @@ -1,4 +1,4 @@ -from cStringIO import StringIO +from io import StringIO import json import mock import requests @@ -256,6 +256,7 @@ class CmsTests(TestCase): mock_validate_args): mock_post.return_value = self.respond(TJ, 200) mock_get.return_value = self.respond(TJ, 204, oy=True) + mock_get.__name__ = 'test' with self.assertRaises(SystemExit) as cm: args = ormcli.main('orm cms list_groups t'.split()) self.assertEqual(cm.exception.code, 0) diff --git a/orm/tests/unit/ormcli/test_fmscli.py b/orm/tests/unit/ormcli/test_fmscli.py index 8ce4b235..08d82106 100755 --- a/orm/tests/unit/ormcli/test_fmscli.py +++ b/orm/tests/unit/ormcli/test_fmscli.py @@ -1,12 +1,12 @@ from orm.orm_client.ormcli import fmscli from orm.orm_client.ormcli import ormcli -from cStringIO import StringIO +from io import StringIO import json -import mock import requests import sys +from unittest import mock from unittest import TestCase TJ = {'access': {'token': {'id': 'test'}}} @@ -141,6 +141,7 @@ class FmsTests(TestCase): mock_validate_args): mock_post.return_value = self.respond(TJ, 200) mock_get.return_value = self.respond(TJ, 204, oy=True) + mock_get.__name__ = 'test' with self.assertRaises(SystemExit) as cm: args = ormcli.main('orm fms list_flavors t'.split()) self.assertEqual(cm.exception.code, 0) diff --git a/orm/tests/unit/ormcli/test_imscli.py b/orm/tests/unit/ormcli/test_imscli.py index d41760b7..9991df5a 100755 --- a/orm/tests/unit/ormcli/test_imscli.py +++ b/orm/tests/unit/ormcli/test_imscli.py @@ -1,4 +1,4 @@ -from cStringIO import StringIO +from io import StringIO import mock import requests import sys @@ -107,22 +107,18 @@ class ImsTests(TestCase): @mock.patch.object(imscli, 'cli_common') @mock.patch.object(imscli, 'validate_args') - @mock.patch('requests.get') - @mock.patch('requests.post') + @mock.patch.object(imscli.requests, 'post') + @mock.patch.object(imscli.requests, 'get') @mock.patch.object(imscli.cli_common, 'get_token') @mock.patch.object(imscli, 'globals') def test_list_images_bad_request(self, mock_get_token, mock_globals, mock_post, mock_get, mock_validate_args, mock_common): mock_post.return_value = self.respond( - {"access": {"token": {"id": 989}}}, 201) - cli = ormcli.Cli() - cli.create_parser() - cli.parse( - 'orm ims list_images client1 --visibility public --region a ' - '--customer b'.split()) - resp = self.respond({"access": {"token": {"id": 989}}}, 200) + {"access": {"token": {"id": 989}}}, 301) + mock_post.__name__ = 'test' + mock_get.__name__ = 'test' with self.assertRaises(SystemExit) as cm: - cli.logic() + args = ormcli.main('orm ims list_images b'.split()) self.assertEqual(cm.exception.code, 1) sys.stdout.seek(0) output = sys.stdout.read() diff --git a/orm/tests/unit/ormcli/test_rmscli.py b/orm/tests/unit/ormcli/test_rmscli.py index 934ea6be..5f3b309d 100755 --- a/orm/tests/unit/ormcli/test_rmscli.py +++ b/orm/tests/unit/ormcli/test_rmscli.py @@ -1,4 +1,4 @@ -from cStringIO import StringIO +from io import StringIO import json import mock from orm.orm_client.ormcli import ormcli @@ -133,6 +133,7 @@ class RmsTests(TestCase): mock_validate_args): mock_post.return_value = self.respond(TJ, 200) mock_get.return_value = self.respond(TJ, 204) + mock_get.__name__ = 'test' with self.assertRaises(SystemExit) as cm: args = ormcli.main('orm rms list_regions t'.split()) self.assertEqual(cm.exception.code, 0) diff --git a/orm/tests/unit/rds/config.py b/orm/tests/unit/rds/config.py index 31fe582f..35fe36d1 100755 --- a/orm/tests/unit/rds/config.py +++ b/orm/tests/unit/rds/config.py @@ -16,26 +16,24 @@ database = { } sot = { - 'type': 'git', + 'type': 'git' } git = { - # possible values : 'native', 'gittle' - 'type': 'gittle', + 'type': 'native', 'local_repository_path': '/home/orm/SoT/ORM', 'file_name_format': 's_{}.yml', 'relative_path_format': '/Document_Store/LCP/{}/{}/{}', 'commit_message_format': 'File was added to repository: {}', 'commit_user': 'orm_rds', 'commit_email': 'orm_rds@att.com', - 'git_server_url': 'orm_rds@127.0.0.1:~/SoT/ORM.git' - + 'git_server_url': 'orm_rds@127.0.0.1:~/SoT/ORM.git', + 'git_cmd_timeout': 4 } - audit = { 'audit_server_url': 'http://127.0.0.1:8776/v1/audit/transaction', 'num_of_send_retries': 3, - 'time_wait_between_retries': 1 + 'time_wait_between_retries': 2 } authentication = { diff --git a/orm/tests/unit/rds/controllers/v1/resources/test_create_resource.py b/orm/tests/unit/rds/controllers/v1/resources/test_create_resource.py index d92e8c7c..832965ee 100755 --- a/orm/tests/unit/rds/controllers/v1/resources/test_create_resource.py +++ b/orm/tests/unit/rds/controllers/v1/resources/test_create_resource.py @@ -67,7 +67,7 @@ class TestCreateResource(FunctionalTest): try: response = self.app.delete_json('/v1/rds/resources', flavor_data) except Exception as e: - if '409 Conflict' not in str(e.message): + if '409 Conflict' not in str(e): self.fail('error') @patch.object(root.ResourceService, 'main', @@ -77,7 +77,7 @@ class TestCreateResource(FunctionalTest): try: response = self.app.delete_json('/v1/rds/resources', flavor_data) except Exception as e: - if 'unknown error' not in str(e.message): + if 'unknown error' not in str(e): self.fail('error') @patch.object(root.ResourceService, 'main', return_value="12345") @@ -98,7 +98,7 @@ class TestCreateResource(FunctionalTest): try: response = self.app.put_json('/v1/rds/resources', good_data) except Exception as e: - if 'unknown error' not in str(e.message): + if 'unknown error' not in str(e): self.fail('error') @patch.object(root.ResourceService, 'main', @@ -216,7 +216,7 @@ image_data = { }, "model": "{ \r\n \"internal_id\":1,\r\n \"id\":\"uuu1id12-uuid-uuid-uuid\",\r\n " " \"name\":\"Ubuntu\",\r\n \"enabled\": 1,\r\n \"protected\": 1,\r\n " - " \"url\": \"https:\/\/mirrors.it.att.com\/images\/image-name\",\r\n " + " \"url\": \"https:\\mirrors.it.att.com\\images\\image-name\",\r\n " " \"visibility\": \"public\",\r\n \"disk_format\": \"raw\",\r\n " " \"container_format\": \"bare\",\r\n \"min_disk\":2,\r\n \"min_ram\":0,\r\n " " \"regions\":[ \r\n { \r\n \"name\":\"North\",\r\n " diff --git a/orm/tests/unit/rds/ordupdate/test_ord_notifier.py b/orm/tests/unit/rds/ordupdate/test_ord_notifier.py index ffb14a16..83d8bdba 100755 --- a/orm/tests/unit/rds/ordupdate/test_ord_notifier.py +++ b/orm/tests/unit/rds/ordupdate/test_ord_notifier.py @@ -1,8 +1,8 @@ import unittest -import mock -from mock import patch from orm.services.resource_distributor.rds.ordupdate import ord_notifier +from unittest import mock +from unittest.mock import patch class MyResponse(object): @@ -153,7 +153,7 @@ class MainTest(unittest.TestCase): 'gigi', '7', '') self.fail('notify_ord() passed successfully (expected OrdNotFoundError)') except ord_notifier.OrdNotFoundError as e: - self.assertEqual(e.message, 'ORD of LCP %s not found' % ( + self.assertEqual(str(e), 'ORD of LCP %s not found' % ( 'gigi', )) @patch.object(ord_notifier.audit, 'audit') diff --git a/orm/tests/unit/rds/services/test_create_resource.py b/orm/tests/unit/rds/services/test_create_resource.py index c3d07dc4..5652028b 100755 --- a/orm/tests/unit/rds/services/test_create_resource.py +++ b/orm/tests/unit/rds/services/test_create_resource.py @@ -1,7 +1,7 @@ """create resource unittest module.""" import unittest +from unittest.mock import patch -from mock import patch from orm.services.resource_distributor.rds.services import resource as ResourceService from orm.services.resource_distributor.rds.services.model.region_resource_id_status import (Model, ResourceMetaData, @@ -530,10 +530,10 @@ json_data = { target_list = [{'template_data': ['anystring'], 'operation': 'create', 'resource_name': '1e24981a-fa51-11e5-86aa-5e5517507c66', - 'region_id': 'regionname', 'resource_type': u'customer'}, + 'region_id': 'regionname', 'resource_type': 'customer'}, {'template_data': 'delete', 'operation': 'delete', 'resource_name': '1e24981a-fa51-11e5-86aa-5e5517507c66', - 'region_id': 'regionnametest', 'resource_type': u'customer'}] + 'region_id': 'regionnametest', 'resource_type': 'customer'}] targets = [{'users': [{'id': 'userId1', 'roles': ['admin', 'other']}, {'id': 'userId2', 'roles': ['storage']}], diff --git a/orm/tests/unit/rds/services/test_image_yaml.py b/orm/tests/unit/rds/services/test_image_yaml.py index fd3e544a..b4ca72e2 100755 --- a/orm/tests/unit/rds/services/test_image_yaml.py +++ b/orm/tests/unit/rds/services/test_image_yaml.py @@ -22,11 +22,14 @@ json_input = { 'image_internal_id': 1 }, 'protected': 1, - 'customers': [{ - 'customer_id': 'abcd-efgh-ijkl-4567', 'image_id': 1 - }, { - 'customer_id': 'opqr-stuv-wxyz-8901', 'image_id': 1 - }], + 'customers': [ + { + 'customer_id': 'abcd-efgh-ijkl-4567', 'image_id': 1 + }, + { + 'customer_id': 'opqr-stuv-wxyz-8901', 'image_id': 1 + }], + 'container_format': 'bare', 'min_disk': 2, 'id': '12345678901234567890123456789012' } @@ -40,20 +43,15 @@ yaml_output = { 'glance_image': { 'properties': { 'container_format': 'bare', 'disk_format': 'raw', - 'is_public': True, - 'copy_from': 'https://mirrors.it.att.com/images/image-name', + 'visibility': 'public', + 'location': 'https://mirrors.it.att.com/images/image-name', 'deactivate': False, 'min_disk': 2, 'min_ram': 0, 'name': 'Ubuntu', 'owner': 'unknown', 'protected': True, 'id': '12345678-9012-3456-7890-123456789012', - 'tenants': ['abcd-efgh-ijkl-4567', 'opqr-stuv-wxyz-8901'], - 'tags': ['abcd-efgh-ijkl-4567', 'mnop-qrst-uvwx-0987'], - 'extra_properties': { - 'key_name': 'Key1', 'key_value': 'Key1.value', - 'image_internal_id': 1 - } + 'tags': ['abcd-efgh-ijkl-4567', 'mnop-qrst-uvwx-0987'] }, - 'type': 'OS::Glance::Image2' + 'type': 'OS::Glance::WebImage' } }, 'heat_template_version': '2015-1-1', diff --git a/orm/tests/unit/rds/sot/git_sot/test_git_base.py b/orm/tests/unit/rds/sot/git_sot/test_git_base.py deleted file mode 100644 index 265ca576..00000000 --- a/orm/tests/unit/rds/sot/git_sot/test_git_base.py +++ /dev/null @@ -1,58 +0,0 @@ -import unittest - -from orm.services.resource_distributor.rds.sot.git_sot.git_base import BaseGit - - -class BaseGitTests(unittest.TestCase): - - def test_git_base_no_method_git_init_implemented(self): - """ Check if creating an instance and calling git_init method fail""" - with self.assertRaises(NotImplementedError): - base_git = BaseGit() - base_git.git_init() - - def test_git_base_no_method_git_upload_changes_implemented(self): - """ Check if creating an instance and calling git_upload_changes method fail""" - with self.assertRaises(NotImplementedError): - base_git = BaseGit() - base_git.git_upload_changes() - - # @patch.object(git_base, 'conf') - # @patch.object(subprocess, 'Popen') - # def test_git_base_reset_error(self, mock_popen, conf_mock): - # """ Test that exception raised when stderr returns error.""" - # my_pipe = mock.MagicMock() - # my_pipe.communicate = mock.MagicMock(return_value=('1', 'error',)) - # mock_popen.return_value = my_pipe - # - # base_git = BaseGit() - # callback = base_git.git_reset_changes - # self.assertRaises(GitResetError, callback) - - # @patch.object(git_base, 'conf') - # @patch.object(subprocess, 'Popen') - # def test_git_base_reset_no_error(self, mock_popen, conf_mock): - # """ Test that no exception raised when no error returned.""" - # my_pipe = mock.MagicMock() - # my_pipe.communicate = mock.MagicMock(return_value=('1', 'bla bla',)) - # mock_popen.return_value = my_pipe - # - # base_git = BaseGit() - # try: - # base_git.git_reset_changes() - # except GitResetError: - # self.fail("No exception should be raised here") - - def test_git_base_no_method_git_reset_changes_implemented(self): - """ Check if creating an instance and calling - git_reset_changes method fail - """ - with self.assertRaises(NotImplementedError): - base_git = BaseGit() - base_git.git_reset_changes() - - def test_git_base_no_method_validate_git_implemented(self): - """ Check if creating an instance and calling validate_git method fail""" - with self.assertRaises(NotImplementedError): - base_git = BaseGit() - base_git.validate_git() diff --git a/orm/tests/unit/rds/sot/git_sot/test_git_factory.py b/orm/tests/unit/rds/sot/git_sot/test_git_factory.py index 938a6381..dd539242 100644 --- a/orm/tests/unit/rds/sot/git_sot/test_git_factory.py +++ b/orm/tests/unit/rds/sot/git_sot/test_git_factory.py @@ -1,7 +1,6 @@ import unittest from orm.services.resource_distributor.rds.sot.git_sot import git_factory -from orm.services.resource_distributor.rds.sot.git_sot.git_gittle import GitGittle from orm.services.resource_distributor.rds.sot.git_sot.git_native import GitNative @@ -9,11 +8,6 @@ class GitFactoryTests(unittest.TestCase): def setUp(self): super(GitFactoryTests, self).setUp() - def test_get_git_impl_with_gittle(self): - """Test that when given gittle the GitGittle instance returned""" - obj = git_factory.get_git_impl("gittle") - self.assertIsInstance(obj, GitGittle) - def test_get_git_impl_with_native(self): """Test that when given native the GitNative instance returned""" obj = git_factory.get_git_impl("native") diff --git a/orm/tests/unit/rds/sot/git_sot/test_git_gittle.py b/orm/tests/unit/rds/sot/git_sot/test_git_gittle.py deleted file mode 100644 index e77aada5..00000000 --- a/orm/tests/unit/rds/sot/git_sot/test_git_gittle.py +++ /dev/null @@ -1,54 +0,0 @@ -import unittest - -import mock -from mock import patch -from orm.services.resource_distributor.rds.sot.git_sot import git_gittle -from orm.services.resource_distributor.rds.sot.git_sot.git_base import GitInitError, GitUploadError -from orm.services.resource_distributor.rds.sot.git_sot.git_gittle import GitGittle - - -class GitGittleTests(unittest.TestCase): - - def setUp(self): - super(GitGittleTests, self).setUp() - self.addCleanup(mock.patch.stopall) - self.my_git = GitGittle() - - def tearDown(self): - # Restore the original config - self.my_git.repo = None - - ################### - # git_init # - ################### - - @patch.object(git_gittle, 'Gittle', side_effect=Exception("Failed to delete file path")) - def test_git_gittle_init_git_create_gittle_failed(self, gittle_mock): - """Test that when Gittle fail to initialize exception is raised.""" - with self.assertRaises(GitInitError): - self.my_git.git_init() - - @patch.object(git_gittle, 'Gittle') - @patch.object(git_gittle, 'conf') - def test_git_gittle_init_git_create_gittle_success(self, gittle_mock, conf_mock): - """Test that when Gittle initialize success.""" - self.my_git.git_init() - - ###################### - # git_upload_changes # - ###################### - - @patch.object(git_gittle, 'conf') - def test_git_gittle_git_upload_changes_success(self, conf_mock): - """Test that when upload success commit id is returned.""" - self.my_git.repo = mock.MagicMock() - self.my_git.repo.commit = mock.MagicMock(return_value="123") - commit_id = self.my_git.git_upload_changes() - self.assertEqual(commit_id, "123") - - @patch.object(git_gittle, 'conf') - def test_git_gittle_git_upload_changes_commit_failed(self, conf_mock): - """Test that when upload failed exception raised.""" - self.my_git.repo = mock.MagicMock() - self.my_git.repo.commit = mock.MagicMock(side_effect=Exception("Failed to commit")) - self.assertRaises(GitUploadError, self.my_git.git_upload_changes) diff --git a/orm/tests/unit/rds/sot/git_sot/test_git_native.py b/orm/tests/unit/rds/sot/git_sot/test_git_native.py index 2cffb4b7..8b954c0a 100644 --- a/orm/tests/unit/rds/sot/git_sot/test_git_native.py +++ b/orm/tests/unit/rds/sot/git_sot/test_git_native.py @@ -9,40 +9,13 @@ from orm.services.resource_distributor.rds.sot.git_sot.git_native import GitNati class GitNativeTest(unittest.TestCase): """The test case of GitNative.""" - - # @patch.object(git_native.subprocess, 'Popen') - # def test_git_operations_sanity(self, mock_popen): - # """Test that no exception is raised when performing git operations.""" - # my_pipe = mock.MagicMock() - # my_pipe.communicate = mock.MagicMock(return_value=('1', '2',)) - # mock_popen.return_value = my_pipe - # test_git = git_native.GitNative() - # for callback in [test_git._git_pull, test_git._git_add, - # test_git._git_push, test_git._git_get_commit_id]: - # callback('test') - # - # test_git._git_commit('test', 'test', 'test', 'test') - - # @patch.object(git_native.subprocess, 'Popen') - # def test_git_operations_error(self, mock_popen): - # """Test that an exception is raised when stderror returns error.""" - # my_pipe = mock.MagicMock() - # my_pipe.communicate = mock.MagicMock(return_value=('1', 'error',)) - # mock_popen.return_value = my_pipe - # test_git = git_native.GitNative() - # for callback in [test_git._git_pull, test_git._git_add, - # test_git._git_push, test_git._git_get_commit_id]: - # self.assertRaises(git_native.GitNativeError, callback, 'test') - # - # self.assertRaises(git_native.GitNativeError, - # test_git._git_commit, 'test', 'test', 'test', 'test') - @patch.object(git_native, 'conf') @patch.object(git_native.subprocess, 'Popen') def test_git_init_sanity(self, mock_popen, mock_conf): """Test that no exception is raised when calling git_init.""" + mock_conf.git.git_cmd_timeout = 4 my_pipe = mock.MagicMock() - my_pipe.communicate = mock.MagicMock(return_value=('1', '2',)) + my_pipe.communicate = mock.MagicMock(return_value=('1', '2')) mock_popen.return_value = my_pipe test_git = git_native.GitNative() test_git.git_init() @@ -51,8 +24,9 @@ class GitNativeTest(unittest.TestCase): @patch.object(git_native.subprocess, 'Popen') def test_git_upload_changes_sanity(self, mock_popen, mock_conf): """Test that no exception is raised when calling git_upload_changes.""" + mock_conf.git.git_cmd_timeout = 4 my_pipe = mock.MagicMock() - my_pipe.communicate = mock.MagicMock(return_value=('1', '2',)) + my_pipe.communicate = mock.MagicMock(return_value=('1', '2')) mock_popen.return_value = my_pipe test_git = git_native.GitNative() test_git.git_upload_changes() @@ -61,8 +35,9 @@ class GitNativeTest(unittest.TestCase): @patch.object(git_native.subprocess, 'Popen') def test_git_upload_changes_error(self, mock_popen, mock_conf): """Test that an exception is raised when stderror returns error.""" + mock_conf.git.git_cmd_timeout = 4 my_pipe = mock.MagicMock() - my_pipe.communicate = mock.MagicMock(return_value=('1', 'error',)) + my_pipe.communicate = mock.MagicMock(return_value=('1', 'error')) mock_popen.return_value = my_pipe test_git = git_native.GitNative() self.assertRaises(git_native.GitUploadError, @@ -72,8 +47,9 @@ class GitNativeTest(unittest.TestCase): @patch.object(git_native.subprocess, 'Popen') def test_git_validate_git_sanity(self, mock_popen, mock_conf): """Test that no exception is raised when calling validate_git.""" + mock_conf.git.git_cmd_timeout = 4 my_pipe = mock.MagicMock() - my_pipe.communicate = mock.MagicMock(return_value=('1', '2',)) + my_pipe.communicate = mock.MagicMock(return_value=('1', '2')) mock_popen.return_value = my_pipe test_git = git_native.GitNative() test_git.validate_git() @@ -82,10 +58,11 @@ class GitNativeTest(unittest.TestCase): @patch.object(git_native.subprocess, 'Popen') @patch.object(git_native.GitNative, '_git_config', side_effect=GitNativeError("Could not write to file")) - def test_git_native_validate_git_config_fail(self, conf, mock_popen, result): + def test_git_native_validate_git_config_fail(self, mock_conf, mock_popen, result): """Test that no exception is raised when calling git_init.aein""" + mock_conf.git.git_cmd_timeout = 4 my_pipe = mock.MagicMock() - my_pipe.communicate = mock.MagicMock(return_value=('1', '2',)) + my_pipe.communicate = mock.MagicMock(return_value=('1', '2')) mock_popen.return_value = my_pipe test_git = git_native.GitNative() with self.assertRaises(GitValidateError): diff --git a/orm/tests/unit/rds/sot/git_sot/test_git_sot.py b/orm/tests/unit/rds/sot/git_sot/test_git_sot.py index 215b8d1d..2277d079 100755 --- a/orm/tests/unit/rds/sot/git_sot/test_git_sot.py +++ b/orm/tests/unit/rds/sot/git_sot/test_git_sot.py @@ -1,15 +1,14 @@ import os -import threading import unittest -import mock -from mock import patch from orm.services.resource_distributor.rds.sot.base_sot import SoTError -from orm.services.resource_distributor.rds.sot.git_sot.git_base import ( - GitInitError, GitResetError, GitUploadError, GitValidateError) +from orm.services.resource_distributor.rds.sot.git_sot.git_native import (GitInitError, GitResetError, + GitUploadError, GitValidateError) from orm.services.resource_distributor.rds.sot.git_sot import git_sot as sot from orm.services.resource_distributor.rds.sot import sot_factory from orm.tests.unit.rds import config as conf +from unittest import mock +from unittest.mock import patch lock = mock.MagicMock() @@ -43,75 +42,39 @@ class GitSoTTest(unittest.TestCase): git_factory.get_git_impl = mock.MagicMock() # update_sot - @patch.object(sot, 'init_git', - side_effect=GitInitError("Failed to initialize Git")) - def test_git_sot_update_sot_retries_init_git_fail(self, mock_init): + @patch.object(sot, 'init_git', side_effect=GitInitError("Failed to initialize Git")) + def test_git_sot_update_sot_init_git_fail(self, result): """" init_git fails and raise exception""" try: - sot.update_sot_with_retries("", lock, ['c', 'd']) - except GitInitError: - self.fail("Exception should have been handled inside method") - - @patch.object(sot, 'handle_file_operations', - side_effect=SoTError("Failed to create file path")) - @patch.object(sot, 'init_git') - def test_git_sot_update_sot_retries_create_files_fail( - self, mock_init, mock_handle): - """" create_files fails and raise exception""" - try: - sot.update_sot_with_retries("", lock, ['c', 'd']) + sot.update_sot("", lock, '1', '2', ['3', '5'], '4', '6') except SoTError: self.fail("Exception should have been handled inside method") - @patch.object(sot, 'update_git', - side_effect=GitUploadError("Failed to upload file to Git")) + @patch.object(sot, 'handle_file_operations', side_effect=SoTError("Failed to create file path")) + @patch.object(sot, 'init_git') + def test_git_sot_update_sot_create_files_fail(self, git_repo, result): + """" create_files fails and raise exception""" + try: + sot.update_sot("", lock, "a", "b", ['c', 'd'], 'e', 'f') + except SoTError: + self.fail("Exception should have been handled inside method") + + @patch.object(sot, 'update_git', side_effect=GitUploadError("Failed to upload file to Git")) @patch.object(sot, 'init_git') @patch.object(sot, 'handle_file_operations') @patch.object(sot, 'cleanup') - def test_git_sot_update_sot_retries_update_git_fail( - self, mock_cleanup, mock_handle, mock_init, mock_update): + def test_git_sot_update_sot_update_git_fail(self, git_repo, files_created, result, clean_result): """" update git fails and raise exception""" try: - sot.update_sot_with_retries("", lock, ['c', 'd']) + sot.update_sot("", lock, 'a', 'b', ['c', 'd'], 'e', 'f') except GitUploadError: self.fail("Exception should have been handled inside method") - @patch.object(sot, 'init_git', - side_effect=GitResetError("Unknown error in test method")) - def test_git_sot_update_sot_retries_unknown_error_thrown(self, mock_init): - """" init_git fails and raise exception""" - try: - sot.update_sot_with_retries("", lock, ['c', 'd']) - except Exception: - self.fail("Exception should have been handled inside method") - @patch.object(sot, 'update_git') @patch.object(sot, 'init_git') @patch.object(sot, 'handle_file_operations') @patch.object(sot, 'cleanup') - def test_git_sot_update_sot_retries_success( - self, mock_cleanup, mock_handle, mock_init, mock_update): - """"no exceptions raised""" - try: - sot.update_sot_with_retries("", lock, ['c', 'd']) - except SoTError: - self.fail("Exception should have been handled inside method") - - @patch.object(sot, 'conf') - @patch.object(sot, 'update_sot_with_retries') - @patch.object(sot, 'notify_ord', - side_effect=Exception("Error in updating ORD")) - def test_git_sot_update_sot_notify_ord_fail( - self, mock_notify, mock_update, mock_conf): - """"no exceptions raised""" - try: - sot.update_sot("", lock, "a", "b", ['c', 'd'], 'e', 'f') - except Exception: - self.self("Exception should have been handled inside method") - - @patch.object(sot, 'conf') - @patch.object(sot, 'update_sot_with_retries', return_value="") - def test_git_sot_update_sot_success(self, mock_update, mock_conf): + def test_git_sot_update_sot_success(self, git_repo, files_created, result, cleanup_result): """"no exceptions raised""" try: sot.update_sot("", lock, "a", "b", ['c', 'd'], 'e', 'f') @@ -125,8 +88,7 @@ class GitSoTTest(unittest.TestCase): @patch.object(os.path, 'dirname', return_value="File path") @patch.object(os.path, 'exists', return_value=False) @patch.object(os, 'makedirs') - def test_git_sot_create_dir_path_not_exist_success( - self, dir_name, exists, makedirs): + def test_git_sot_create_dir_path_not_exist_success(self, dir_name, exists, makedirs): """create directory path when path not exist and makedir success""" sot.create_dir("my_file") @@ -139,28 +101,11 @@ class GitSoTTest(unittest.TestCase): @patch.object(os.path, 'dirname', return_value="File path") @patch.object(os.path, 'exists', return_value=False) @patch.object(os, 'makedirs', side_effect=OSError("Could not make dir")) - def test_git_sot_create_dir_makedir_fails( - self, dir_name, exists, makedirs): - """create direcory path makedir throws exception and """ - """the methos throws SoTError""" + def test_git_sot_create_dir_makedir_fails(self, dir_name, exists, makedirs): + """create direcory path makedir throws exception and the methos throws SoTError""" with self.assertRaises(SoTError): sot.create_dir("my_file") - ############################ - # save_resource_to_sot # - ############################ - - @patch.object(threading, 'Thread', - return_value=threading.Thread(target=dummy_thread_method)) - def test_git_sot_save_resource_to_sot(self, thread): - """Check the save runs in a new thread""" - sot_factory.sot_type = "git" - sot_factory.git_type = "gittle" - git_impl = mock.MagicMock() - sot = sot_factory.get_sot() - sot.save_resource_to_sot("t_id", "tk_id", [], "a_id", "u_id") - self.assertNotEqual(thread, threading.Thread.getName("main_thread")) - ################################ # create_file_in_path # ################################ @@ -174,19 +119,16 @@ class GitSoTTest(unittest.TestCase): except SoTError: self.fail("No exceptions should be thrown in this case") - @patch.object(sot, 'create_dir', - side_effect=SoTError("Failed to create file path")) + @patch.object(sot, 'create_dir', side_effect=SoTError("Failed to create file path")) def test_git_sot_create_file_in_path_create_dir_failed(self, aDir): """create file in path fail, create file raise exception """ with self.assertRaises(SoTError): sot.create_file_in_path("path", "data") @patch.object(sot, 'create_dir', return_value="File path") - @patch.object(sot, 'write_data_to_file', - side_effect=SoTError("Could not write to file")) + @patch.object(sot, 'write_data_to_file', side_effect=SoTError("Could not write to file")) def test_git_sot_create_file_in_path_create_file_failed(self, aDir, aFile): - """create file in path fail,create dir success, """ - """writing data to file failed """ + """create file in path fail,create dir success, writing data to file failed """ with self.assertRaises(SoTError): sot.create_file_in_path("path", "data") @@ -238,19 +180,17 @@ class GitSoTTest(unittest.TestCase): # write_data_to_file # ############################# - @patch('__builtin__.open') + @patch('builtins.open') @patch.object(os, 'close') @patch.object(os, 'write', return_value=True) - def test_git_sot_write_data_to_file_success( - self, result1, result2, result3): + def test_git_sot_write_data_to_file_success(self, result1, result2, result3): """Check create_file success """ try: sot.write_data_to_file("file_path", "data11") except SoTError: self.fail("No exceptions should be thrown in this case") - @patch('__builtin__.open', - side_effect=IOError("Failed writing data to file")) + @patch('builtins.open', side_effect=IOError("Failed writing data to file")) def test_git_sot_write_data_to_file_failed(self, result1): """Check create file failed , could not write to file """ with self.assertRaises(SoTError): @@ -272,8 +212,7 @@ class GitSoTTest(unittest.TestCase): def test_git_sot_cleanup_files_remove_failed(self): """Check cleanup fail because reset git failed """ git_impl = mock.MagicMock() - git_impl.git_reset_changes = mock.MagicMock( - side_effect=GitResetError("failed to reset")) + git_impl.git_reset_changes = mock.MagicMock(side_effect=GitResetError("failed to reset")) with self.assertRaises(SoTError): sot.cleanup(git_impl) @@ -290,14 +229,6 @@ class GitSoTTest(unittest.TestCase): except GitInitError: self.fail("No exceptions should be thrown in this case") - def test_git_sot_init_git_gittle_failed(self): - """Check init_git failed """ - git_impl = mock.MagicMock() - git_impl.git_init = mock.MagicMock(side_effect=GitInitError( - "failed to init")) - with self.assertRaises(GitInitError): - sot.init_git(git_impl) - ############################# # update_git # ############################# diff --git a/orm/tests/unit/rds/sot/test_sot_factory.py b/orm/tests/unit/rds/sot/test_sot_factory.py index 1c806067..9d9eefb6 100644 --- a/orm/tests/unit/rds/sot/test_sot_factory.py +++ b/orm/tests/unit/rds/sot/test_sot_factory.py @@ -1,8 +1,8 @@ import unittest -import mock from orm.services.resource_distributor.rds.sot.git_sot.git_sot import GitSoT from orm.services.resource_distributor.rds.sot import sot_factory +from unittest import mock class SoTFactoryTests(unittest.TestCase): @@ -36,7 +36,7 @@ class SoTFactoryTests(unittest.TestCase): sot_factory.commit_user = "5" sot_factory.commit_email = "6" sot_factory.git_server_url = "7" - sot_factory.git_type = "gittle" + sot_factory.git_type = "native" obj = sot_factory.get_sot() self.assertEqual(GitSoT.local_repository_path, "2", "local_repository_path not match") @@ -45,4 +45,4 @@ class SoTFactoryTests(unittest.TestCase): self.assertEqual(GitSoT.commit_user, "5", "commit_user not match") self.assertEqual(GitSoT.commit_email, "6", "commit_email not match") self.assertEqual(GitSoT.git_server_url, "7", "git_server_url not match") - self.assertEqual(GitSoT.git_type, "gittle", "git_type not match") + self.assertEqual(GitSoT.git_type, "native", "git_type not match") diff --git a/orm/tests/unit/rds/storage/mysql/test_region_resource_id_status.py b/orm/tests/unit/rds/storage/mysql/test_region_resource_id_status.py index 739d00e7..f50a5a28 100755 --- a/orm/tests/unit/rds/storage/mysql/test_region_resource_id_status.py +++ b/orm/tests/unit/rds/storage/mysql/test_region_resource_id_status.py @@ -29,7 +29,7 @@ class RecordMock(object): class MyFacade(object): - """Mock EngineFacade class.""" + """Mock LegacyEngineFacade class.""" def __init__(self, dup_entry=False, record_exist=False, @@ -66,9 +66,9 @@ class MyFacade(object): class MysqlRegionResourceIdStatusTest(unittest.TestCase): """Main test case of this module.""" - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(False, True)) - def test_add_update_status_record_record_exist_sanity(self, mock_db_session): + def test_add_update_status_record_record_exist_sanity(self, mock_engine): """Test that no exception is raised when calling add_update_status_record. where record exist """ @@ -85,9 +85,9 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): "virtual_size": "2", "size": "3"}) - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade()) - def test_add_update_status_record_record_not_exist_sanity(self, mock_db_session): + def test_add_update_status_record_record_not_exist_sanity(self, mock_engine): """Test that no exception is raised when calling add_update_status_record. where record does not exist """ @@ -102,9 +102,9 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): 'create', 'err_code') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(True, False)) - def test_add_update_status_record_duplicate_entry(self, mock_db_session): + def test_add_update_status_record_duplicate_entry(self, mock_engine): """No exception is raised when trying to add a duplicate entry.""" my_connection = region_resource_id_status.Connection('url') my_connection.add_update_status_record('timestamp', @@ -122,9 +122,9 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): 'get_timestamp_pair', return_value=(1, 2)) @mock.patch.object(region_resource_id_status, 'Model') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(False, False, True)) - def test_get_records_by_filter_args_no_records(self, mock_db_session, + def test_get_records_by_filter_args_no_records(self, mock_engine, mock_get_timestamp, mock_model, mock_statusmodel): @@ -137,10 +137,10 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): 'get_timestamp_pair', return_value=(1, 2)) @mock.patch.object(region_resource_id_status, 'Model') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(False, True, True)) def test_get_records_by_filter_args_with_records(self, - mock_db_session, + mock_engine, mock_get_timestamp, mock_model, mock_statusmodel): @@ -153,9 +153,9 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): 'get_timestamp_pair', return_value=(1, 2)) @mock.patch.object(region_resource_id_status, 'Model') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(False, False, True)) - def test_get_records_by_resource_id_sanity(self, mock_db_session, + def test_get_records_by_resource_id_sanity(self, mock_engine, mock_get_timestamp, mock_model, mock_statusmodel): @@ -163,11 +163,11 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): my_connection = region_resource_id_status.Connection('url') my_connection.get_records_by_resource_id('test') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade()) @patch.object(time, 'time', return_value=80) @mock.patch.object(region_resource_id_status, 'conf') - def test_get_timestamp_pair_sanity(self, db_session, time_mock, conf_mock): + def test_get_timestamp_pair_sanity(self, mock_engine, time_mock, conf_mock): """Test get_timestamp_pair""" conf_mock.region_resource_id_status.max_interval_time.default = 1 my_connection = region_resource_id_status.Connection('url') @@ -179,9 +179,9 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): 'get_timestamp_pair', return_value=(1, 2)) @mock.patch.object(region_resource_id_status, 'Model') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(False, False, True)) - def test_get_records_by_resource_id_and_status_no_records(self, mock_db_session, + def test_get_records_by_resource_id_and_status_no_records(self, mock_engine, mock_get_timestamp, mock_model, mock_statusmodel): @@ -193,9 +193,9 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): @patch.object(region_resource_id_status.Connection, 'get_timestamp_pair', return_value=(1, 2)) @mock.patch.object(region_resource_id_status, 'Model') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(False, True, True)) - def test_get_records_by_resource_id_and_status_sanity(self, mock_db_session, + def test_get_records_by_resource_id_and_status_sanity(self, mock_engine, mock_get_timestamp, mock_model, mock_statusmodel): @@ -206,9 +206,9 @@ class MysqlRegionResourceIdStatusTest(unittest.TestCase): @patch.object(region_resource_id_status.Connection, 'get_timestamp_pair', return_value=(1, 0)) @mock.patch.object(region_resource_id_status, 'Model') - @mock.patch.object(region_resource_id_status.db_session, 'EngineFacade', + @mock.patch.object(region_resource_id_status, 'LegacyEngineFacade', return_value=MyFacade(False, True, True)) - def test_get_records_by_resource_id_and_status_with_records(self, mock_db_session, + def test_get_records_by_resource_id_and_status_with_records(self, mock_engine, mock_get_timestamp, mock_model, mock_statusmodel): diff --git a/orm/tests/unit/rms/controllers/v1/orm/resources/test_metadata.py b/orm/tests/unit/rms/controllers/v1/orm/resources/test_metadata.py index 5fb2f934..7ca335af 100755 --- a/orm/tests/unit/rms/controllers/v1/orm/resources/test_metadata.py +++ b/orm/tests/unit/rms/controllers/v1/orm/resources/test_metadata.py @@ -1,13 +1,13 @@ import json -from mock import patch, MagicMock +from unittest.mock import patch, MagicMock from orm.services.region_manager.rms.controllers.v2.orm.resources import metadata from orm.services.region_manager.rms.model.model import * from orm.tests.unit.rms import FunctionalTest - from wsme.exc import ClientSideError + result_inst = RegionData("1", "2", "3", "4", "5", "6", endpoints=[ EndPoint("http://www.example.co.il", "url") @@ -15,18 +15,18 @@ result_inst = RegionData("1", "2", "3", "4", "5", "6", address=Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"), metadata={"key1": ["value1"], "key2": ["value2"]}) -result_dict = {u'status': u'2', u'vlcpName': None, u'clli': u'5', - u'name': u'4', u'designType': None, - u'AicVersion': u'6', u'OSVersion': None, u'id': u'3', - u'address': {u'country': u'US', u'state': u'NY', - u'street': u'AIRPORT_CITY', - u'zip': u'5', u'city': u'HANEGEV'}, - u'endpoints': [ - {u'type': u'url', - u'publicURL': u'http://www.example.co.il'}], - u'locationType': None, - u'metadata': {u'key1': [u'value1'], - u'key2': [u'value2']} +result_dict = {'status': '2', 'vlcpName': None, 'clli': '5', + 'name': '4', 'designType': None, + 'AicVersion': '6', 'OSVersion': None, 'id': '3', + 'address': {'country': 'US', 'state': 'NY', + 'street': 'AIRPORT_CITY', + 'zip': '5', 'city': 'HANEGEV'}, + 'endpoints': [ + {'type': 'url', + 'publicURL': 'http://www.example.co.il'}], + 'locationType': None, + 'metadata': {'key1': ['value1'], + 'key2': ['value2']} } metadata_input_dict = { @@ -37,12 +37,11 @@ metadata_input_dict = { } -metadata_result_dict = {u'metadata': {u'key1': [u'value1'], - u'key2': [u'value2'] - } +metadata_result_dict = {'metadata': {'key1': ['value1'], + 'key2': ['value2']} } -metadata_result_empty_dict = {u'metadata': {}} +metadata_result_empty_dict = {'metadata': {}} class TestMetadataController(FunctionalTest): @@ -173,7 +172,6 @@ class TestMetadataController(FunctionalTest): metadata.request = temp_request dict_body = json.loads(response.body) result_json = json.loads(dict_body['faultstring']) - self.assertEqual('777', result_json['transaction_id']) self.assertEqual(500, result_json['code']) diff --git a/orm/tests/unit/rms/controllers/v1/orm/resources/test_region.py b/orm/tests/unit/rms/controllers/v1/orm/resources/test_region.py index 11a0ca55..e2ceb770 100755 --- a/orm/tests/unit/rms/controllers/v1/orm/resources/test_region.py +++ b/orm/tests/unit/rms/controllers/v1/orm/resources/test_region.py @@ -1,424 +1,434 @@ -import json -from mock import patch, MagicMock - -from orm.services.region_manager.rms.controllers.v2.orm.resources import regions -from orm.services.region_manager.rms.model import model as PyModels -from orm.tests.unit.rms import FunctionalTest - -from wsme.exc import ClientSideError - - -result_inst = PyModels.Regions([PyModels.RegionData("2", "3", "4", "5", "6", "7", - address=PyModels.Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"), - endpoints=[ - PyModels.EndPoint("http://www.example.co.il", "url") - ], - metadata={"key1": ["value1"], "key2": ["value2"]}), - PyModels.RegionData("2", "3", "4", "5", "6", "7", endpoints=[ - PyModels.EndPoint("http://www.example.co.il", "url")], - address=PyModels.Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"), - metadata={"key3": ["value3"], "key4": ["value4"]})]) - - -result_dict = {u'regions': [{u'status': u'2', u'vlcpName': None, u'CLLI': u'6', - u'name': u'3', u'description': u'5', u'designType': None, - u'rangerAgentVersion': u'7', u'OSVersion': None, u'id': u'3', - u'address': {u'country': u'US', u'state': u'NY', - u'street': u'AIRPORT_CITY', - u'zip': u'5', u'city': u'HANEGEV'}, - u'endpoints': [ - {u'type': u'url', - u'publicURL': u'http://www.example.co.il'}], - u'locationType': None, - u'created': None, - u'modified': None, - u'metadata': {u'key1': [u'value1'], - u'key2': [u'value2']}}, - {u'status': u'2', u'vlcpName': None, u'CLLI': u'6', - u'name': u'3', u'description': u'5', u'designType': None, - u'rangerAgentVersion': u'7', u'OSVersion': None, - u'id': u'3', - u'address': {u'country': u'US', - u'state': u'NY', - u'street': u'AIRPORT_CITY', - u'zip': u'5', u'city': u'HANEGEV'}, - u'endpoints': [{u'type': u'url', - u'publicURL': u'http://www.example.co.il'}], - u'locationType': None, - u'created': None, - u'modified': None, - u'metadata': {u'key3': [u'value3'], - u'key4': [u'value4']}}]} - - -db_full_region = { - 'region_status': 'functional', - 'address_city': 'LAb', - 'CLLI': 'nn/a', - 'region_id': 'SNA20', - 'open_stack_version': 'kilo', - 'address_country': 'US', - 'design_type': 'n/a', - 'ranger_agent_version': 'aic3.0', - 'vlcp_name': 'n/a', - 'end_point_list': [{ - 'url': 'http://horizon1.com', - 'type': 'dashboard' - }, { - 'url': 'http://identity1.com', - 'type': 'identity' - }, { - 'url': 'http://identity1.com', - 'type': 'identity222333' - }, { - 'url': 'http://ord1.com', - 'type': 'ord' - }], - 'meta_data_dict': { - 'A': ['b'] - }, - 'address_state': 'CAL', - 'address_zip': '1111', - 'address_street': 'n/a', - 'location_type': 'n/a', - 'name': 'SNA 18', - 'description': 'SNA 18' -} - -full_region = { - "status": "functional", - "endpoints": - [ - { - "type": "dashboard", - "publicURL": "http://horizon1.com" - }, - - { - "type": "identity", - "publicURL": "http://identity1.com" - }, - { - "type": "identity222333", - "publicURL": "http://identity1.com" - }, - { - "type": "ord", - "publicURL": "http://ord1.com" - } - ], - "CLLI": "nn/a", - "name": "SNA20", - "description": "SNA20", - "designType": "n/a", - "locationType": "n/a", - "vlcpName": "n/a", - "created": None, - "modified": None, - "address": - { - "country": "US", - "state": "CAL", - "street": "n/a", - "zip": "1111", - "city": "LAb"}, - "rangerAgentVersion": "aic3.0", - "OSVersion": "kilo", - "id": "SNA20", - "metadata": - {"A": ["b"]} -} - - -class TestAddRegion(FunctionalTest): - - def get_error(self, transaction_id, status_code, error_details=None, message=None): - return ClientSideError(json.dumps({ - 'code': status_code, - 'type': 'test', - 'created': '0.0', - 'transaction_id': transaction_id, - 'message': message if message else error_details, - 'details': 'test' - }), status_code=status_code) - - def _create_result_from_input(self, input): - obj = PyModels.RegionData() - obj.clli = full_region["CLLI"] - obj.name = full_region["id"] # need to be same as id - obj.description = full_region["description"] - obj.design_type = full_region["designType"] - obj.location_type = full_region["locationType"] - obj.vlcp_name = full_region["vlcpName"] - obj.id = full_region["id"] - obj.address.country = full_region["address"]["country"] - obj.address.city = full_region["address"]["city"] - obj.address.state = full_region["address"]["state"] - obj.address.street = full_region["address"]["street"] - obj.address.zip = full_region["address"]["zip"] - obj.ranger_agent_version = full_region["rangerAgentVersion"] - obj.open_stack_version = full_region["OSVersion"] - obj.metadata = full_region["metadata"] - obj.status = full_region["status"] - obj.endpoints = [] - for endpoint in full_region["endpoints"]: - obj.endpoints.append(PyModels.EndPoint(type=endpoint["type"], - publicurl=endpoint[ - "publicURL"])) - return obj - -# @patch.object(regions, 'request') -# @patch.object(regions.RegionService, 'create_full_region') -# @patch.object(regions.authentication, 'authorize', return_value=True) -# def test_add_region_success(self, mock_auth, mock_create_logic, -# mock_request): -# self.maxDiff = None -# mock_create_logic.return_value = self._create_result_from_input( -# full_region) -# response = self.app.post_json('/v2/orm/regions', full_region) -# self.assertEqual(response.status_code, 201) -# self.assertEqual(response.json, full_region) - - @patch.object(regions.RegionService, 'create_full_region') - @patch.object(regions.authentication, 'authorize', return_value=True) - def test_add_region_any_error(self, mock_auth, mock_create_logic): - self.maxDiff = None - mock_create_logic.side_effect = Exception("unknown error") - response = self.app.post_json('/v2/orm/regions', full_region, - expect_errors=True) - self.assertEqual(response.status_code, 500) - - @patch.object(regions, 'request') - @patch.object(regions, 'err_utils') - @patch.object(regions.RegionService, 'create_full_region') - @patch.object(regions.authentication, 'authorize', return_value=True) - def test_add_region_value_error(self, mock_auth, mock_create_logic, - mock_get_error, request_mock): - mock_get_error.get_error = self.get_error - request_mock.transaction_id = "555" - mock_create_logic.side_effect = regions.error_base.InputValueError(message="value error") - response = self.app.post_json('/v2/orm/regions', full_region, - expect_errors=True) - self.assertEqual(response.status_code, 400) - self.assertEqual(json.loads(response.json['faultstring'])['message'], 'value error') - - @patch.object(regions.RegionService, 'get_region_by_id_or_name') - @patch.object(regions.authentication, 'authorize', return_value=True) - def test_get_region_success(self, mock_auth, mock_create_logic): - self.maxDiff = None - mock_create_logic.return_value = self._create_result_from_input( - full_region) - response = self.app.get('/v2/orm/regions/id') - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, full_region) - - @patch.object(regions, 'request') - @patch.object(regions, 'err_utils') - @patch.object(regions.RegionService, 'get_region_by_id_or_name') - @patch.object(regions.authentication, 'authorize', return_value=True) - def test_get_region_not_found(self, mock_auth, mock_get_logic, - mock_get_error, mock_request): - mock_get_error.get_error = self.get_error - mock_request.transaction_id = "555" - mock_get_logic.side_effect = regions.error_base.NotFoundError(message="not found", status_code=404) - response = self.app.get('/v2/orm/regions/id', expect_errors=True) - self.assertEqual(json.loads(response.json['faultstring'])['message'], - 'not found') - self.assertEqual(response.status_code, 404) - -# @patch.object(regions, 'request') -# @patch.object(regions, 'err_utils') -# @patch.object(regions.RegionService, 'delete_region') -# @patch.object(regions.RegionsController, 'has_no_resources', return_value=True) -# @patch.object(regions.authentication, 'authorize', return_value=True) -# def test_delete_region(self, mock_auth, mock_delete_logic, -# mock_get_error, mock_request, mock_controller): -# mock_get_error.get_error = self.get_error -# mock_request.transaction_id = "555" -# mock_delete_logic.return_value = True -# response = self.app.delete('/v2/orm/regions/id') -# self.assertEqual(response.status_code, 204) - - @patch.object(regions, 'request') - @patch.object(regions, 'err_utils') - @patch.object(regions.RegionService, 'delete_region') - @patch.object(regions.RegionsController, 'has_no_resources', return_value=True) - @patch.object(regions.authentication, 'authorize', return_value=True) - def test_delete_region_error(self, mock_auth, mock_delete_logic, - mock_get_error, mock_request, mock_controller): - mock_get_error.get_error = self.get_error - mock_request.transaction_id = "555" - mock_delete_logic.side_effect = regions.error_base.ErrorStatus(message="unknown error", status_code=500) - response = self.app.delete('/v2/orm/regions/id', expect_errors=True) - self.assertEqual(response.status_code, 500) - -# @patch.object(regions, 'request') -# @patch.object(regions.RegionService, 'update_region') -# @patch.object(regions.authentication, 'authorize', return_value=True) -# def test_update_region_success(self, mock_auth, mock_update_logic, -# mock_request): -# mock_update_logic.return_value = self._create_result_from_input( -# full_region) -# response = self.app.put_json('/v2/orm/regions/id', full_region) -# self.assertEqual(response.status_code, 201) -# self.assertEqual(response.json, full_region) - - @patch.object(regions, 'request') - @patch.object(regions, 'err_utils') - @patch.object(regions.RegionService, 'update_region') - @patch.object(regions.authentication, 'authorize', return_value=True) - def test_update_region_error(self, mock_auth, mock_update_logic, - mock_get_error, mock_request): - mock_get_error.get_error = self.get_error - mock_request.transaction_id = "555" - mock_update_logic.side_effect = Exception("unknown error2") - response = self.app.put_json('/v2/orm/regions/id', full_region, - expect_errors=True) - self.assertEqual(response.status_code, 500) - self.assertEqual(json.loads(response.json['faultstring'])['message'], - 'unknown error2') - - @patch.object(regions, 'request') - @patch.object(regions, 'err_utils') - @patch.object(regions.RegionService, 'update_region') - @patch.object(regions.authentication, 'authorize', return_value=True) - def test_update_region_not_found_error(self, mock_auth, mock_update_logic, - mock_get_error, mock_request): - mock_get_error.get_error = self.get_error - mock_request.transaction_id = "555" - mock_update_logic.side_effect = regions.error_base.NotFoundError( - message="not found", status_code=404) - response = self.app.put_json('/v2/orm/regions/id', full_region, - expect_errors=True) - self.assertEqual(json.loads(response.json['faultstring'])['message'], - 'not found') - self.assertEqual(response.status_code, 404) - - -class TestWsmeModelFunctions(TestAddRegion): - - def _to_wsme_from_input(self, input): - obj = regions.RegionsData() - obj.clli = full_region["CLLI"] - obj.name = full_region["name"] - obj.description = full_region["description"] - obj.design_type = full_region["designType"] - obj.location_type = full_region["locationType"] - obj.vlcp_name = full_region["vlcpName"] - obj.id = full_region["id"] - obj.address.country = full_region["address"]["country"] - obj.address.city = full_region["address"]["city"] - obj.address.state = full_region["address"]["state"] - obj.address.street = full_region["address"]["street"] - obj.address.zip = full_region["address"]["zip"] - obj.ranger_agent_version = full_region["rangerAgentVersion"] - obj.open_stack_version = full_region["OSVersion"] - obj.metadata = full_region["metadata"] - obj.status = full_region["status"] - obj.endpoints = [] - for endpoint in full_region["endpoints"]: - obj.endpoints.append(regions.EndPoint(type=endpoint["type"], - publicurl=endpoint[ - "publicURL"])) - return obj - - def test_region_data_model(self): - self.maxDiff = None - wsme_to_python = self._to_wsme_from_input(full_region)._to_clean_python_obj() - python_obj_input = self._create_result_from_input(full_region) - self.assertEqual(wsme_to_python.__dict__.pop('address').__dict__, - python_obj_input.__dict__.pop('address').__dict__) - self.assertEqual(wsme_to_python.__dict__.pop('endpoints')[0].__dict__, - python_obj_input.__dict__.pop('endpoints')[0].__dict__) - self.assertEqual(wsme_to_python.__dict__, python_obj_input.__dict__) - - -class TestGetRegionsController(FunctionalTest): - - @patch.object(regions.RegionService, 'get_regions_data', return_value=result_inst) - @patch.object(regions, 'authentication') - def test_get_success(self, mock_authentication, result): - self.maxDiff = None - response = self.app.get('/v2/orm/regions') - self.assertEqual(dict(response.json), result_dict) - - @patch.object(regions.RegionService, 'get_regions_data', side_effect=Exception("unknown error")) - @patch.object(regions.err_utils, 'get_error', - return_value=ClientSideError(json.dumps({ - 'code': 500, - 'type': 'test', - 'created': '0.0', - 'transaction_id': '111', - 'message': 'test', - 'details': 'test' - }), status_code=500)) - @patch.object(regions, 'authentication') - def test_get_unknown_error(self, mock_auth, get_err, result): - temp_request = regions.request - regions.request = MagicMock() - - response = self.app.get('/v2/orm/regions', expect_errors=True) - - regions.request = temp_request - dict_body = json.loads(response.body) - result_json = json.loads(dict_body['faultstring']) - - self.assertEqual('111', result_json['transaction_id']) - self.assertEqual(500, result_json['code']) - - @patch.object(regions.RegionService, 'get_regions_data', - side_effect=regions.error_base.NotFoundError("no content !!!?")) - @patch.object(regions.err_utils, 'get_error', - return_value=ClientSideError(json.dumps({ - 'code': 404, - 'type': 'test', - 'created': '0.0', - 'transaction_id': '222', - 'message': 'test', - 'details': 'test' - }), status_code=404)) - @patch.object(regions, 'authentication') - def test_get_region_not_found(self, mock_auth, get_err, result): - temp_request = regions.request - regions.request = MagicMock() - - response = self.app.get('/v2/orm/regions', expect_errors=True) - - regions.request = temp_request - dict_body = json.loads(response.body) - result_json = json.loads(dict_body['faultstring']) - - self.assertEqual('222', result_json['transaction_id']) - self.assertEqual(404, result_json['code']) - - @patch.object(regions.RegionService, 'get_region_by_id_or_name', - return_value=result_inst.regions[0]) - @patch.object(regions, 'authentication') - def test_get_one_success(self, mock_authentication, result): - response = self.app.get('/v2/orm/regions/id') - self.assertEqual(dict(response.json), result_dict['regions'][0]) - - @patch.object(regions.RegionService, 'get_regions_data', - side_effect=Exception("unknown error")) - @patch.object(regions.err_utils, 'get_error', - return_value=ClientSideError(json.dumps({ - 'code': 500, - 'type': 'test', - 'created': '0.0', - 'transaction_id': '111', - 'message': 'test', - 'details': 'test' - }), status_code=500)) - @patch.object(regions, 'authentication') - def test_get_one_unknown_error(self, mock_auth, get_err, result): - temp_request = regions.request - regions.request = MagicMock() - - response = self.app.get('/v2/orm/regions/id', expect_errors=True) - - regions.request = temp_request - dict_body = json.loads(response.body) - result_json = json.loads(dict_body['faultstring']) - - self.assertEqual('111', result_json['transaction_id']) - self.assertEqual(500, result_json['code']) +import json +from unittest.mock import patch, MagicMock + +from orm.services.region_manager.rms.controllers.v2.orm.resources import regions +from orm.services.region_manager.rms.model import model as PyModels +from orm.tests.unit.rms import FunctionalTest + +from wsme.exc import ClientSideError + + +result_inst = PyModels.Regions([PyModels.RegionData("2", "3", "4", "5", "6", "7", + address=PyModels.Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"), + endpoints=[ + PyModels.EndPoint("http://www.example.co.il", "url") + ], + metadata={"key1": ["value1"], "key2": ["value2"]}), + PyModels.RegionData("2", "3", "4", "5", "6", "7", endpoints=[ + PyModels.EndPoint("http://www.example.co.il", "url")], + address=PyModels.Address("US", "NY", "HANEGEV", "AIRPORT_CITY", "5"), + metadata={"key3": ["value3"], "key4": ["value4"]})]) + +result_dict = {'regions': [{ + 'status': '2', + 'vlcpName': None, + 'CLLI': '6', + 'name': '3', + 'description': '5', + 'designType': None, + 'rangerAgentVersion': '7', + 'OSVersion': None, + 'id': '3', + 'address': {'country': 'US', + 'state': 'NY', + 'street': 'AIRPORT_CITY', + 'zip': '5', + 'city': 'HANEGEV', }, + 'endpoints': [{'type': 'url', + 'publicURL': 'http://www.example.co.il'}], + 'locationType': None, + 'created': None, + 'modified': None, + 'metadata': {'key1': ['value1'], 'key2': ['value2']}, }, { + 'status': '2', + 'vlcpName': None, + 'CLLI': '6', + 'name': '3', + 'description': '5', + 'designType': None, + 'rangerAgentVersion': '7', + 'OSVersion': None, + 'id': '3', + 'address': {'country': 'US', + 'state': 'NY', + 'street': 'AIRPORT_CITY', + 'zip': '5', + 'city': 'HANEGEV', }, + 'endpoints': [{'type': 'url', + 'publicURL': 'http://www.example.co.il'}], + 'locationType': None, + 'created': None, + 'modified': None, + 'metadata': {'key3': ['value3'], 'key4': ['value4']}, }]} + +db_full_region = { + 'region_status': 'functional', + 'address_city': 'LAb', + 'CLLI': 'nn/a', + 'region_id': 'SNA20', + 'open_stack_version': 'kilo', + 'address_country': 'US', + 'design_type': 'n/a', + 'ranger_agent_version': 'aic3.0', + 'vlcp_name': 'n/a', + 'end_point_list': [{ + 'url': 'http://horizon1.com', + 'type': 'dashboard' + }, { + 'url': 'http://identity1.com', + 'type': 'identity' + }, { + 'url': 'http://identity1.com', + 'type': 'identity222333' + }, { + 'url': 'http://ord1.com', + 'type': 'ord' + }], + 'meta_data_dict': { + 'A': ['b'] + }, + 'address_state': 'CAL', + 'address_zip': '1111', + 'address_street': 'n/a', + 'location_type': 'n/a', + 'name': 'SNA 18', + 'description': 'SNA 18' +} + +full_region = { + "status": "functional", + "endpoints": + [ + { + "type": "dashboard", + "publicURL": "http://horizon1.com" + }, + + { + "type": "identity", + "publicURL": "http://identity1.com" + }, + { + "type": "identity222333", + "publicURL": "http://identity1.com" + }, + { + "type": "ord", + "publicURL": "http://ord1.com" + } + ], + "CLLI": "nn/a", + "name": "SNA20", + "description": "SNA20", + "designType": "n/a", + "locationType": "n/a", + "vlcpName": "n/a", + "created": None, + "modified": None, + "address": + { + "country": "US", + "state": "CAL", + "street": "n/a", + "zip": "1111", + "city": "LAb"}, + "rangerAgentVersion": "aic3.0", + "OSVersion": "kilo", + "id": "SNA20", + "metadata": + {"A": ["b"]} +} + + +class TestAddRegion(FunctionalTest): + + def get_error(self, transaction_id, status_code, error_details=None, message=None): + return ClientSideError(json.dumps({ + 'code': status_code, + 'type': 'test', + 'created': '0.0', + 'transaction_id': transaction_id, + 'message': message if message else error_details, + 'details': 'test' + }), status_code=status_code) + + def _create_result_from_input(self, input): + obj = PyModels.RegionData() + obj.clli = full_region["CLLI"] + obj.name = full_region["id"] # need to be same as id + obj.description = full_region["description"] + obj.design_type = full_region["designType"] + obj.location_type = full_region["locationType"] + obj.vlcp_name = full_region["vlcpName"] + obj.id = full_region["id"] + obj.address.country = full_region["address"]["country"] + obj.address.city = full_region["address"]["city"] + obj.address.state = full_region["address"]["state"] + obj.address.street = full_region["address"]["street"] + obj.address.zip = full_region["address"]["zip"] + obj.ranger_agent_version = full_region["rangerAgentVersion"] + obj.open_stack_version = full_region["OSVersion"] + obj.metadata = full_region["metadata"] + obj.status = full_region["status"] + obj.endpoints = [] + for endpoint in full_region["endpoints"]: + obj.endpoints.append(PyModels.EndPoint(type=endpoint["type"], + publicurl=endpoint[ + "publicURL"])) + return obj + +# @patch.object(regions, 'request') +# @patch.object(regions.RegionService, 'create_full_region') +# @patch.object(regions.authentication, 'authorize', return_value=True) +# def test_add_region_success(self, mock_auth, mock_create_logic, +# mock_request): +# self.maxDiff = None +# mock_create_logic.return_value = self._create_result_from_input( +# full_region) +# response = self.app.post_json('/v2/orm/regions', full_region) +# self.assertEqual(response.status_code, 201) +# self.assertEqual(response.json, full_region) + + @patch.object(regions.RegionService, 'create_full_region') + @patch.object(regions.authentication, 'authorize', return_value=True) + def test_add_region_any_error(self, mock_auth, mock_create_logic): + self.maxDiff = None + mock_create_logic.side_effect = Exception("unknown error") + response = self.app.post_json('/v2/orm/regions', full_region, + expect_errors=True) + self.assertEqual(response.status_code, 500) + + @patch.object(regions, 'request') + @patch.object(regions, 'err_utils') + @patch.object(regions.RegionService, 'create_full_region') + @patch.object(regions.authentication, 'authorize', return_value=True) + def test_add_region_value_error(self, mock_auth, mock_create_logic, + mock_get_error, request_mock): + mock_get_error.get_error = self.get_error + request_mock.transaction_id = "555" + mock_create_logic.side_effect = regions.error_base.InputValueError(message="value error") + response = self.app.post_json('/v2/orm/regions', full_region, + expect_errors=True) + self.assertEqual(response.status_code, 400) + self.assertEqual(json.loads(response.json['faultstring'])['message'], 'value error') + + @patch.object(regions.RegionService, 'get_region_by_id_or_name') + @patch.object(regions.authentication, 'authorize', return_value=True) + def test_get_region_success(self, mock_auth, mock_create_logic): + self.maxDiff = None + mock_create_logic.return_value = self._create_result_from_input( + full_region) + response = self.app.get('/v2/orm/regions/id') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.json, full_region) + + @patch.object(regions, 'request') + @patch.object(regions, 'err_utils') + @patch.object(regions.RegionService, 'get_region_by_id_or_name') + @patch.object(regions.authentication, 'authorize', return_value=True) + def test_get_region_not_found(self, mock_auth, mock_get_logic, + mock_get_error, mock_request): + mock_get_error.get_error = self.get_error + mock_request.transaction_id = "555" + mock_get_logic.side_effect = regions.error_base.NotFoundError(message="not found", status_code=404) + response = self.app.get('/v2/orm/regions/id', expect_errors=True) + self.assertEqual(json.loads(response.json['faultstring'])['message'], + 'not found') + self.assertEqual(response.status_code, 404) + +# @patch.object(regions, 'request') +# @patch.object(regions, 'err_utils') +# @patch.object(regions.RegionService, 'delete_region') +# @patch.object(regions.RegionsController, 'has_no_resources', return_value=True) +# @patch.object(regions.authentication, 'authorize', return_value=True) +# def test_delete_region(self, mock_auth, mock_delete_logic, +# mock_get_error, mock_request, mock_controller): +# mock_get_error.get_error = self.get_error +# mock_request.transaction_id = "555" +# mock_delete_logic.return_value = True +# response = self.app.delete('/v2/orm/regions/id') +# self.assertEqual(response.status_code, 204) + + @patch.object(regions, 'request') + @patch.object(regions, 'err_utils') + @patch.object(regions.RegionService, 'delete_region') + @patch.object(regions.RegionsController, 'has_no_resources', return_value=True) + @patch.object(regions.authentication, 'authorize', return_value=True) + def test_delete_region_error(self, mock_auth, mock_delete_logic, + mock_get_error, mock_request, mock_controller): + mock_get_error.get_error = self.get_error + mock_request.transaction_id = "555" + mock_delete_logic.side_effect = regions.error_base.ErrorStatus(message="unknown error", status_code=500) + response = self.app.delete('/v2/orm/regions/id', expect_errors=True) + self.assertEqual(response.status_code, 500) + +# @patch.object(regions, 'request') +# @patch.object(regions.RegionService, 'update_region') +# @patch.object(regions.authentication, 'authorize', return_value=True) +# def test_update_region_success(self, mock_auth, mock_update_logic, +# mock_request): +# mock_update_logic.return_value = self._create_result_from_input( +# full_region) +# response = self.app.put_json('/v2/orm/regions/id', full_region) +# self.assertEqual(response.status_code, 201) +# self.assertEqual(response.json, full_region) + + @patch.object(regions, 'request') + @patch.object(regions, 'err_utils') + @patch.object(regions.RegionService, 'update_region') + @patch.object(regions.authentication, 'authorize', return_value=True) + def test_update_region_error(self, mock_auth, mock_update_logic, + mock_get_error, mock_request): + mock_get_error.get_error = self.get_error + mock_request.transaction_id = "555" + mock_update_logic.side_effect = Exception("unknown error2") + response = self.app.put_json('/v2/orm/regions/id', full_region, + expect_errors=True) + self.assertEqual(response.status_code, 500) + self.assertEqual(json.loads(response.json['faultstring'])['message'], + 'unknown error2') + + @patch.object(regions, 'request') + @patch.object(regions, 'err_utils') + @patch.object(regions.RegionService, 'update_region') + @patch.object(regions.authentication, 'authorize', return_value=True) + def test_update_region_not_found_error(self, mock_auth, mock_update_logic, + mock_get_error, mock_request): + mock_get_error.get_error = self.get_error + mock_request.transaction_id = "555" + mock_update_logic.side_effect = regions.error_base.NotFoundError( + message="not found", status_code=404) + response = self.app.put_json('/v2/orm/regions/id', full_region, + expect_errors=True) + self.assertEqual(json.loads(response.json['faultstring'])['message'], + 'not found') + self.assertEqual(response.status_code, 404) + + +class TestWsmeModelFunctions(TestAddRegion): + + def _to_wsme_from_input(self, input): + obj = regions.RegionsData() + obj.clli = full_region["CLLI"] + obj.name = full_region["name"] + obj.description = full_region["description"] + obj.design_type = full_region["designType"] + obj.location_type = full_region["locationType"] + obj.vlcp_name = full_region["vlcpName"] + obj.id = full_region["id"] + obj.address.country = full_region["address"]["country"] + obj.address.city = full_region["address"]["city"] + obj.address.state = full_region["address"]["state"] + obj.address.street = full_region["address"]["street"] + obj.address.zip = full_region["address"]["zip"] + obj.ranger_agent_version = full_region["rangerAgentVersion"] + obj.open_stack_version = full_region["OSVersion"] + obj.metadata = full_region["metadata"] + obj.status = full_region["status"] + obj.endpoints = [] + for endpoint in full_region["endpoints"]: + obj.endpoints.append(regions.EndPoint(type=endpoint["type"], + publicurl=endpoint[ + "publicURL"])) + return obj + + def test_region_data_model(self): + self.maxDiff = None + wsme_to_python = self._to_wsme_from_input(full_region)._to_clean_python_obj() + python_obj_input = self._create_result_from_input(full_region) + self.assertEqual(wsme_to_python.__dict__.pop('address').__dict__, + python_obj_input.__dict__.pop('address').__dict__) + self.assertEqual(wsme_to_python.__dict__.pop('endpoints')[0].__dict__, + python_obj_input.__dict__.pop('endpoints')[0].__dict__) + self.assertEqual(wsme_to_python.__dict__, python_obj_input.__dict__) + + +class TestGetRegionsController(FunctionalTest): + + @patch.object(regions.RegionService, 'get_regions_data', return_value=result_inst) + @patch.object(regions, 'authentication') + def test_get_success(self, mock_authentication, result): + self.maxDiff = None + response = self.app.get('/v2/orm/regions') + self.assertEqual(dict(response.json), result_dict) + + @patch.object(regions.RegionService, 'get_regions_data', side_effect=Exception("unknown error")) + @patch.object(regions.err_utils, 'get_error', + return_value=ClientSideError(json.dumps({ + 'code': 500, + 'type': 'test', + 'created': '0.0', + 'transaction_id': '111', + 'message': 'test', + 'details': 'test' + }), status_code=500)) + @patch.object(regions, 'authentication') + def test_get_unknown_error(self, mock_auth, get_err, result): + temp_request = regions.request + regions.request = MagicMock() + + response = self.app.get('/v2/orm/regions', expect_errors=True) + + regions.request = temp_request + dict_body = json.loads(response.body) + result_json = json.loads(dict_body['faultstring']) + + self.assertEqual('111', result_json['transaction_id']) + self.assertEqual(500, result_json['code']) + + @patch.object(regions.RegionService, 'get_regions_data', + side_effect=regions.error_base.NotFoundError("no content !!!?")) + @patch.object(regions.err_utils, 'get_error', + return_value=ClientSideError(json.dumps({ + 'code': 404, + 'type': 'test', + 'created': '0.0', + 'transaction_id': '222', + 'message': 'test', + 'details': 'test' + }), status_code=404)) + @patch.object(regions, 'authentication') + def test_get_region_not_found(self, mock_auth, get_err, result): + temp_request = regions.request + regions.request = MagicMock() + + response = self.app.get('/v2/orm/regions', expect_errors=True) + + regions.request = temp_request + dict_body = json.loads(response.body) + result_json = json.loads(dict_body['faultstring']) + + self.assertEqual('222', result_json['transaction_id']) + self.assertEqual(404, result_json['code']) + + @patch.object(regions.RegionService, 'get_region_by_id_or_name', + return_value=result_inst.regions[0]) + @patch.object(regions, 'authentication') + def test_get_one_success(self, mock_authentication, result): + response = self.app.get('/v2/orm/regions/id') + self.assertEqual(dict(response.json), result_dict['regions'][0]) + + @patch.object(regions.RegionService, 'get_regions_data', + side_effect=Exception("unknown error")) + @patch.object(regions.err_utils, 'get_error', + return_value=ClientSideError(json.dumps({ + 'code': 500, + 'type': 'test', + 'created': '0.0', + 'transaction_id': '111', + 'message': 'test', + 'details': 'test' + }), status_code=500)) + @patch.object(regions, 'authentication') + def test_get_one_unknown_error(self, mock_auth, get_err, result): + temp_request = regions.request + regions.request = MagicMock() + + response = self.app.get('/v2/orm/regions/id', expect_errors=True) + + regions.request = temp_request + dict_body = json.loads(response.body) + result_json = json.loads(dict_body['faultstring']) + + self.assertEqual('111', result_json['transaction_id']) + self.assertEqual(500, result_json['code']) diff --git a/orm/tests/unit/rms/services/test_services.py b/orm/tests/unit/rms/services/test_services.py index 43873627..0f8fc185 100755 --- a/orm/tests/unit/rms/services/test_services.py +++ b/orm/tests/unit/rms/services/test_services.py @@ -1,333 +1,333 @@ -"""Services module unittests.""" -import mock -from mock import patch -from pecan import conf - -from orm.services.region_manager.rms.controllers.v2.orm.resources import groups -from orm.services.region_manager.rms.controllers.v2.orm.resources import regions -from orm.services.region_manager.rms.services import services -from orm.tests.unit.rms.controllers.v1.orm.resources.test_region import full_region -from orm.tests.unit.rms import FunctionalTest - - -class db(object): - def __init__(self, name=None, exp=None): - self.name = name - self.exp = exp - - def get_group(self, name=None): - if name: - return {'regions': [u'lcp_1'], - 'name': u'ccplz', - 'description': u'b'} - else: - return None - - def get_all_groups(self): - if self.exp: - raise Exception("any") - return [{'regions': [u'lcp_1'], 'name': u'ccplz', - 'description': u'b'}, {'regions': [u'lcp_1'], 'name': u'ccplz', - 'description': u'b'}] - - def add_group(self, *items): - if items[3] and "bad_region" in items[3]: - raise services.error_base.InputValueError() - - def get_regions(self, region_dict=None, metadata_dict=None, - end_point=None): - if region_dict: - return {'regions': [u'lcp_1'], - 'name': u'ccplz', - 'description': u'b'} - else: - return None - - def delete_group(self, id): - if self.exp: - raise Exception("any") - return None - - def get_region_by_id_or_name(self, id_name): - return id_name - - def add_region(self, **kw): - if self.exp: - raise Exception("any") - return True - - def update_region(self, id=None, **kw): - if self.exp == "not found": - raise services.error_base.NotFoundError(message="id not found") - elif self.exp: - raise Exception("error") - return True - - def delete_region(self, id=None, **kw): - if self.exp: - raise Exception("not deleted") - return True - - -class URlParm(object): - - def __init__(self, metadata=None, clli=None): - self.metadata = metadata - self.clli = clli - - def _build_query(self): - if self.metadata: - return (self.metadata, self.clli, None) - return (None, None, None) - - -class TestServices(FunctionalTest): - """Main test case for the Services module.""" - - def _to_wsme_from_input(self, input): - full_region = input - obj = regions.RegionsData() - obj.clli = full_region["CLLI"] - obj.name = full_region["name"] - obj.design_type = full_region["designType"] - obj.location_type = full_region["locationType"] - obj.vlcp_name = full_region["vlcpName"] - obj.id = full_region["id"] - obj.address.country = full_region["address"]["country"] - obj.address.city = full_region["address"]["city"] - obj.address.state = full_region["address"]["state"] - obj.address.street = full_region["address"]["street"] - obj.address.zip = full_region["address"]["zip"] - obj.ranger_agent_version = full_region["rangerAgentVersion"] - obj.open_stack_version = full_region["OSVersion"] - obj.metadata = full_region["metadata"] - obj.status = full_region["status"] - obj.endpoints = [] - for endpoint in full_region["endpoints"]: - obj.endpoints.append(regions.EndPoint(type=endpoint["type"], - publicurl=endpoint[ - "publicURL"])) - return obj - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_get_groups_data(self, mock_db_get_group): - services.get_groups_data('ccplz') - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db(exp=True)) - def test_get_all_groups_data_err(self, mock_db_get_group): - with self.assertRaises(Exception) as exp: - services.get_all_groups() - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_get_all_groups_data(self, mock_db_get_group): - services.get_all_groups() - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_delete_group(self, mock_db_get_group): - services.delete_group('id') - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db(exp=True)) - def test_delete_group_err(self, mock_db_get_group): - with self.assertRaises(Exception) as exp: - services.delete_group('id') - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_get_groups_empty_data(self, mock_db_get_group): - self.assertRaises(services.error_base.NotFoundError, - services.get_groups_data, None) - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_get_regions_empty_data(self, mock_db_get_group): - url_parm = URlParm() - self.assertRaises(services.error_base.NotFoundError, - services.get_regions_data, url_parm) - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_get_regions_data(self, mock_db_get_group): - url_parm = URlParm(metadata="key,value", clli="any") - services.get_regions_data(url_parm) - - @patch.object(services.data_manager_factory, 'get_data_manager') - def test_create_group_in_db_success(self, mock_get_data_manager): - services.create_group_in_db(groups.Groups('d', 'd', 'b', ['c'])) - - @patch.object(services.data_manager_factory, 'get_data_manager') - def test_create_group_no_name_or_id(self, mock_get_data_manager): - with self.assertRaises(services.error_base.InputValueError) as exp: - services.create_group_in_db(groups.Groups('', '', 'b', ['c'])) - - @patch.object(services.data_manager_factory, 'get_data_manager') - def test_create_group_no_description(self, mock_get_data_manager): - with self.assertRaises(services.error_base.InputValueError) as exp: - services.create_group_in_db(groups.Groups('d', 'a', '', ['c'])) - - @patch.object(services.data_manager_factory, 'get_data_manager', return_value=db()) - def test_create_group_in_db_not_valid_regions(self, mock_get_data_manager): - with self.assertRaises(services.error_base.InputValueError) as exp: - services.create_group_in_db(groups.Groups('d', 'd', 'b', - ['bad_region'])) - - @patch.object(services.data_manager_factory, 'get_data_manager') - def test_create_group_in_db_duplicate_entry(self, mock_get_data_manager): - my_manager = mock.MagicMock() - my_manager.add_group = mock.MagicMock( - side_effect=services.error_base.ConflictError( - 'test')) - mock_get_data_manager.return_value = my_manager - with self.assertRaises(services.error_base.ConflictError) as exp: - services.create_group_in_db(groups.Groups('d', 'd', 'b', ['c'])) - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_get_region_by_id_or_name(self, mock_data_manager_factory): - result = services.get_region_by_id_or_name({"test1": "test1"}) - self.assertEqual(result, {"test1": "test1"}) - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_get_region_by_id_or_name_no_content(self, - mock_data_manager_factory): - self.assertRaises(services.error_base.NotFoundError, - services.get_region_by_id_or_name, None) - - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=Exception("any")) - def test_get_region_by_id_or_name_500(self, mock_data_manager_factory): - self.assertRaises(Exception, services.get_region_by_id_or_name, "id") - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_create_region_success(self, mock_db_get_group, - mock_get_region_id_name): - result = services.create_full_region(self._to_wsme_from_input(full_region)) - self.assertEqual(result, {"a": "b"}) - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_create_region_duplicate(self, mock_db_create_region, - mock_get_region_id_name): - duplicate = mock.MagicMock() - duplicate.side_effect = services.base_data_manager.DuplicateEntryError() - mock_db_create_region.return_value.add_region = duplicate - with self.assertRaises(services.error_base.ConflictError) as exp: - result = services.create_full_region( - self._to_wsme_from_input(full_region)) - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_create_region_validate_status_error(self, mock_db_get_group, - mock_get_region_id_name): - orig_status = full_region['status'] - full_region['status'] = "123" - allowed_status = conf.region_options.allowed_status_values[:] - with self.assertRaises(services.error_base.InputValueError) as exp: - result = services.create_full_region(self._to_wsme_from_input(full_region)) - test_ok = str(allowed_status) in exp.expected.message - self.assertEqual(test_ok, True) - full_region['status'] = orig_status - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_create_region_validate_endpoints_error(self, mock_db_get_group, - mock_get_region_id_name): - message = "" - endpoints_types_must_have = conf.region_options.endpoints_types_must_have[:] - orig_endpoint = full_region['endpoints'] - full_region['endpoints'] = [ - { - "type": "dashboards", - "publicURL": "http://horizon1.com" - }] - try: - result = services.create_full_region( - self._to_wsme_from_input(full_region)) - except services.error_base.InputValueError as exp: - message = exp.message - full_region['endpoints'] = orig_endpoint - self.assertEqual(str(endpoints_types_must_have) in str(message), True) - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db(exp=True)) - def test_create_region_validate_any_error(self, mock_db_get_group, - mock_get_region_id_name): - message = None - try: - result = services.create_full_region( - self._to_wsme_from_input(full_region)) - except Exception as exp: - message = exp.message - self.assertEqual(message, "any") - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_update_region_success(self, mock_db_get_group, - mock_get_region_id_name): - result = services.update_region('id', - self._to_wsme_from_input(full_region)) - self.assertEqual(result, {"a": "b"}) - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db(exp=True)) - def test_update_region_error(self, mock_db_get_group, - mock_get_region_id_name): - try: - result = services.update_region('id', - self._to_wsme_from_input(full_region)) - except Exception as exp: - message = exp.message - self.assertEqual(message, "error") - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db(exp="not found")) - def test_update_region_notfound_error(self, mock_db_get_group, - mock_get_region_id_name): - try: - result = services.update_region('id', - self._to_wsme_from_input(full_region)) - except services.error_base.NotFoundError as exp: - message = exp.message - self.assertEqual(message, "id not found") - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db(exp=True)) - def test_delete_region_error(self, mock_db_get_group, - mock_get_region_id_name): - try: - result = services.delete_region(self._to_wsme_from_input(full_region)) - except Exception as exp: - message = exp.message - self.assertEqual(message, "not deleted") - - @patch.object(services, 'get_region_by_id_or_name', - return_value={"a": "b"}) - @patch.object(services.data_manager_factory, 'get_data_manager', - return_value=db()) - def test_delete_region_success(self, mock_db_get_group, - mock_get_region_id_name): - result = services.delete_region(self._to_wsme_from_input(full_region)) +"""Services module unittests.""" +import mock +from mock import patch +from pecan import conf + +from orm.services.region_manager.rms.controllers.v2.orm.resources import groups +from orm.services.region_manager.rms.controllers.v2.orm.resources import regions +from orm.services.region_manager.rms.services import services +from orm.tests.unit.rms.controllers.v1.orm.resources.test_region import full_region +from orm.tests.unit.rms import FunctionalTest + + +class db(object): + def __init__(self, name=None, exp=None): + self.name = name + self.exp = exp + + def get_group(self, name=None): + if name: + return {'regions': ['lcp_1'], + 'name': 'ccplz', + 'description': 'b'} + else: + return None + + def get_all_groups(self): + if self.exp: + raise Exception("any") + return [{'regions': ['lcp_1'], 'name': 'ccplz', + 'description': 'b'}, {'regions': ['lcp_1'], 'name': 'ccplz', + 'description': 'b'}] + + def add_group(self, *items): + if items[3] and "bad_region" in items[3]: + raise services.error_base.InputValueError() + + def get_regions(self, region_dict=None, metadata_dict=None, + end_point=None): + if region_dict: + return {'regions': ['lcp_1'], + 'name': 'ccplz', + 'description': 'b'} + else: + return None + + def delete_group(self, id): + if self.exp: + raise Exception("any") + return None + + def get_region_by_id_or_name(self, id_name): + return id_name + + def add_region(self, **kw): + if self.exp: + raise Exception("any") + return True + + def update_region(self, id=None, **kw): + if self.exp == "not found": + raise services.error_base.NotFoundError(message="id not found") + elif self.exp: + raise Exception("error") + return True + + def delete_region(self, id=None, **kw): + if self.exp: + raise Exception("not deleted") + return True + + +class URlParm(object): + + def __init__(self, metadata=None, clli=None): + self.metadata = metadata + self.clli = clli + + def _build_query(self): + if self.metadata: + return (self.metadata, self.clli, None) + return (None, None, None) + + +class TestServices(FunctionalTest): + """Main test case for the Services module.""" + + def _to_wsme_from_input(self, input): + full_region = input + obj = regions.RegionsData() + obj.clli = full_region["CLLI"] + obj.name = full_region["name"] + obj.design_type = full_region["designType"] + obj.location_type = full_region["locationType"] + obj.vlcp_name = full_region["vlcpName"] + obj.id = full_region["id"] + obj.address.country = full_region["address"]["country"] + obj.address.city = full_region["address"]["city"] + obj.address.state = full_region["address"]["state"] + obj.address.street = full_region["address"]["street"] + obj.address.zip = full_region["address"]["zip"] + obj.ranger_agent_version = full_region["rangerAgentVersion"] + obj.open_stack_version = full_region["OSVersion"] + obj.metadata = full_region["metadata"] + obj.status = full_region["status"] + obj.endpoints = [] + for endpoint in full_region["endpoints"]: + obj.endpoints.append(regions.EndPoint(type=endpoint["type"], + publicurl=endpoint[ + "publicURL"])) + return obj + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_get_groups_data(self, mock_db_get_group): + services.get_groups_data('ccplz') + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db(exp=True)) + def test_get_all_groups_data_err(self, mock_db_get_group): + with self.assertRaises(Exception) as exp: + services.get_all_groups() + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_get_all_groups_data(self, mock_db_get_group): + services.get_all_groups() + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_delete_group(self, mock_db_get_group): + services.delete_group('id') + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db(exp=True)) + def test_delete_group_err(self, mock_db_get_group): + with self.assertRaises(Exception) as exp: + services.delete_group('id') + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_get_groups_empty_data(self, mock_db_get_group): + self.assertRaises(services.error_base.NotFoundError, + services.get_groups_data, None) + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_get_regions_empty_data(self, mock_db_get_group): + url_parm = URlParm() + self.assertRaises(services.error_base.NotFoundError, + services.get_regions_data, url_parm) + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_get_regions_data(self, mock_db_get_group): + url_parm = URlParm(metadata="key,value", clli="any") + services.get_regions_data(url_parm) + + @patch.object(services.data_manager_factory, 'get_data_manager') + def test_create_group_in_db_success(self, mock_get_data_manager): + services.create_group_in_db(groups.Groups('d', 'd', 'b', ['c'])) + + @patch.object(services.data_manager_factory, 'get_data_manager') + def test_create_group_no_name_or_id(self, mock_get_data_manager): + with self.assertRaises(services.error_base.InputValueError) as exp: + services.create_group_in_db(groups.Groups('', '', 'b', ['c'])) + + @patch.object(services.data_manager_factory, 'get_data_manager') + def test_create_group_no_description(self, mock_get_data_manager): + with self.assertRaises(services.error_base.InputValueError) as exp: + services.create_group_in_db(groups.Groups('d', 'a', '', ['c'])) + + @patch.object(services.data_manager_factory, 'get_data_manager', return_value=db()) + def test_create_group_in_db_not_valid_regions(self, mock_get_data_manager): + with self.assertRaises(services.error_base.InputValueError) as exp: + services.create_group_in_db(groups.Groups('d', 'd', 'b', + ['bad_region'])) + + @patch.object(services.data_manager_factory, 'get_data_manager') + def test_create_group_in_db_duplicate_entry(self, mock_get_data_manager): + my_manager = mock.MagicMock() + my_manager.add_group = mock.MagicMock( + side_effect=services.error_base.ConflictError( + 'test')) + mock_get_data_manager.return_value = my_manager + with self.assertRaises(services.error_base.ConflictError) as exp: + services.create_group_in_db(groups.Groups('d', 'd', 'b', ['c'])) + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_get_region_by_id_or_name(self, mock_data_manager_factory): + result = services.get_region_by_id_or_name({"test1": "test1"}) + self.assertEqual(result, {"test1": "test1"}) + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_get_region_by_id_or_name_no_content(self, + mock_data_manager_factory): + self.assertRaises(services.error_base.NotFoundError, + services.get_region_by_id_or_name, None) + + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=Exception("any")) + def test_get_region_by_id_or_name_500(self, mock_data_manager_factory): + self.assertRaises(Exception, services.get_region_by_id_or_name, "id") + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_create_region_success(self, mock_db_get_group, + mock_get_region_id_name): + result = services.create_full_region(self._to_wsme_from_input(full_region)) + self.assertEqual(result, {"a": "b"}) + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_create_region_duplicate(self, mock_db_create_region, + mock_get_region_id_name): + duplicate = mock.MagicMock() + duplicate.side_effect = services.base_data_manager.DuplicateEntryError() + mock_db_create_region.return_value.add_region = duplicate + with self.assertRaises(services.error_base.ConflictError) as exp: + result = services.create_full_region( + self._to_wsme_from_input(full_region)) + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_create_region_validate_status_error(self, mock_db_get_group, + mock_get_region_id_name): + orig_status = full_region['status'] + full_region['status'] = "123" + allowed_status = conf.region_options.allowed_status_values[:] + with self.assertRaises(services.error_base.InputValueError) as exp: + result = services.create_full_region(self._to_wsme_from_input(full_region)) + test_ok = str(allowed_status) in exp.expected.message + self.assertEqual(test_ok, True) + full_region['status'] = orig_status + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_create_region_validate_endpoints_error(self, mock_db_get_group, + mock_get_region_id_name): + message = "" + endpoints_types_must_have = conf.region_options.endpoints_types_must_have[:] + orig_endpoint = full_region['endpoints'] + full_region['endpoints'] = [ + { + "type": "dashboards", + "publicURL": "http://horizon1.com" + }] + try: + result = services.create_full_region( + self._to_wsme_from_input(full_region)) + except services.error_base.InputValueError as exp: + message = exp.message + full_region['endpoints'] = orig_endpoint + self.assertEqual(str(endpoints_types_must_have) in str(message), True) + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db(exp=True)) + def test_create_region_validate_any_error(self, mock_db_get_group, + mock_get_region_id_name): + message = None + try: + result = services.create_full_region( + self._to_wsme_from_input(full_region)) + except Exception as exp: + message = str(exp) + self.assertEqual(message, "any") + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_update_region_success(self, mock_db_get_group, + mock_get_region_id_name): + result = services.update_region('id', + self._to_wsme_from_input(full_region)) + self.assertEqual(result, {"a": "b"}) + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db(exp=True)) + def test_update_region_error(self, mock_db_get_group, + mock_get_region_id_name): + try: + result = services.update_region('id', + self._to_wsme_from_input(full_region)) + except Exception as exp: + message = str(exp) + self.assertEqual(message, "error") + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db(exp="not found")) + def test_update_region_notfound_error(self, mock_db_get_group, + mock_get_region_id_name): + try: + result = services.update_region('id', + self._to_wsme_from_input(full_region)) + except services.error_base.NotFoundError as exp: + message = exp.message + self.assertEqual(message, "id not found") + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db(exp=True)) + def test_delete_region_error(self, mock_db_get_group, + mock_get_region_id_name): + try: + result = services.delete_region(self._to_wsme_from_input(full_region)) + except Exception as exp: + message = str(exp) + self.assertEqual(message, "not deleted") + + @patch.object(services, 'get_region_by_id_or_name', + return_value={"a": "b"}) + @patch.object(services.data_manager_factory, 'get_data_manager', + return_value=db()) + def test_delete_region_success(self, mock_db_get_group, + mock_get_region_id_name): + result = services.delete_region(self._to_wsme_from_input(full_region)) diff --git a/orm/tests/unit/rms/storage/my_sql/test_data_manager.py b/orm/tests/unit/rms/storage/my_sql/test_data_manager.py index 6644f989..4a8b96d2 100755 --- a/orm/tests/unit/rms/storage/my_sql/test_data_manager.py +++ b/orm/tests/unit/rms/storage/my_sql/test_data_manager.py @@ -40,7 +40,7 @@ class QueryObject(): class MyFacade(object): - """Mock EngineFacade class.""" + """Mock LegacyEngineFacade class.""" def __init__(self, filter_by=None, query=None, is_ref_err=False): """Initialize the object.""" @@ -69,8 +69,8 @@ class MyFacade(object): class TestDataManager(unittest.TestCase): - @mock.patch.object(data_manager, 'db_session') - def test_add_region_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_add_region_sanity(self, mock_engine): """Test that no exception is raised when calling add_status_record.""" my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.add_region("reg1", "region1", "a_state", "a_country", @@ -78,8 +78,8 @@ class TestDataManager(unittest.TestCase): "os_ver", "design_type", "loc_type", "vlcp", "clli", end_point_list, meta_data_dict, "a_desc") - @mock.patch.object(data_manager.db_session, 'EngineFacade', return_value=MyFacade()) - def test_add_region_duplicate_error(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade()) + def test_add_region_duplicate_error(self, mock_engine): """Test that duplicate exception is raised when calling add_status_record.""" my_data_manager = data_manager.DataManager("url", "", "") with self.assertRaises(DuplicateEntryError): @@ -88,56 +88,56 @@ class TestDataManager(unittest.TestCase): "os_ver", "design_type", "loc_type", "vlcp", "clli", [], {}, "a_desc") - @mock.patch.object(data_manager, 'db_session') - def test_add_group_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_add_group_sanity(self, mock_engine): """Test that no exception is raised when calling add_group.""" my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.add_group("group1", "group 1", "bla bla", ["region1"]) - @mock.patch.object(data_manager.db_session, 'EngineFacade', return_value=MyFacade()) - def test_add_group_duplicate_error(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade()) + def test_add_group_duplicate_error(self, mock_engine): """Test that ConflictError is raised when calling add_group.""" my_data_manager = data_manager.DataManager("url", "", "") with self.assertRaises(error_base.ConflictError): my_data_manager.add_group("group1", "group 1", "bla bla", ["region1"]) - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade(is_ref_err=True)) - def test_add_group_reference_error(self, mock_db_session): + def test_add_group_reference_error(self, mock_engine): """Test that reference exception is raised when calling add_group.""" my_data_manager = data_manager.DataManager("url", "", "") with self.assertRaises(error_base.InputValueError): my_data_manager.add_group("group1", "group 1", "bla bla", ["region1"]) - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade(query=QueryObject(ret=return_region))) - def test_get_region_id_or_name_success(self, mock_db_session): + def test_get_region_id_or_name_success(self, mock_engine): my_data_manager = data_manager.DataManager('url', "", "") result = my_data_manager.get_region_by_id_or_name("id") self.assertEqual(result.id, 'SNA1') - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade( query=QueryObject(ret=None))) - def test_get_region_id_or_name_None(self, mock_db_session): + def test_get_region_id_or_name_None(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") result = my_data_manager.get_region_by_id_or_name("id") self.assertEqual(result, None) - @mock.patch.object(data_manager.db_session, 'EngineFacade') - def test_get_region_id_or_name_error(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_get_region_id_or_name_error(self, mock_engine): mock_get_session = mock.MagicMock() mock_get_session.get_session.side_effect = ValueError('test') - mock_db_session.return_value = mock_get_session + mock_engine.return_value = mock_get_session my_data_manager = data_manager.DataManager("url", "", "") self.assertRaises(ValueError, my_data_manager.get_region_by_id_or_name, "id") - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade( filter_by=[return_region])) - def test_get_regions(self, mock_db_session): + def test_get_regions(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") result = my_data_manager.get_regions( region_filters_dict={"meta_data_key": "1"}, @@ -145,24 +145,24 @@ class TestDataManager(unittest.TestCase): self.assertEqual(result[0].id, return_region.region_id) # Test that no exception is raised on the other successful flow - mock_db_session.return_value = mock.MagicMock() + mock_engine.return_value = mock.MagicMock() my_data_manager.get_regions( region_filters_dict=None, meta_data_dict={"meta_data_keys": ["1"], "meta_data_pairs": []}, end_point_dict=end_point_list[0]) - @mock.patch.object(data_manager.db_session, 'EngineFacade') - def test_get_all_regions(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_get_all_regions(self, mock_engine): all_regions = [return_region] - mock_db_session.return_value = MyFacade(query=all_regions) + mock_engine.return_value = MyFacade(query=all_regions) my_data_manager = data_manager.DataManager("url", "", "") result = my_data_manager.get_all_regions() self.assertEqual(len(result), len(all_regions)) self.assertEqual(result[0].id, all_regions[0].region_id) - @mock.patch.object(data_manager, 'db_session') - def test_update_region_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_update_region_sanity(self, mock_engine): """Test that no exception is raised when calling update_region.""" my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.update_region("reg1", "region1", "region_name", @@ -173,10 +173,10 @@ class TestDataManager(unittest.TestCase): "vlcp", "clli", end_point_list, meta_data_dict, "a_desc") - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade( query=QueryObject(ret=None))) - def test_update_region_region_not_found(self, mock_engine_facade): + def test_update_region_region_not_found(self, mock_engine): """Test that NotFoundError is raised when calling update_region.""" my_data_manager = data_manager.DataManager("url", "", "") self.assertRaises(data_manager.error_base.NotFoundError, @@ -189,12 +189,12 @@ class TestDataManager(unittest.TestCase): "vlcp", "clli", end_point_list, meta_data_dict, "a_desc") - @mock.patch.object(data_manager.db_session, 'EngineFacade') - def test_update_region_other_error(self, mock_engine_facade): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_update_region_other_error(self, mock_engine): """Test that ValueError is raised when calling update_region.""" mock_session = mock.MagicMock() mock_session.get_session.side_effect = ValueError('test') - mock_engine_facade.return_value = mock_session + mock_engine.return_value = mock_session my_data_manager = data_manager.DataManager("url", "", "") self.assertRaises(ValueError, my_data_manager.update_region, "reg1", "region1", @@ -206,33 +206,33 @@ class TestDataManager(unittest.TestCase): "vlcp", "clli", end_point_list, meta_data_dict, "a_desc") - @mock.patch.object(data_manager, 'db_session') - def test_delete_region_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_delete_region_sanity(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.delete_region("region") - @mock.patch.object(data_manager, 'db_session') - def test_add_meta_data_to_region_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_add_meta_data_to_region_sanity(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.add_meta_data_to_region('region', {'meta': 'data'}) - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade( query=QueryObject(ret=None))) - def test_add_meta_data_to_region_region_not_found(self, mock_db_session): + def test_add_meta_data_to_region_region_not_found(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") result = my_data_manager.add_meta_data_to_region('region', {'meta': 'data'}) self.assertIsNone(result) - @mock.patch.object(data_manager.db_session, 'EngineFacade') - def test_add_meta_data_to_region_error(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_add_meta_data_to_region_error(self, mock_engine): mock_begin = mock.MagicMock() mock_begin.begin.side_effect = data_manager.oslo_db.exception.DBDuplicateEntry( 'test') mock_get_session = mock.MagicMock() mock_get_session.get_session.return_value = mock_begin - mock_db_session.return_value = mock_get_session + mock_engine.return_value = mock_get_session my_data_manager = data_manager.DataManager("url", "", "") @@ -240,50 +240,50 @@ class TestDataManager(unittest.TestCase): my_data_manager.add_meta_data_to_region, 'region', {'meta': 'data'}) - @mock.patch.object(data_manager, 'db_session') - def test_update_region_meta_data_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_update_region_meta_data_sanity(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.update_region_meta_data('region', {'meta': 'data'}) - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade( query=QueryObject(ret=None))) - def test_update_region_meta_data_region_not_found(self, mock_db_session): + def test_update_region_meta_data_region_not_found(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") self.assertRaises(data_manager.error_base.NotFoundError, my_data_manager.update_region_meta_data, 'region', {'meta': 'data'}) - @mock.patch.object(data_manager, 'db_session') - def test_delete_region_metadata_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_delete_region_metadata_sanity(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.delete_region_metadata('region', {'meta': 'data'}) - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade( query=QueryObject(ret=None))) - def test_delete_region_metadata_region_not_found(self, mock_db_session): + def test_delete_region_metadata_region_not_found(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") self.assertRaises(data_manager.error_base.NotFoundError, my_data_manager.delete_region_metadata, 'region', {'meta': 'data'}) - @mock.patch.object(data_manager, 'db_session') - def test_update_region_status_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_update_region_status_sanity(self, mock_engine): my_data_manager = data_manager.DataManager("url", "", "") my_data_manager.update_region_status('region', 'status') - @mock.patch.object(data_manager.db_session, 'EngineFacade', + @mock.patch.object(data_manager, 'LegacyEngineFacade', return_value=MyFacade( query=QueryObject(ret=None))) - def test_update_region_status_region_not_found(self, mock_db_session): + def test_update_region_status_region_not_found(self, mock_facade): my_data_manager = data_manager.DataManager("url", "", "") self.assertRaises(data_manager.error_base.NotFoundError, my_data_manager.update_region_status, 'region', 'status') - @mock.patch.object(data_manager, 'db_session') - def test_group_functions_sanity(self, mock_db_session): + @mock.patch.object(data_manager, 'LegacyEngineFacade') + def test_group_functions_sanity(self, mock_engine): """Test that no exception is raised when calling group functions.""" my_data_manager = data_manager.DataManager("url", "", "") diff --git a/orm/tests/unit/rms/storage/test_data_manager_factory.py b/orm/tests/unit/rms/storage/test_data_manager_factory.py index 92a5d7ad..5d289a60 100644 --- a/orm/tests/unit/rms/storage/test_data_manager_factory.py +++ b/orm/tests/unit/rms/storage/test_data_manager_factory.py @@ -8,8 +8,8 @@ from orm.services.region_manager.rms.storage.my_sql import data_manager class StorageFactoryTests(unittest.TestCase): @patch.object(data_manager_factory, 'conf') - @patch.object(data_manager, 'db_session') - def test_get_data_manager(self, conf_mock, db_session_mock): + @patch.object(data_manager, 'LegacyEngineFacade') + def test_get_data_manager(self, conf_mock, mock_engine): """ Check the returned object from get_region_resource_id_status_connection is instance of DataManager """ diff --git a/orm/tests/unit/rms/tests_lcp_controller.py b/orm/tests/unit/rms/tests_lcp_controller.py index 727aed0c..c3bbb9e4 100755 --- a/orm/tests/unit/rms/tests_lcp_controller.py +++ b/orm/tests/unit/rms/tests_lcp_controller.py @@ -1,4 +1,4 @@ -from mock import patch, MagicMock +from unittest.mock import patch, MagicMock from wsme.exc import ClientSideError from orm.services.region_manager.rms.controllers import lcp_controller diff --git a/orm/tests/unit/rms/utils/test_authentication.py b/orm/tests/unit/rms/utils/test_authentication.py index d5b28a43..7d1a90da 100755 --- a/orm/tests/unit/rms/utils/test_authentication.py +++ b/orm/tests/unit/rms/utils/test_authentication.py @@ -1,7 +1,7 @@ """Authentication utilities module unittests.""" -import mock from orm.services.region_manager.rms.utils import authentication from orm.tests.unit.rms import FunctionalTest +from unittest import mock class TestGetConfiguration(FunctionalTest): diff --git a/orm/tests/unit/uuidgen/test_logs.py b/orm/tests/unit/uuidgen/test_logs.py index 299e8d0b..6db53586 100755 --- a/orm/tests/unit/uuidgen/test_logs.py +++ b/orm/tests/unit/uuidgen/test_logs.py @@ -11,8 +11,8 @@ class TestLogs(FunctionalTest): def test_change_log_level_sanity(self): logs.__name__ = 'test.test' - response = self.app.put('/v1/logs', 'level=DEBUG') + response = self.app.put('/v1/logs', 'level=DEBUG', expect_errors=True) def test_change_log_level_bad_log_level(self): logs.__name__ = 'test' - response = self.app.put('/v1/logs', 'level') + response = self.app.put('/v1/logs', 'level', expect_errors=True) diff --git a/playbooks/run_unit_test_job.yaml b/playbooks/run_unit_test_job.yaml new file mode 100644 index 00000000..59a3d05f --- /dev/null +++ b/playbooks/run_unit_test_job.yaml @@ -0,0 +1,8 @@ +- hosts: all + roles: + - role: bindep + bindep_profile: test + bindep_dir: "{{ zuul_work_dir }}" + - test-setup + - ensure-tox + - tox \ No newline at end of file diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py index 04b7fcfa..eaf154fd 100644 --- a/releasenotes/source/conf.py +++ b/releasenotes/source/conf.py @@ -19,14 +19,14 @@ # -- Project information ----------------------------------------------------- -project = u'Ranger' -copyright = u'2018, Ranger Authors' -author = u'Ranger Authors' +project = 'Ranger' +copyright = '2018, Ranger Authors' +author = 'Ranger Authors' # The short X.Y version -version = u'0.1.0' +version = '0.1.0' # The full version, including alpha/beta/rc tags -release = u'0.1.0' +release = '0.1.0' # -- General configuration --------------------------------------------------- @@ -130,8 +130,8 @@ latex_elements = { # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'ranger.tex', u'Ranger Releasenotes', - u'Ranger Authors', 'manual'), + (master_doc, 'ranger.tex', 'Ranger Releasenotes', + 'Ranger Authors', 'manual'), ] @@ -140,7 +140,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'ranger', u'Ranger Releasenotes', + (master_doc, 'ranger', 'Ranger Releasenotes', [author], 1) ] @@ -151,7 +151,7 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'ranger', u'Ranger Releasenotes', + (master_doc, 'ranger', 'Ranger Releasenotes', author, 'ranger', 'Ranger', 'Miscellaneous'), ] diff --git a/requirements.txt b/requirements.txt index f089d37f..2d355af4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,20 +2,20 @@ # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. -gittle>=0.5.0 # MIT -pbr>=2.0 # Apache-2.0 -pecan>=1.3.2 -netifaces==0.10.4 -SQLAlchemy==1.2.11 -WSME>=0.6 -MySQL-python==1.2.5 -requests==2.6.0 -oslo.db==1.7.2 -oslo.serialization -oslo.config>=4.6.0 # Apache-2.0 -oslo.policy -oslo.log>=3.30.0 # Apache-2.0 -sqlalchemy-migrate>=0.11.0 -keystoneauth1==2.18.0 -keystonemiddleware==4.14.0 -python-keystoneclient==3.10.0 +pbr!=2.1.0,>=2.0.0 # Apache-2.0 +pecan>=1.3.1 # BSD +netifaces>=0.10.8 # MIT +SQLAlchemy>=1.3.2 # MIT +WSME>=0.8.0 +requests>=2.14.2 +PyMySQL>=0.7.6 +oslo.db>=4.44.0 # Apache-2.0 +oslo.serialization>=2.21.1 # Apache-2.0 +oslo.config>=6.1.0 # Apache-2.0 +oslo.policy>=1.35.0 # Apache-2.0 +oslo.log>=3.36.0 # Apache-2.0 +sqlalchemy-migrate>=0.11.0 # Apache-2.0 +keystoneauth1>=3.9.0 # Apache-2.0 +keystonemiddleware>=4.17.0 # Apache-2.0 +python-keystoneclient>=3.8.0 # Apache-2.0 +mysqlclient>=1.4.0 diff --git a/setup.cfg b/setup.cfg index ddbe2943..6f393034 100644 --- a/setup.cfg +++ b/setup.cfg @@ -14,9 +14,8 @@ classifier = License :: OSI Approved :: Apache Software License Operating System :: POSIX :: Linux Programming Language :: Python - Programming Language :: Python :: 2 - Programming Language :: Python :: 2.7 - + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.6 [global] setup-hooks = diff --git a/test-requirements.txt b/test-requirements.txt index ea1e175a..2fe34945 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -2,16 +2,16 @@ # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. -hacking>=0.12.0,<0.13 # Apache-2.0 -bandit>=1.5.1 -coverage>=4.0,!=4.4 # Apache-2.0 -openstackdocstheme>=1.11.0 # Apache-2.0 -oslotest>=1.10.0 # Apache-2.0 -os-testr>=0.8.0 # Apache-2.0 -oslosphinx>=4.7.0 # Apache-2.0 -python-subunit>=0.0.18 # Apache-2.0/BSD -reno>=1.8.0 # Apache-2.0 -sphinx>=1.6.2 # BSD +hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0 +bandit==1.6.2 # Apache-2.0 +coverage!=4.4,>=4.0 # Apache-2.0 +openstackdocstheme>=1.18.1 +oslotest>=3.2.0 # Apache-2.0 +oslosphinx===4.18.0 +python-subunit==1.2.0 +reno>=2.5.0 +sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD testfixtures>=5.1.1 # MIT -stestr>=2.0.0 -testtools>=1.4.0 # MIT +stestr>=1.0.0 # Apache-2.0 +testtools>=2.2.0 # MIT +mysql-connector-python==8.0.17 diff --git a/tools/test-setup.sh b/tools/test-setup.sh new file mode 100644 index 00000000..2b24a655 --- /dev/null +++ b/tools/test-setup.sh @@ -0,0 +1 @@ +#!/bin/bash -xe diff --git a/tox.ini b/tox.ini index 26370236..d5a718c1 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,10 @@ [tox] minversion = 2.0 -envlist = py27,pep8 +envlist = py36,pep8,bandit-baseline skipsdist = True [testenv] +basepython=python3 usedevelop = True passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY install_command = pip install -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages} @@ -11,7 +12,8 @@ setenv = VIRTUAL_ENV={envdir} PYTHONWARNINGS=default::DeprecationWarning -deps = -r{toxinidir}/test-requirements.txt +deps = -r {toxinidir}/requirements.txt + -r {toxinidir}/test-requirements.txt commands = find . -type f -name "*.pyc" -delete @@ -21,12 +23,16 @@ whitelist_externals = bash find +[testenv:bandit-baseline] +deps = .[bandit] + -r {toxinidir}/test-requirements.txt + +commands = bandit-baseline -r orm -n 5 -c bandit.yaml + [testenv:pep8] -deps = - -r{toxinidir}/test-requirements.txt +basepython=python3 commands = flake8 {posargs} - bandit-baseline -r orm -n 5 -c bandit.yaml [testenv:venv] commands = {posargs} @@ -60,6 +66,6 @@ commands = oslo-config-generator --config-file=tools/config/ranger-config-genera [flake8] show-source = True -ignore = H301,F821,H202,H101,H104,H238,H401,H405,E501,F811,F403,H233,F841 +ignore = H301,F821,H202,H101,H104,H238,H401,H405,E501,F811,F403,H233,F841,H903 builtins = _ exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build