You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by wf...@apache.org on 2015/11/10 03:17:52 UTC
aurora git commit: Deleting unused function deprecation_warning
Adding test coverage to base, job_monitor, quota_check, scheduler_client
Repository: aurora
Updated Branches:
refs/heads/master 06d8666f0 -> 02df5eeea
Deleting unused function deprecation_warning
Adding test coverage to base, job_monitor, quota_check, scheduler_client
Bugs closed: AURORA-1536
Reviewed at https://reviews.apache.org/r/39958/
Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/02df5eee
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/02df5eee
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/02df5eee
Branch: refs/heads/master
Commit: 02df5eeea51aa8b8ac8ed22635c29cd66c81f90b
Parents: 06d8666
Author: Dmitriy Shirchenko <ca...@gmail.com>
Authored: Mon Nov 9 18:17:36 2015 -0800
Committer: Bill Farner <wf...@apache.org>
Committed: Mon Nov 9 18:17:36 2015 -0800
----------------------------------------------------------------------
src/main/python/apache/aurora/client/base.py | 10 -
src/test/python/apache/aurora/client/BUILD | 1 +
.../aurora/client/api/test_job_monitor.py | 7 +
.../aurora/client/api/test_quota_check.py | 13 +
.../aurora/client/api/test_scheduler_client.py | 282 ++++++++++---------
.../python/apache/aurora/client/test_base.py | 70 ++++-
6 files changed, 238 insertions(+), 145 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aurora/blob/02df5eee/src/main/python/apache/aurora/client/base.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/client/base.py b/src/main/python/apache/aurora/client/base.py
index 487f8e7..91c276b 100644
--- a/src/main/python/apache/aurora/client/base.py
+++ b/src/main/python/apache/aurora/client/base.py
@@ -68,16 +68,6 @@ def check_and_log_locked_response(resp):
log.info(LOCKED_WARNING)
-def deprecation_warning(text):
- log.warning('')
- log.warning('*' * 80)
- log.warning('* The command you ran is deprecated and will soon break!')
- for line in text.split('\n'):
- log.warning('* %s' % line)
- log.warning('*' * 80)
- log.warning('')
-
-
class requires(object): # noqa
@classmethod
def wrap_function(cls, fn, fnargs, comparator):
http://git-wip-us.apache.org/repos/asf/aurora/blob/02df5eee/src/test/python/apache/aurora/client/BUILD
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/client/BUILD b/src/test/python/apache/aurora/client/BUILD
index dc7912e..84c5c84 100644
--- a/src/test/python/apache/aurora/client/BUILD
+++ b/src/test/python/apache/aurora/client/BUILD
@@ -37,6 +37,7 @@ python_tests(
python_tests(name = 'base',
sources = ['test_base.py'],
dependencies = [
+ '3rdparty/python:mock',
'src/main/python/apache/aurora/client',
],
)
http://git-wip-us.apache.org/repos/asf/aurora/blob/02df5eee/src/test/python/apache/aurora/client/api/test_job_monitor.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/client/api/test_job_monitor.py b/src/test/python/apache/aurora/client/api/test_job_monitor.py
index ccc8b55..537abd3 100644
--- a/src/test/python/apache/aurora/client/api/test_job_monitor.py
+++ b/src/test/python/apache/aurora/client/api/test_job_monitor.py
@@ -13,6 +13,7 @@
#
import unittest
+import mock
from mock import create_autospec
from apache.aurora.client.api.job_monitor import JobMonitor
@@ -126,3 +127,9 @@ class JobMonitorTest(unittest.TestCase):
self._event.set()
monitor = JobMonitor(self._scheduler, self._job_key, terminating_event=self._event)
assert monitor.wait_until(monitor.terminal)
+
+ def test_terminate(self):
+ mock_event = mock.Mock()
+ monitor = JobMonitor(self._scheduler, self._job_key, terminating_event=mock_event)
+ monitor.terminate()
+ mock_event.set.assert_called_once_with()
http://git-wip-us.apache.org/repos/asf/aurora/blob/02df5eee/src/test/python/apache/aurora/client/api/test_quota_check.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/client/api/test_quota_check.py b/src/test/python/apache/aurora/client/api/test_quota_check.py
index 7035bb5..0b97334 100644
--- a/src/test/python/apache/aurora/client/api/test_quota_check.py
+++ b/src/test/python/apache/aurora/client/api/test_quota_check.py
@@ -127,3 +127,16 @@ class QuotaCheckTest(unittest.TestCase):
call((acquired - released).quota(), 'Requested', self._name),
call(additional, 'Additional quota required', self._role)
]
+
+ def test_op_not_cap_request(self):
+ released = CapacityRequest(ResourceAggregate(numCpus=5.0, ramMb=100, diskMb=100))
+ # Should return self so a noop.
+ out = released._op('not_a_real_op', 'not_a_CapacityRequest_obj')
+ self.assertEqual(out, released)
+
+ def test_right_add(self):
+ released = CapacityRequest(ResourceAggregate(numCpus=5.0, ramMb=100, diskMb=100))
+ # Testing __radd__ which is called when object on the ride side isn't our CapacityRequest
+ # instance.
+ out = 1 + released
+ self.assertEqual(out, released)
http://git-wip-us.apache.org/repos/asf/aurora/blob/02df5eee/src/test/python/apache/aurora/client/api/test_scheduler_client.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/client/api/test_scheduler_client.py b/src/test/python/apache/aurora/client/api/test_scheduler_client.py
index 44671fa..d244b3a 100644
--- a/src/test/python/apache/aurora/client/api/test_scheduler_client.py
+++ b/src/test/python/apache/aurora/client/api/test_scheduler_client.py
@@ -389,137 +389,151 @@ def test_url_when_not_connected_and_cluster_has_no_proxy_url(scheme):
client._connect_scheduler.assert_has_calls([])
-@mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport', spec=TRequestsTransport)
-def test_connect_scheduler(mock_client):
- mock_client.return_value.open.side_effect = [TTransport.TTransportException, True]
- mock_time = mock.create_autospec(spec=time, instance=True)
-
- client = scheduler_client.SchedulerClient(mock_auth(), 'Some-User-Agent', verbose=True)
- client._connect_scheduler('https://scheduler.example.com:1337', mock_time)
-
- assert mock_client.return_value.open.has_calls(mock.call(), mock.call())
- mock_time.sleep.assert_called_once_with(
- scheduler_client.SchedulerClient.RETRY_TIMEOUT.as_(Time.SECONDS))
-
-
-@mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport', spec=TRequestsTransport)
-def test_connect_scheduler_with_user_agent(mock_transport):
- mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
- mock_time = mock.create_autospec(spec=time, instance=True)
-
- auth = mock_auth()
- user_agent = 'Some-User-Agent'
-
- client = scheduler_client.SchedulerClient(auth, user_agent, verbose=True)
-
- uri = 'https://scheduler.example.com:1337'
- client._connect_scheduler(uri, mock_time)
-
- mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
-
-
-@mock.patch('apache.aurora.client.api.scheduler_client.SchedulerClient',
- spec=scheduler_client.SchedulerClient)
-@mock.patch('threading._Event.wait')
-def test_transient_error(_, client):
- mock_scheduler_client = mock.create_autospec(
- spec=scheduler_client.SchedulerClient,
- spec_set=False,
- instance=True)
- mock_thrift_client = mock.create_autospec(spec=AuroraAdmin.Client, instance=True)
- mock_thrift_client.killTasks.side_effect = [
- Response(responseCode=ResponseCode.ERROR_TRANSIENT,
- details=[ResponseDetail(message="message1"), ResponseDetail(message="message2")]),
- Response(responseCode=ResponseCode.ERROR_TRANSIENT),
- Response(responseCode=ResponseCode.OK)]
-
- mock_scheduler_client.get_thrift_client.return_value = mock_thrift_client
- client.get.return_value = mock_scheduler_client
-
- proxy = TestSchedulerProxy(Cluster(name='local'))
- proxy.killTasks(TaskQuery(), None)
-
- assert mock_thrift_client.killTasks.call_count == 3
-
-
-@mock.patch('apache.aurora.client.api.scheduler_client.SchedulerClient',
- spec=scheduler_client.SchedulerClient)
-def test_unknown_connection_error(client):
- mock_scheduler_client = mock.create_autospec(spec=scheduler_client.SchedulerClient, instance=True)
- client.get.return_value = mock_scheduler_client
- proxy = TestSchedulerProxy(Cluster(name='local'))
-
- # unknown, transient connection error
- mock_scheduler_client.get_thrift_client.side_effect = RuntimeError
- with pytest.raises(Exception):
- proxy.client()
-
- # successful connection on re-attempt
- mock_scheduler_client.get_thrift_client.side_effect = None
- assert proxy.client() is not None
-
-
-@mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport', spec=TRequestsTransport)
-def test_connect_direct_scheduler_with_user_agent(mock_transport):
- mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
- mock_time = mock.create_autospec(spec=time, instance=True)
-
- auth = mock_auth()
- user_agent = 'Some-User-Agent'
- uri = 'https://scheduler.example.com:1337'
-
- client = scheduler_client.DirectSchedulerClient(
- uri,
- auth=auth,
- verbose=True,
- user_agent=user_agent)
-
- client._connect_scheduler(uri, mock_time)
-
- mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
-
-
-@mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport', spec=TRequestsTransport)
-def test_connect_zookeeper_client_with_auth(mock_transport):
- mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
- mock_time = mock.create_autospec(spec=time, instance=True)
-
- user_agent = 'Some-User-Agent'
- uri = 'https://scheduler.example.com:1337'
- auth = mock_auth()
- cluster = Cluster(zk='zk', zk_port='2181')
-
- def auth_factory(_):
- return auth
-
- client = scheduler_client.SchedulerClient.get(
- cluster,
- auth_factory=auth_factory,
- user_agent=user_agent)
-
- client._connect_scheduler(uri, mock_time)
-
- mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
-
-
-@mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport', spec=TRequestsTransport)
-def test_connect_direct_client_with_auth(mock_transport):
- mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
- mock_time = mock.create_autospec(spec=time, instance=True)
-
- user_agent = 'Some-User-Agent'
- uri = 'https://scheduler.example.com:1337'
- auth = mock_auth()
- cluster = Cluster(scheduler_uri='uri')
-
- def auth_factory(_):
- return auth
-
- client = scheduler_client.SchedulerClient.get(
- cluster,
- auth_factory=auth_factory,
- user_agent=user_agent)
-
- client._connect_scheduler(uri, mock_time)
-
- mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
+class TestSchedulerClient(unittest.TestCase):
+
+ @mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport',
+ spec=TRequestsTransport)
+ def test_connect_scheduler(self, mock_client):
+ mock_client.return_value.open.side_effect = [TTransport.TTransportException, True]
+ mock_time = mock.create_autospec(spec=time, instance=True)
+
+ client = scheduler_client.SchedulerClient(mock_auth(), 'Some-User-Agent', verbose=True)
+ client._connect_scheduler('https://scheduler.example.com:1337', mock_time)
+
+ assert mock_client.return_value.open.has_calls(mock.call(), mock.call())
+ mock_time.sleep.assert_called_once_with(
+ scheduler_client.SchedulerClient.RETRY_TIMEOUT.as_(Time.SECONDS))
+
+ @mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport',
+ spec=TRequestsTransport)
+ def test_connect_scheduler_with_user_agent(self, mock_transport):
+ mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
+ mock_time = mock.create_autospec(spec=time, instance=True)
+
+ auth = mock_auth()
+ user_agent = 'Some-User-Agent'
+
+ client = scheduler_client.SchedulerClient(auth, user_agent, verbose=True)
+
+ uri = 'https://scheduler.example.com:1337'
+ client._connect_scheduler(uri, mock_time)
+
+ mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
+
+ @mock.patch('apache.aurora.client.api.scheduler_client.SchedulerClient',
+ spec=scheduler_client.SchedulerClient)
+ @mock.patch('threading._Event.wait')
+ def test_transient_error(self, _, client):
+ mock_scheduler_client = mock.create_autospec(
+ spec=scheduler_client.SchedulerClient,
+ spec_set=False,
+ instance=True)
+ mock_thrift_client = mock.create_autospec(spec=AuroraAdmin.Client, instance=True)
+ mock_thrift_client.killTasks.side_effect = [
+ Response(responseCode=ResponseCode.ERROR_TRANSIENT,
+ details=[ResponseDetail(message="message1"), ResponseDetail(message="message2")]),
+ Response(responseCode=ResponseCode.ERROR_TRANSIENT),
+ Response(responseCode=ResponseCode.OK)]
+
+ mock_scheduler_client.get_thrift_client.return_value = mock_thrift_client
+ client.get.return_value = mock_scheduler_client
+
+ proxy = TestSchedulerProxy(Cluster(name='local'))
+ proxy.killTasks(TaskQuery(), None)
+
+ assert mock_thrift_client.killTasks.call_count == 3
+
+ @mock.patch('apache.aurora.client.api.scheduler_client.SchedulerClient',
+ spec=scheduler_client.SchedulerClient)
+ def test_unknown_connection_error(self, client):
+ mock_scheduler_client = mock.create_autospec(spec=scheduler_client.SchedulerClient,
+ instance=True)
+ client.get.return_value = mock_scheduler_client
+ proxy = TestSchedulerProxy(Cluster(name='local'))
+
+ # unknown, transient connection error
+ mock_scheduler_client.get_thrift_client.side_effect = RuntimeError
+ with pytest.raises(Exception):
+ proxy.client()
+
+ # successful connection on re-attempt
+ mock_scheduler_client.get_thrift_client.side_effect = None
+ assert proxy.client() is not None
+
+ @mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport',
+ spec=TRequestsTransport)
+ def test_connect_direct_scheduler_with_user_agent(self, mock_transport):
+ mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
+ mock_time = mock.create_autospec(spec=time, instance=True)
+
+ auth = mock_auth()
+ user_agent = 'Some-User-Agent'
+ uri = 'https://scheduler.example.com:1337'
+
+ client = scheduler_client.DirectSchedulerClient(
+ uri,
+ auth=auth,
+ verbose=True,
+ user_agent=user_agent)
+
+ client._connect_scheduler(uri, mock_time)
+
+ mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
+
+ @mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport',
+ spec=TRequestsTransport)
+ def test_connect_zookeeper_client_with_auth(self, mock_transport):
+ mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
+ mock_time = mock.create_autospec(spec=time, instance=True)
+
+ user_agent = 'Some-User-Agent'
+ uri = 'https://scheduler.example.com:1337'
+ auth = mock_auth()
+ cluster = Cluster(zk='zk', zk_port='2181')
+
+ def auth_factory(_):
+ return auth
+
+ client = scheduler_client.SchedulerClient.get(
+ cluster,
+ auth_factory=auth_factory,
+ user_agent=user_agent)
+
+ client._connect_scheduler(uri, mock_time)
+
+ mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
+
+ @mock.patch('apache.aurora.client.api.scheduler_client.TRequestsTransport',
+ spec=TRequestsTransport)
+ def test_connect_direct_client_with_auth(self, mock_transport):
+ mock_transport.return_value.open.side_effect = [TTransport.TTransportException, True]
+ mock_time = mock.create_autospec(spec=time, instance=True)
+
+ user_agent = 'Some-User-Agent'
+ uri = 'https://scheduler.example.com:1337'
+ auth = mock_auth()
+ cluster = Cluster(scheduler_uri='uri')
+
+ def auth_factory(_):
+ return auth
+
+ client = scheduler_client.SchedulerClient.get(
+ cluster,
+ auth_factory=auth_factory,
+ user_agent=user_agent)
+
+ client._connect_scheduler(uri, mock_time)
+
+ mock_transport.assert_called_once_with(uri, auth=auth.auth(), user_agent=user_agent)
+
+ def test_no_zk_or_scheduler_uri(self):
+ cluster = None
+ with self.assertRaises(TypeError):
+ scheduler_client.SchedulerClient.get(cluster)
+ cluster = Cluster()
+ with self.assertRaises(ValueError):
+ scheduler_client.SchedulerClient.get(cluster)
+
+ def test__internal_connect(self):
+ client = scheduler_client.SchedulerClient(mock_auth(), 'Some-User-Agent', verbose=True)
+ self.assertIsNone(client._connect())
http://git-wip-us.apache.org/repos/asf/aurora/blob/02df5eee/src/test/python/apache/aurora/client/test_base.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/client/test_base.py b/src/test/python/apache/aurora/client/test_base.py
index fa5eb07..8c88008 100644
--- a/src/test/python/apache/aurora/client/test_base.py
+++ b/src/test/python/apache/aurora/client/test_base.py
@@ -13,7 +13,10 @@
#
import unittest
+import mock
+
from apache.aurora.client import base
+from apache.aurora.common.pex_version import UnknownVersion
from gen.apache.aurora.api.ttypes import (
PopulateJobResult,
@@ -57,7 +60,9 @@ class TestBase(unittest.TestCase):
taskConfig=config)))
assert config == resp.result.populateJobResult.taskConfig
- def test_synthesize_url(self):
+ @mock.patch('apache.aurora.client.base.die')
+ @mock.patch('apache.aurora.client.base.log')
+ def test_synthesize_url(self, mock_log, mock_die):
base_url = 'http://example.com'
role = 'some-role'
environment = 'some-environment'
@@ -78,3 +83,66 @@ class TestBase(unittest.TestCase):
assert (('%s/scheduler/%s' % (base_url, role)) ==
base.synthesize_url(base_url, role))
+
+ mock_log.reset_mock()
+ scheduler_url = ''
+ out = base.synthesize_url(scheduler_url)
+ self.assertIsNone(out)
+ mock_log.warning.assert_called_once_with('Unable to find scheduler web UI!')
+
+ mock_log.reset_mock()
+ mock_die.reset_mock()
+ scheduler_url = 'foo'
+ env = 'foo'
+ out = base.synthesize_url(scheduler_url, env=env)
+ expected = 'scheduler'
+ self.assertEqual(out, expected)
+ mock_die.assert_called_once_with('If env specified, must specify role')
+
+ mock_log.reset_mock()
+ mock_die.reset_mock()
+ scheduler_url = 'foo'
+ job = 'bar'
+ out = base.synthesize_url(scheduler_url, job=job)
+ expected = 'scheduler'
+ self.assertEqual(out, expected)
+ mock_die.assert_called_once_with('If job specified, must specify role and env')
+
+ @mock.patch('apache.aurora.client.base.pex_version')
+ def test_user_agent(self, mock_pex_version):
+ mock_pex_version.return_value = ('sha', '2015-11-3')
+ out = base.user_agent()
+ expected = 'Aurora;sha-2015-11-3'
+ self.assertEqual(out, expected)
+
+ mock_pex_version.reset_mock()
+ mock_pex_version.side_effect = UnknownVersion
+ out = base.user_agent()
+ expected = 'Aurora;Unknown Version'
+ self.assertEqual(out, expected)
+
+ @mock.patch('apache.aurora.client.base.log.info')
+ @mock.patch('apache.aurora.client.base.sys.exit')
+ def test_check_and_log_response(self, mock_sys_exit, mock_log):
+ resp = Response(responseCode=ResponseCode.LOCK_ERROR)
+ out = base.check_and_log_response(resp)
+ self.assertIsNone(out)
+ mock_sys_exit.assert_called_once_with(1)
+ mock_log.assert_any_call(base.LOCKED_WARNING)
+ mock_log.assert_any_call('Response from scheduler: LOCK_ERROR (message: )')
+
+ @mock.patch('apache.aurora.client.base.log.info')
+ def test_check_and_log_locked_response(self, mock_log):
+ resp = Response(responseCode=ResponseCode.LOCK_ERROR)
+ out = base.check_and_log_locked_response(resp)
+ self.assertIsNone(out)
+ mock_log.assert_called_once_with(base.LOCKED_WARNING)
+
+ @mock.patch('apache.aurora.client.base.sys.exit')
+ @mock.patch('apache.aurora.client.base.log.fatal')
+ def test_die(self, mock_log, mock_sys_exit):
+ msg = 'fatal message'
+ out = base.die(msg)
+ self.assertIsNone(out)
+ mock_sys_exit.assert_called_once_with(1)
+ mock_log.assert_called_once_with(msg)