Ejemplo n.º 1
0
    def test_unscale_after_restart(self):
        web = self.create_service('web')
        project = Project('composetest', [web], self.client)

        project.start()

        service = project.get_service('web')
        service.scale(1)
        self.assertEqual(len(service.containers()), 1)
        service.scale(3)
        self.assertEqual(len(service.containers()), 3)
        project.up()
        service = project.get_service('web')
        self.assertEqual(len(service.containers()), 3)
        service.scale(1)
        self.assertEqual(len(service.containers()), 1)
        project.up()
        service = project.get_service('web')
        self.assertEqual(len(service.containers()), 1)
        # does scale=0 ,makes any sense? after recreating at least 1 container is running
        service.scale(0)
        project.up()
        service = project.get_service('web')
        self.assertEqual(len(service.containers()), 1)
        project.kill()
        project.remove_stopped()
Ejemplo n.º 2
0
 def test_get_service(self):
     web = Service(
         project='composetest',
         name='web',
         client=None,
         image="busybox:latest",
     )
     project = Project('test', [web], None)
     self.assertEqual(project.get_service('web'), web)
Ejemplo n.º 3
0
 def test_get_service(self):
     web = Service(
         project='composetest',
         name='web',
         client=None,
         image="busybox:latest",
     )
     project = Project('test', [web], None)
     self.assertEqual(project.get_service('web'), web)
Ejemplo n.º 4
0
 def test_get_service(self):
     web = Service(
         project='composetest',
         name='web',
         client=None,
         image=BUSYBOX_IMAGE_WITH_TAG,
     )
     project = Project('test', [web], None)
     assert project.get_service('web') == web
Ejemplo n.º 5
0
    def test_unscale_after_restart(self):
        web = self.create_service('web')
        project = Project('composetest', [web], self.client)

        project.start()

        service = project.get_service('web')
        service.scale(1)
        self.assertEqual(len(service.containers()), 1)
        service.scale(3)
        self.assertEqual(len(service.containers()), 3)
        project.up()
        service = project.get_service('web')
        self.assertEqual(len(service.containers()), 3)
        service.scale(1)
        self.assertEqual(len(service.containers()), 1)
        project.up()
        service = project.get_service('web')
        self.assertEqual(len(service.containers()), 1)
        # does scale=0 ,makes any sense? after recreating at least 1 container is running
        service.scale(0)
        project.up()
        service = project.get_service('web')
        self.assertEqual(len(service.containers()), 1)
Ejemplo n.º 6
0
class LegacyTestCase(DockerClientTestCase):

    def setUp(self):
        super(LegacyTestCase, self).setUp()
        self.containers = []

        db = self.create_service('db')
        web = self.create_service('web', links=[(db, 'db')])
        nginx = self.create_service('nginx', links=[(web, 'web')])

        self.services = [db, web, nginx]
        self.project = Project('composetest', self.services, self.client)

        # Create a legacy container for each service
        for service in self.services:
            service.ensure_image_exists()
            container = self.client.create_container(
                name='{}_{}_1'.format(self.project.name, service.name),
                **service.options
            )
            self.client.start(container)
            self.containers.append(container)

        # Create a single one-off legacy container
        self.containers.append(self.client.create_container(
            name='{}_{}_run_1'.format(self.project.name, db.name),
            **self.services[0].options
        ))

    def tearDown(self):
        super(LegacyTestCase, self).tearDown()
        for container in self.containers:
            try:
                self.client.kill(container)
            except APIError:
                pass
            try:
                self.client.remove_container(container)
            except APIError:
                pass

    def get_legacy_containers(self, **kwargs):
        return legacy.get_legacy_containers(
            self.client,
            self.project.name,
            [s.name for s in self.services],
            **kwargs
        )

    def test_get_legacy_container_names(self):
        self.assertEqual(len(self.get_legacy_containers()), len(self.services))

    def test_get_legacy_container_names_one_off(self):
        self.assertEqual(len(self.get_legacy_containers(one_off=True)), 1)

    def test_migration_to_labels(self):
        # Trying to get the container list raises an exception

        with self.assertRaises(legacy.LegacyContainersError) as cm:
            self.project.containers(stopped=True)

        self.assertEqual(
            set(cm.exception.names),
            set(['composetest_db_1', 'composetest_web_1', 'composetest_nginx_1']),
        )

        self.assertEqual(
            set(cm.exception.one_off_names),
            set(['composetest_db_run_1']),
        )

        # Migrate the containers

        legacy.migrate_project_to_labels(self.project)

        # Getting the list no longer raises an exception

        containers = self.project.containers(stopped=True)
        self.assertEqual(len(containers), len(self.services))

    def test_migration_one_off(self):
        # We've already migrated

        legacy.migrate_project_to_labels(self.project)

        # Trying to create a one-off container results in a Docker API error

        with self.assertRaises(APIError) as cm:
            self.project.get_service('db').create_container(one_off=True)

        # Checking for legacy one-off containers raises an exception

        with self.assertRaises(legacy.LegacyOneOffContainersError) as cm:
            legacy.check_for_legacy_containers(
                self.client,
                self.project.name,
                ['db'],
                allow_one_off=False,
            )

        self.assertEqual(
            set(cm.exception.one_off_names),
            set(['composetest_db_run_1']),
        )

        # Remove the old one-off container

        c = self.client.inspect_container('composetest_db_run_1')
        self.client.remove_container(c)

        # Checking no longer raises an exception

        legacy.check_for_legacy_containers(
            self.client,
            self.project.name,
            ['db'],
            allow_one_off=False,
        )

        # Creating a one-off container no longer results in an API error

        self.project.get_service('db').create_container(one_off=True)
        self.assertIsInstance(self.client.inspect_container('composetest_db_run_1'), dict)
