Fix Hacking rule H302 (import only modules)
Change-Id: Id6407aac9e5a4bdbd730576433032d43dc89f934
This commit is contained in:
parent
787c48aef0
commit
976ef6c702
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
import smtplib
|
import smtplib
|
||||||
from email.mime.text import MIMEText
|
from email.mime import text
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
@ -209,7 +209,7 @@ class SendEmailAction(base.Action):
|
|||||||
self.smtp_server, self.body[:128]))
|
self.smtp_server, self.body[:128]))
|
||||||
|
|
||||||
# TODO(dzimine): handle utf-8, http://stackoverflow.com/a/14506784
|
# TODO(dzimine): handle utf-8, http://stackoverflow.com/a/14506784
|
||||||
message = MIMEText(self.body)
|
message = text.MIMEText(self.body)
|
||||||
message['Subject'] = self.subject
|
message['Subject'] = self.subject
|
||||||
message['From'] = self.sender
|
message['From'] = self.sender
|
||||||
message['To'] = self.to
|
message['To'] = self.to
|
||||||
|
@ -14,9 +14,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from pecan import rest
|
import pecan
|
||||||
from pecan import expose
|
|
||||||
from pecan import request
|
|
||||||
|
|
||||||
from mistral.openstack.common import log as logging
|
from mistral.openstack.common import log as logging
|
||||||
from mistral.db import api as db_api
|
from mistral.db import api as db_api
|
||||||
@ -27,9 +25,9 @@ from mistral.utils import rest_utils
|
|||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class WorkbookDefinitionController(rest.RestController):
|
class WorkbookDefinitionController(pecan.rest.RestController):
|
||||||
@rest_utils.wrap_pecan_controller_exception
|
@rest_utils.wrap_pecan_controller_exception
|
||||||
@expose()
|
@pecan.expose()
|
||||||
def get(self, workbook_name):
|
def get(self, workbook_name):
|
||||||
"""Return the workbook definition."""
|
"""Return the workbook definition."""
|
||||||
LOG.debug("Fetch workbook definition [workbook_name=%s]" %
|
LOG.debug("Fetch workbook definition [workbook_name=%s]" %
|
||||||
@ -37,10 +35,10 @@ class WorkbookDefinitionController(rest.RestController):
|
|||||||
return db_api.workbook_definition_get(workbook_name)
|
return db_api.workbook_definition_get(workbook_name)
|
||||||
|
|
||||||
@rest_utils.wrap_pecan_controller_exception
|
@rest_utils.wrap_pecan_controller_exception
|
||||||
@expose(content_type="text/plain")
|
@pecan.expose(content_type="text/plain")
|
||||||
def put(self, workbook_name):
|
def put(self, workbook_name):
|
||||||
"""Update the workbook's definition."""
|
"""Update the workbook's definition."""
|
||||||
text = request.text
|
text = pecan.request.text
|
||||||
|
|
||||||
LOG.debug("Update workbook definition [workbook_name=%s, text=%s]" %
|
LOG.debug("Update workbook definition [workbook_name=%s, text=%s]" %
|
||||||
(workbook_name, text))
|
(workbook_name, text))
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from pecan.hooks import PecanHook
|
from pecan import hooks
|
||||||
|
|
||||||
from mistral import engine
|
from mistral import engine
|
||||||
from mistral.openstack.common import log as logging
|
from mistral.openstack.common import log as logging
|
||||||
@ -21,7 +21,7 @@ from mistral.openstack.common import log as logging
|
|||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class EngineHook(PecanHook):
|
class EngineHook(hooks.PecanHook):
|
||||||
|
|
||||||
def __init__(self, transport=None):
|
def __init__(self, transport=None):
|
||||||
self.transport = engine.get_transport(transport)
|
self.transport = engine.get_transport(transport)
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from pecan.hooks import PecanHook
|
from pecan import hooks
|
||||||
|
|
||||||
import eventlet
|
import eventlet
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ def context_from_headers(headers):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class ContextHook(PecanHook):
|
class ContextHook(hooks.PecanHook):
|
||||||
def before(self, state):
|
def before(self, state):
|
||||||
request_ctx = context_from_headers(state.request.headers).to_dict()
|
request_ctx = context_from_headers(state.request.headers).to_dict()
|
||||||
set_ctx(request_ctx)
|
set_ctx(request_ctx)
|
||||||
|
@ -15,14 +15,14 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from croniter import croniter
|
from croniter import croniter
|
||||||
from datetime import datetime
|
import datetime
|
||||||
from datetime import timedelta
|
|
||||||
from mistral.db import api as db_api
|
from mistral.db import api as db_api
|
||||||
from mistral import dsl_parser as parser
|
from mistral import dsl_parser as parser
|
||||||
|
|
||||||
|
|
||||||
def get_next_triggers():
|
def get_next_triggers():
|
||||||
return db_api.get_next_triggers(datetime.now() + timedelta(0, 2))
|
return db_api.get_next_triggers(datetime.datetime.now() +
|
||||||
|
datetime.timedelta(0, 2))
|
||||||
|
|
||||||
|
|
||||||
def set_next_execution_time(trigger):
|
def set_next_execution_time(trigger):
|
||||||
@ -30,17 +30,17 @@ def set_next_execution_time(trigger):
|
|||||||
cron = croniter(trigger['pattern'], base)
|
cron = croniter(trigger['pattern'], base)
|
||||||
|
|
||||||
return db_api.trigger_update(trigger['id'], {
|
return db_api.trigger_update(trigger['id'], {
|
||||||
'next_execution_time': cron.get_next(datetime)
|
'next_execution_time': cron.get_next(datetime.datetime)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
def _get_next_execution_time(pattern, start_time):
|
def _get_next_execution_time(pattern, start_time):
|
||||||
return croniter(pattern, start_time).get_next(datetime)
|
return croniter(pattern, start_time).get_next(datetime.datetime)
|
||||||
|
|
||||||
|
|
||||||
def create_trigger(name, pattern, workbook_name, start_time=None):
|
def create_trigger(name, pattern, workbook_name, start_time=None):
|
||||||
if not start_time:
|
if not start_time:
|
||||||
start_time = datetime.now()
|
start_time = datetime.datetime.now()
|
||||||
|
|
||||||
return db_api.trigger_create({
|
return db_api.trigger_create({
|
||||||
"name": name,
|
"name": name,
|
||||||
@ -62,7 +62,7 @@ def create_associated_triggers(db_workbook):
|
|||||||
|
|
||||||
for e in triggers:
|
for e in triggers:
|
||||||
pattern = e['parameters']['cron-pattern']
|
pattern = e['parameters']['cron-pattern']
|
||||||
next_time = _get_next_execution_time(pattern, datetime.now())
|
next_time = _get_next_execution_time(pattern, datetime.datetime.now())
|
||||||
db_triggers.append({
|
db_triggers.append({
|
||||||
"name": e['name'],
|
"name": e['name'],
|
||||||
"pattern": pattern,
|
"pattern": pattern,
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
import pecan
|
import pecan
|
||||||
import pecan.testing
|
import pecan.testing
|
||||||
from webtest.app import AppError
|
from webtest import app as webtest_app
|
||||||
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ class FunctionalTest(base.DbTestCase):
|
|||||||
def assertNotFound(self, url):
|
def assertNotFound(self, url):
|
||||||
try:
|
try:
|
||||||
self.app.get(url, headers={'Accept': 'application/json'})
|
self.app.get(url, headers={'Accept': 'application/json'})
|
||||||
except AppError as error:
|
except webtest_app.AppError as error:
|
||||||
self.assertIn('Bad response: 404 Not Found', str(error))
|
self.assertIn('Bad response: 404 Not Found', str(error))
|
||||||
return
|
return
|
||||||
self.fail('Expected 404 Not found but got OK')
|
self.fail('Expected 404 Not found but got OK')
|
||||||
@ -64,7 +64,7 @@ class FunctionalTest(base.DbTestCase):
|
|||||||
def assertUnauthorized(self, url):
|
def assertUnauthorized(self, url):
|
||||||
try:
|
try:
|
||||||
self.app.get(url, headers={'Accept': 'application/json'})
|
self.app.get(url, headers={'Accept': 'application/json'})
|
||||||
except AppError as error:
|
except webtest_app.AppError as error:
|
||||||
self.assertIn('Bad response: 401 Unauthorized', str(error))
|
self.assertIn('Bad response: 401 Unauthorized', str(error))
|
||||||
return
|
return
|
||||||
self.fail('Expected 401 Unauthorized but got OK')
|
self.fail('Expected 401 Unauthorized but got OK')
|
||||||
|
@ -18,7 +18,7 @@ import mock
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
from mistral import exceptions as ex
|
from mistral import exceptions as ex
|
||||||
from webtest.app import AppError
|
from webtest import app as webtest_app
|
||||||
from mistral.tests.api import base
|
from mistral.tests.api import base
|
||||||
from mistral.db import api as db_api
|
from mistral.db import api as db_api
|
||||||
from mistral import engine
|
from mistral import engine
|
||||||
@ -130,7 +130,7 @@ class TestExecutionsController(base.FunctionalTest):
|
|||||||
@mock.patch.object(engine.EngineClient, 'start_workflow_execution',
|
@mock.patch.object(engine.EngineClient, 'start_workflow_execution',
|
||||||
mock.MagicMock(side_effect=ex.MistralException))
|
mock.MagicMock(side_effect=ex.MistralException))
|
||||||
def test_post_throws_exception(self):
|
def test_post_throws_exception(self):
|
||||||
context = self.assertRaises(AppError, self.app.post_json,
|
context = self.assertRaises(webtest_app.AppError, self.app.post_json,
|
||||||
'/v1/workbooks/my_workbook/executions',
|
'/v1/workbooks/my_workbook/executions',
|
||||||
EXECS[0])
|
EXECS[0])
|
||||||
self.assertIn('Bad response: 400', context.message)
|
self.assertIn('Bad response: 400', context.message)
|
||||||
|
@ -14,12 +14,9 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from email import parser
|
||||||
|
import mock
|
||||||
import testtools
|
import testtools
|
||||||
from mock import call
|
|
||||||
from mock import patch
|
|
||||||
|
|
||||||
from email.parser import Parser
|
|
||||||
|
|
||||||
from mistral.actions import std_actions as std
|
from mistral.actions import std_actions as std
|
||||||
from mistral import exceptions as exc
|
from mistral import exceptions as exc
|
||||||
@ -81,7 +78,7 @@ class SendEmailActionTest(base.BaseTest):
|
|||||||
|
|
||||||
action.run()
|
action.run()
|
||||||
|
|
||||||
@patch('smtplib.SMTP')
|
@mock.patch('smtplib.SMTP')
|
||||||
def test_send_email(self, smtp):
|
def test_send_email(self, smtp):
|
||||||
action = std.SendEmailAction(self.params, self.settings)
|
action = std.SendEmailAction(self.params, self.settings)
|
||||||
|
|
||||||
@ -97,14 +94,14 @@ class SendEmailActionTest(base.BaseTest):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
sendmail.call_args[1]['to_addrs'], self.to_addrs)
|
sendmail.call_args[1]['to_addrs'], self.to_addrs)
|
||||||
|
|
||||||
message = Parser().parsestr(sendmail.call_args[1]['msg'])
|
message = parser.Parser().parsestr(sendmail.call_args[1]['msg'])
|
||||||
|
|
||||||
self.assertEqual(self.settings['from'], message['from'])
|
self.assertEqual(self.settings['from'], message['from'])
|
||||||
self.assertEqual(self.to_addrs, message['to'])
|
self.assertEqual(self.to_addrs, message['to'])
|
||||||
self.assertEqual(self.params['subject'], message['subject'])
|
self.assertEqual(self.params['subject'], message['subject'])
|
||||||
self.assertEqual(self.params['body'], message.get_payload())
|
self.assertEqual(self.params['body'], message.get_payload())
|
||||||
|
|
||||||
@patch('smtplib.SMTP')
|
@mock.patch('smtplib.SMTP')
|
||||||
def test_with_password(self, smtp):
|
def test_with_password(self, smtp):
|
||||||
self.settings['password'] = "secret"
|
self.settings['password'] = "secret"
|
||||||
|
|
||||||
@ -113,13 +110,14 @@ class SendEmailActionTest(base.BaseTest):
|
|||||||
action.run()
|
action.run()
|
||||||
|
|
||||||
smtpmock = smtp.return_value
|
smtpmock = smtp.return_value
|
||||||
calls = [call.ehlo(), call.starttls(), call.ehlo(),
|
calls = [mock.call.ehlo(), mock.call.starttls(), mock.call.ehlo(),
|
||||||
call.login(self.settings['from'], self.settings['password'])]
|
mock.call.login(self.settings['from'],
|
||||||
|
self.settings['password'])]
|
||||||
|
|
||||||
smtpmock.assert_has_calls(calls)
|
smtpmock.assert_has_calls(calls)
|
||||||
self.assertTrue(smtpmock.sendmail.called, "should call sendmail")
|
self.assertTrue(smtpmock.sendmail.called, "should call sendmail")
|
||||||
|
|
||||||
@patch('mistral.actions.std_actions.LOG')
|
@mock.patch('mistral.actions.std_actions.LOG')
|
||||||
def test_exception(self, log):
|
def test_exception(self, log):
|
||||||
self.params['smtp_server'] = "wrong host"
|
self.params['smtp_server'] = "wrong host"
|
||||||
|
|
||||||
|
@ -14,11 +14,9 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from datetime import datetime
|
import datetime
|
||||||
from datetime import timedelta
|
|
||||||
|
|
||||||
from mistral.openstack.common import timeutils
|
from mistral.openstack.common import timeutils
|
||||||
|
|
||||||
from mistral.services import scheduler as s
|
from mistral.services import scheduler as s
|
||||||
from mistral.tests import base
|
from mistral.tests import base
|
||||||
|
|
||||||
@ -38,23 +36,23 @@ class SchedulerTest(base.DbTestCase):
|
|||||||
self.wb_name = "My workbook"
|
self.wb_name = "My workbook"
|
||||||
|
|
||||||
def test_trigger_create_and_update(self):
|
def test_trigger_create_and_update(self):
|
||||||
base = datetime(2010, 8, 25)
|
base = datetime.datetime(2010, 8, 25)
|
||||||
next_trigger = datetime(2010, 8, 25, 0, 5)
|
next_trigger = datetime.datetime(2010, 8, 25, 0, 5)
|
||||||
trigger = s.create_trigger("test", "*/5 * * * *", self.wb_name, base)
|
trigger = s.create_trigger("test", "*/5 * * * *", self.wb_name, base)
|
||||||
self.assertEqual(trigger['next_execution_time'], next_trigger)
|
self.assertEqual(trigger['next_execution_time'], next_trigger)
|
||||||
|
|
||||||
trigger = s.set_next_execution_time(trigger)
|
trigger = s.set_next_execution_time(trigger)
|
||||||
next_trigger = datetime(2010, 8, 25, 0, 10)
|
next_trigger = datetime.datetime(2010, 8, 25, 0, 10)
|
||||||
self.assertEqual(trigger['next_execution_time'], next_trigger)
|
self.assertEqual(trigger['next_execution_time'], next_trigger)
|
||||||
|
|
||||||
def test_get_trigger_in_correct_orders(self):
|
def test_get_trigger_in_correct_orders(self):
|
||||||
base = datetime(2010, 8, 25)
|
base = datetime.datetime(2010, 8, 25)
|
||||||
s.create_trigger("test1", "*/5 * * * *", self.wb_name, base)
|
s.create_trigger("test1", "*/5 * * * *", self.wb_name, base)
|
||||||
base = datetime(2010, 8, 22)
|
base = datetime.datetime(2010, 8, 22)
|
||||||
s.create_trigger("test2", "*/5 * * * *", self.wb_name, base)
|
s.create_trigger("test2", "*/5 * * * *", self.wb_name, base)
|
||||||
base = datetime(2010, 9, 21)
|
base = datetime.datetime(2010, 9, 21)
|
||||||
s.create_trigger("test3", "*/5 * * * *", self.wb_name, base)
|
s.create_trigger("test3", "*/5 * * * *", self.wb_name, base)
|
||||||
base = datetime.now() + timedelta(0, 50)
|
base = datetime.datetime.now() + datetime.timedelta(0, 50)
|
||||||
s.create_trigger("test4", "*/5 * * * *", self.wb_name, base)
|
s.create_trigger("test4", "*/5 * * * *", self.wb_name, base)
|
||||||
triggersName = [e['name'] for e in s.get_next_triggers()]
|
triggersName = [e['name'] for e in s.get_next_triggers()]
|
||||||
|
|
||||||
|
2
tox.ini
2
tox.ini
@ -39,6 +39,6 @@ commands = bash tools/lintstack.sh
|
|||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
show-source = true
|
show-source = true
|
||||||
ignore = H302,H306,H803,H305,H405,H307,H904,H236
|
ignore = H306,H803,H305,H405,H307,H904,H236
|
||||||
builtins = _
|
builtins = _
|
||||||
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools
|
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools
|
||||||
|
Loading…
Reference in New Issue
Block a user