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