Ejemplo n.º 7
0
 def test_get_service_not_found(self):
     project = Project('test', [], None)
     with self.assertRaises(NoSuchService):
         project.get_service('not_found')
Ejemplo n.º 8
0
class LegacyTestCase(DockerClientTestCase):
    def setUp(self):
        super(LegacyTestCase, self).setUp()
        self.containers = []

        db = self.create_service('db')
        web = self.create_service('web', links=[(db, 'db')])
        nginx = self.create_service('nginx', links=[(web, 'web')])

        self.services = [db, web, nginx]
        self.project = Project('composetest', self.services, self.client)

        # Create a legacy container for each service
        for service in self.services:
            service.ensure_image_exists()
            container = self.client.create_container(name='{}_{}_1'.format(
                self.project.name, service.name),
                                                     **service.options)
            self.client.start(container)
            self.containers.append(container)

        # Create a single one-off legacy container
        self.containers.append(
            self.client.create_container(name='{}_{}_run_1'.format(
                self.project.name, db.name),
                                         **self.services[0].options))

    def tearDown(self):
        super(LegacyTestCase, self).tearDown()
        for container in self.containers:
            try:
                self.client.kill(container)
            except APIError:
                pass
            try:
                self.client.remove_container(container)
            except APIError:
                pass

    def get_legacy_containers(self, **kwargs):
        return legacy.get_legacy_containers(self.client, self.project.name,
                                            [s.name for s in self.services],
                                            **kwargs)

    def test_get_legacy_container_names(self):
        self.assertEqual(len(self.get_legacy_containers()), len(self.services))

    def test_get_legacy_container_names_one_off(self):
        self.assertEqual(len(self.get_legacy_containers(one_off=True)), 1)

    def test_migration_to_labels(self):
        # Trying to get the container list raises an exception

        with self.assertRaises(legacy.LegacyContainersError) as cm:
            self.project.containers(stopped=True)

        self.assertEqual(
            set(cm.exception.names),
            set([
                'composetest_db_1', 'composetest_web_1', 'composetest_nginx_1'
            ]),
        )

        self.assertEqual(
            set(cm.exception.one_off_names),
            set(['composetest_db_run_1']),
        )

        # Migrate the containers

        legacy.migrate_project_to_labels(self.project)

        # Getting the list no longer raises an exception

        containers = self.project.containers(stopped=True)
        self.assertEqual(len(containers), len(self.services))

    def test_migration_one_off(self):
        # We've already migrated

        legacy.migrate_project_to_labels(self.project)

        # Trying to create a one-off container results in a Docker API error

        with self.assertRaises(APIError) as cm:
            self.project.get_service('db').create_container(one_off=True)

        # Checking for legacy one-off containers raises an exception

        with self.assertRaises(legacy.LegacyOneOffContainersError) as cm:
            legacy.check_for_legacy_containers(
                self.client,
                self.project.name,
                ['db'],
                allow_one_off=False,
            )

        self.assertEqual(
            set(cm.exception.one_off_names),
            set(['composetest_db_run_1']),
        )

        # Remove the old one-off container

        c = self.client.inspect_container('composetest_db_run_1')
        self.client.remove_container(c)

        # Checking no longer raises an exception

        legacy.check_for_legacy_containers(
            self.client,
            self.project.name,
            ['db'],
            allow_one_off=False,
        )

        # Creating a one-off container no longer results in an API error

        self.project.get_service('db').create_container(one_off=True)
        self.assertIsInstance(
            self.client.inspect_container('composetest_db_run_1'), dict)
Ejemplo n.º 9
0
 def test_get_service(self):
     web = Service(project="composetest", name="web", client=None, image="busybox:latest")
     project = Project("test", [web], None)
     self.assertEqual(project.get_service("web"), web)