From c9f0a8e63c3e214965802e0a008a27299f259020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Tr=C4=99bski?= Date: Fri, 7 Apr 2017 07:46:21 +0200 Subject: [PATCH] Enable Py35 tests to run Python3.5 tests were not running because Python3 has not Queue module (instead have queue module). Commit does not fix failing tests but gives an insight in what exactly is failing and allows to fix them in future. Also applied sixer utility to fix common Py2-Py3 compatybility issues. Additionally: * removed unconstrained mysql and psycopg drivers from tox.ini. Instead added them to test-requirements to be picked up by requirements bot. That also allowed to remove 3 tox environments. * added removing .testrepository/times.dbm (may cause py3 environment to fail if present) Change-Id: I9bcc33dad80fdfbf60d95c4bb0ce7f79f642a414 --- .../common/repositories/mysql/mysql_repo.py | 5 ++- monasca_notification/notification.py | 2 +- .../plugins/hipchat_notifier.py | 10 +++--- monasca_notification/plugins/jira_notifier.py | 10 +++--- .../plugins/slack_notifier.py | 10 +++--- test-requirements.txt | 2 ++ tests/test_email_notification.py | 4 ++- tests/test_hipchat_notification.py | 10 ++++-- tests/test_pagerduty_notification.py | 10 ++++-- tests/test_webhook_notification.py | 10 ++++-- tox.ini | 35 +++++-------------- 11 files changed, 60 insertions(+), 48 deletions(-) diff --git a/monasca_notification/common/repositories/mysql/mysql_repo.py b/monasca_notification/common/repositories/mysql/mysql_repo.py index fbc6974..379e857 100644 --- a/monasca_notification/common/repositories/mysql/mysql_repo.py +++ b/monasca_notification/common/repositories/mysql/mysql_repo.py @@ -17,6 +17,9 @@ import pymysql from monasca_notification.common.repositories.base import base_repo from monasca_notification.common.repositories import exceptions as exc +import six + + log = logging.getLogger(__name__) @@ -49,7 +52,7 @@ class MysqlRepo(base_repo.BaseRepo): self._mysql = pymysql.connect(host=self._mysql_host, port=self._mysql_port, user=self._mysql_user, - passwd=unicode(self._mysql_passwd).encode('utf-8'), + passwd=six.text_type(self._mysql_passwd).encode('utf-8'), db=self._mysql_dbname, ssl=self._mysql_ssl, use_unicode=True, diff --git a/monasca_notification/notification.py b/monasca_notification/notification.py index 1a8b705..d8a9ae4 100644 --- a/monasca_notification/notification.py +++ b/monasca_notification/notification.py @@ -52,7 +52,7 @@ class Notification(object): retry_count - number of times we've tried to send alarm - info that caused the notification notifications that come after this one to remain uncommitted. - Note that data may include unicode strings. + Note that data may include six.text_type strings. """ self.id = id self.address = address diff --git a/monasca_notification/plugins/hipchat_notifier.py b/monasca_notification/plugins/hipchat_notifier.py index c1ca082..30273ca 100644 --- a/monasca_notification/plugins/hipchat_notifier.py +++ b/monasca_notification/plugins/hipchat_notifier.py @@ -15,10 +15,12 @@ import json import requests -import urlparse from monasca_notification.plugins import abstract_notifier +from six.moves import urllib + + """ notification.address = https://hipchat.hpcloud.net/v2/room//notification?auth_token=432432 @@ -88,11 +90,11 @@ class HipChatNotifier(abstract_notifier.AbstractNotifier): """ hipchat_message = self._build_hipchat_message(notification) - parsed_url = urlparse.urlsplit(notification.address) + parsed_url = urllib.parse.urlsplit(notification.address) - query_params = urlparse.parse_qs(parsed_url.query) + query_params = urllib.parse.parse_qs(parsed_url.query) # URL without query params - url = urlparse.urljoin(notification.address, urlparse.urlparse(notification.address).path) + url = urllib.parse.urljoin(notification.address, urllib.parse.urlparse(notification.address).path) # Default option is to do cert verification verify = self._config.get('insecure', False) diff --git a/monasca_notification/plugins/jira_notifier.py b/monasca_notification/plugins/jira_notifier.py index 02a6bcd..f5843cc 100644 --- a/monasca_notification/plugins/jira_notifier.py +++ b/monasca_notification/plugins/jira_notifier.py @@ -16,11 +16,13 @@ from jinja2 import Template import jira import json -import urlparse import yaml from monasca_notification.plugins.abstract_notifier import AbstractNotifier +from six.moves import urllib + + """ Note: This plugin doesn't support multi tenancy. Multi tenancy requires support for @@ -149,10 +151,10 @@ class JiraNotifier(AbstractNotifier): jira_fields = self._build_jira_message(notification) - parsed_url = urlparse.urlsplit(notification.address) - query_params = urlparse.parse_qs(parsed_url.query) + parsed_url = urllib.parse.urlsplit(notification.address) + query_params = urllib.parse.parse_qs(parsed_url.query) # URL without query params - url = urlparse.urljoin(notification.address, urlparse.urlparse(notification.address).path) + url = urllib.parse.urljoin(notification.address, urllib.parse.urlparse(notification.address).path) jira_fields["project"] = query_params["project"][0] if query_params.get("component"): diff --git a/monasca_notification/plugins/slack_notifier.py b/monasca_notification/plugins/slack_notifier.py index 96af33a..ca5493b 100644 --- a/monasca_notification/plugins/slack_notifier.py +++ b/monasca_notification/plugins/slack_notifier.py @@ -15,10 +15,12 @@ import json import requests -import urlparse from monasca_notification.plugins import abstract_notifier +from six.moves import urllib + + """ notification.address = https://slack.com/api/chat.postMessage?token=token&channel=#channel" @@ -77,10 +79,10 @@ class SlackNotifier(abstract_notifier.AbstractNotifier): # Slack room has "#" as first character address = address.replace("#", "%23") - parsed_url = urlparse.urlsplit(address) - query_params = urlparse.parse_qs(parsed_url.query) + parsed_url = urllib.parse.urlsplit(address) + query_params = urllib.parse.parse_qs(parsed_url.query) # URL without query params - url = urlparse.urljoin(address, urlparse.urlparse(address).path) + url = urllib.parse.urljoin(address, urllib.parse.urlparse(address).path) # Default option is to do cert verification verify = self._config.get('insecure', False) diff --git a/test-requirements.txt b/test-requirements.txt index 9f4701f..1906a6c 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -10,3 +10,5 @@ funcsigs>=0.4;python_version=='2.7' or python_version=='2.6' # Apache-2.0 os-testr>=0.8.0 # Apache-2.0 testrepository>=0.0.18 # Apache-2.0/BSD SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT +PyMySQL>=0.7.6 # MIT License +psycopg2>=2.5 # LGPL/ZPL diff --git a/tests/test_email_notification.py b/tests/test_email_notification.py index 7bacebd..66e5952 100644 --- a/tests/test_email_notification.py +++ b/tests/test_email_notification.py @@ -19,10 +19,12 @@ import socket import time import unittest +import six + from monasca_notification.notification import Notification from monasca_notification.plugins import email_notifier -UNICODE_CHAR = unichr(2344) +UNICODE_CHAR = six.unichr(2344) UNICODE_CHAR_ENCODED = UNICODE_CHAR.encode("utf-8") diff --git a/tests/test_hipchat_notification.py b/tests/test_hipchat_notification.py index 952fdaa..a9500e7 100644 --- a/tests/test_hipchat_notification.py +++ b/tests/test_hipchat_notification.py @@ -13,12 +13,18 @@ import json import mock -import Queue import unittest +import six + from monasca_notification import notification as m_notification from monasca_notification.plugins import hipchat_notifier +if six.PY2: + import Queue as queue +else: + import queue + def alarm(metrics): return {"tenantId": "0", @@ -43,7 +49,7 @@ class requestsResponse(object): class TestHipchat(unittest.TestCase): def setUp(self): - self.trap = Queue.Queue() + self.trap = queue.Queue() self.hipchat_config = {'timeout': 50} def tearDown(self): diff --git a/tests/test_pagerduty_notification.py b/tests/test_pagerduty_notification.py index 1222292..a9a3583 100644 --- a/tests/test_pagerduty_notification.py +++ b/tests/test_pagerduty_notification.py @@ -15,14 +15,20 @@ import json import mock -import Queue import requests import time import unittest +import six + from monasca_notification import notification as m_notification from monasca_notification.plugins import pagerduty_notifier +if six.PY2: + import Queue as queue +else: + import queue + def alarm(metrics): return {"tenantId": "0", @@ -45,7 +51,7 @@ class requestsResponse(object): class TestWebhook(unittest.TestCase): def setUp(self): - self.trap = Queue.Queue() + self.trap = queue.Queue() self.pagerduty_config = {'timeout': 50, 'key': 'foobar'} def tearDown(self): diff --git a/tests/test_webhook_notification.py b/tests/test_webhook_notification.py index d16ab1c..4fac225 100644 --- a/tests/test_webhook_notification.py +++ b/tests/test_webhook_notification.py @@ -15,13 +15,19 @@ import json import mock -import Queue import requests import unittest +import six + from monasca_notification import notification as m_notification from monasca_notification.plugins import webhook_notifier +if six.PY2: + import Queue as queue +else: + import queue + def alarm(metrics): return {"tenantId": "0", @@ -46,7 +52,7 @@ class requestsResponse(object): class TestWebhook(unittest.TestCase): def setUp(self): - self.trap = Queue.Queue() + self.trap = queue.Queue() self.webhook_config = {'timeout': 50} def tearDown(self): diff --git a/tox.ini b/tox.ini index a9976c0..b1650e6 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] envlist = {py27,py35,pypy}-{mysql,postgres},pep8,cover -minversion = 2.1 +minversion = 2.5 skipsdist = True [testenv] @@ -22,29 +22,12 @@ whitelist_externals = bash rm deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt - PyMySQL>=0.6.1 commands = find . -type f -name "*.pyc" -delete + rm -Rf .testrepository/times.dbm ostestr {posargs} -[testenv:py27-postgres] -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - psycopg2>=2.5 - -[testenv:py35-postgres] -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - psycopg2>=2.5 - -[testenv:pypy-postgres] -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt - psycopg2>=2.5 - [testenv:cover] -basepython = python2.7 -deps = {[testenv]deps} commands = {[testenv]commands} coverage erase @@ -56,18 +39,20 @@ commands = oslo_debug_helper -t ./monasca_notification/tests {posargs} [testenv:pep8] -deps = - {[testenv]deps} commands = {[testenv:flake8]commands} - {[bandit]commands} + {[testenv:bandit]commands} [testenv:venv] commands = {posargs} [testenv:flake8] commands = - flake8 monasca_notification + flake8 monasca_notification + +[testenv:bandit] +commands = + bandit -r monasca_notification -n5 -x monasca_notification/tests [flake8] max-line-length = 120 @@ -76,7 +61,3 @@ max-line-length = 120 # H405 multi line docstring summary not separated with an empty line ignore = F821,H201,H405 exclude=.venv,.git,.tox,dist,*egg,build - -[bandit] -commands = - bandit -r monasca_notification -n5 -x monasca_notification/tests