class TestHyperLatentWorker(unittest.SynchronousTestCase): def setUp(self): self.patch(threadpool, 'ThreadPool', NonThreadPool) self.reactor = TestReactor() _setReactor(self.reactor) self.patch(workerhyper, 'Hyper', hyper.Client) self.build = Properties( image="busybox:latest", builder="docker_worker") self.worker = None def tearDown(self): if self.worker is not None: self.worker.stopService() self.reactor.pump([.1]) self.assertIsNone(hyper.Client.instance) _setReactor(None) def test_constructor_normal(self): worker = HyperLatentWorker('bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', 'debian:wheezy') # class instanciation configures nothing self.assertEqual(worker.client, None) self.assertEqual(worker.client_args, None) def test_constructor_nohyper(self): self.patch(workerhyper, 'Hyper', None) self.assertRaises(config.ConfigErrors, HyperLatentWorker, 'bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', 'debian:wheezy') def test_constructor_badsize(self): self.assertRaises(config.ConfigErrors, HyperLatentWorker, 'bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', 'debian:wheezy', hyper_size="big") def makeWorker(self, **kwargs): kwargs.setdefault('image', 'debian:wheezy') worker = HyperLatentWorker('bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', **kwargs) self.worker = worker master = fakemaster.make_master(testcase=self, wantData=True) worker.setServiceParent(master) worker.reactor = self.reactor self.successResultOf(worker.startService()) return worker def test_start_service(self): worker = self.worker = self.makeWorker() self.assertEqual(worker.client_args, {'clouds': {'tcp://hyper.sh/': { 'secretkey': 'bar', 'accesskey': 'foo'}}}) # client is lazily created on worker substantiation self.assertEqual(worker.client, None) def test_start_worker(self): worker = self.makeWorker() d = worker.substantiate(None, FakeBuild()) # we simulate a connection worker.attached(FakeBot()) self.successResultOf(d) self.assertIsNotNone(worker.client) self.assertEqual(worker.instance, { 'Id': '8a61192da2b3bb2d922875585e29b74ec0dc4e0117fcbf84c962204e97564cd7', 'Warnings': None, 'image': 'rendered:debian:wheezy'}) # teardown makes sure all containers are cleaned up def test_start_worker_but_no_connection_and_shutdown(self): worker = self.makeWorker() worker.substantiate(None, FakeBuild()) self.assertIsNotNone(worker.client) self.assertEqual(worker.instance, { 'Id': '8a61192da2b3bb2d922875585e29b74ec0dc4e0117fcbf84c962204e97564cd7', 'Warnings': None, 'image': 'rendered:debian:wheezy'}) # teardown makes sure all containers are cleaned up def test_start_worker_but_error(self): worker = self.makeWorker(image="buggy") d = worker.substantiate(None, FakeBuild()) self.reactor.pump([.1]) self.failureResultOf(d) self.assertIsNotNone(worker.client) self.assertEqual(worker.instance, None)
class TestHyperLatentWorker(unittest.SynchronousTestCase): def setUp(self): self.patch(threadpool, 'ThreadPool', NonThreadPool) self.reactor = TestReactor() _setReactor(self.reactor) self.patch(workerhyper, 'Hyper', hyper.Client) self.build = Properties(image="busybox:latest", builder="docker_worker") self.worker = None def tearDown(self): if self.worker is not None: self.worker.master.stopService() self.reactor.pump([.1]) self.assertIsNone(hyper.Client.instance) _setReactor(None) def test_constructor_normal(self): worker = HyperLatentWorker('bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', 'debian:wheezy') # class instantiation configures nothing self.assertEqual(worker.client, None) def test_constructor_nohyper(self): self.patch(workerhyper, 'Hyper', None) with self.assertRaises(config.ConfigErrors): HyperLatentWorker('bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', 'debian:wheezy') def test_constructor_badsize(self): with self.assertRaises(config.ConfigErrors): HyperLatentWorker('bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', 'debian:wheezy', hyper_size="big") def makeWorker(self, **kwargs): kwargs.setdefault('image', 'debian:wheezy') worker = HyperLatentWorker('bot', 'pass', 'tcp://hyper.sh/', 'foo', 'bar', **kwargs) self.worker = worker master = fakemaster.make_master(testcase=self, wantData=True) worker.setServiceParent(master) worker.reactor = self.reactor self.successResultOf(master.startService()) return worker def test_start_service(self): worker = self.worker = self.makeWorker() # client is lazily created on worker substantiation self.assertNotEqual(worker.client, None) def test_start_worker(self): worker = self.makeWorker() d = worker.substantiate(None, fakebuild.FakeBuildForRendering()) # we simulate a connection worker.attached(FakeBot()) self.successResultOf(d) self.assertIsNotNone(worker.client) self.assertEqual( worker.instance, { 'Id': '8a61192da2b3bb2d922875585e29b74ec0dc4e0117fcbf84c962204e97564cd7', 'Warnings': None, 'image': 'rendered:debian:wheezy' }) # teardown makes sure all containers are cleaned up def test_start_worker_but_no_connection_and_shutdown(self): worker = self.makeWorker() worker.substantiate(None, fakebuild.FakeBuildForRendering()) self.assertIsNotNone(worker.client) self.assertEqual( worker.instance, { 'Id': '8a61192da2b3bb2d922875585e29b74ec0dc4e0117fcbf84c962204e97564cd7', 'Warnings': None, 'image': 'rendered:debian:wheezy' }) # teardown makes sure all containers are cleaned up def test_start_worker_but_error(self): worker = self.makeWorker(image="buggy") d = worker.substantiate(None, fakebuild.FakeBuildForRendering()) self.reactor.advance(.1) self.failureResultOf(d) self.assertIsNotNone(worker.client) self.assertEqual(worker.instance, None) # teardown makes sure all containers are cleaned up def test_start_worker_but_already_created_with_same_name(self): worker = self.makeWorker(image="cool") worker.client.create_container(image="foo", name=worker.getContainerName()) d = worker.substantiate(None, fakebuild.FakeBuildForRendering()) self.reactor.advance(.1) worker.attached(FakeBot()) self.successResultOf(d) self.assertIsNotNone(worker.client) def test_non_substantiated_worker_compatible_with_any_build(self): worker = self.makeWorker(image=Interpolate('%(prop:image)s'), hyper_size=Interpolate('%(prop:size)s')) build = Properties(image='image1', size='size1') self.assertTrue(worker.isCompatibleWithBuild(build)) build = Properties(image='image2', size='size2') self.assertTrue(worker.isCompatibleWithBuild(build)) @defer.inlineCallbacks def test_substantiated_worker_not_compatible_until_shutdown(self): worker = self.makeWorker(image=Interpolate('%(prop:image)s'), hyper_size=Interpolate('%(prop:size)s')) build1 = Properties(image='image1', size='size1') build2 = Properties(image='image2', size='size2') yield worker.substantiate(None, build1) yield worker.insubstantiate() self.assertTrue(worker.isCompatibleWithBuild(build1)) self.assertTrue(worker.isCompatibleWithBuild(build2)) yield worker.substantiate(None, build2) self.assertFalse(worker.isCompatibleWithBuild(build1)) self.assertTrue(worker.isCompatibleWithBuild(build2))