Esempio n. 1
0
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)
Esempio n. 2
0
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))