def test_project_up_with_no_recreate_stopped(self): web = self.create_service("web") db = self.create_service("db", volumes=["/var/db"]) project = Project("composetest", [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(["db"]) project.kill() old_containers = project.containers(stopped=True) self.assertEqual(len(old_containers), 1) old_db_id = old_containers[0].id db_volume_path = old_containers[0].inspect()["Volumes"]["/var/db"] project.up(strategy=ConvergenceStrategy.never) new_containers = project.containers(stopped=True) self.assertEqual(len(new_containers), 2) self.assertEqual([c.is_running for c in new_containers], [True, True]) db_container = [c for c in new_containers if "db" in c.name][0] self.assertEqual(db_container.id, old_db_id) self.assertEqual(db_container.inspect()["Volumes"]["/var/db"], db_volume_path)
def scoped_containers_fixture(docker_project: Project, request): now = datetime.utcnow() if request.config.getoption("--use-running-containers"): containers = docker_project.containers( ) # type: List[Container] else: if any(docker_project.containers()): raise ContainersAlreadyExist( 'pytest-docker-compose tried to start containers but there are' ' already running containers: %s, you probably scoped your' ' tests wrong' % docker_project.containers()) containers = docker_project.up() if not containers: raise ValueError( "`docker-compose` didn't launch any containers!") container_getter = ContainerGetter(docker_project) yield container_getter if request.config.getoption("--verbose"): for container in sorted(containers, key=lambda c: c.name): header = "Logs from {name}:".format(name=container.name) print(header, '\n', "=" * len(header)) print( container.logs(since=now).decode("utf-8", errors="replace") or "(no logs)", '\n') if not request.config.getoption("--use-running-containers"): docker_project.down( ImageType.none, request.config.getoption( "--docker-compose-remove-volumes"))
def test_project_up_with_no_recreate_stopped(self): web = self.create_service('web') db = self.create_service('db', volumes=[VolumeSpec.parse('/var/db')]) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) project.kill() old_containers = project.containers(stopped=True) self.assertEqual(len(old_containers), 1) old_container, = old_containers old_db_id = old_container.id db_volume_path = old_container.get_mount('/var/db')['Source'] project.up(strategy=ConvergenceStrategy.never) new_containers = project.containers(stopped=True) self.assertEqual(len(new_containers), 2) self.assertEqual([c.is_running for c in new_containers], [True, True]) db_container = [c for c in new_containers if 'db' in c.name][0] self.assertEqual(db_container.id, old_db_id) self.assertEqual( db_container.get_mount('/var/db')['Source'], db_volume_path)
def test_project_up_with_no_recreate_stopped(self): web = self.create_service('web') db = self.create_service('db', volumes=['/var/db']) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) project.kill() old_containers = project.containers(stopped=True) self.assertEqual(len(old_containers), 1) old_db_id = old_containers[0].id db_volume_path = old_containers[0].inspect()['Volumes']['/var/db'] project.up(allow_recreate=False) new_containers = project.containers(stopped=True) self.assertEqual(len(new_containers), 2) self.assertEqual([c.is_running for c in new_containers], [True, True]) db_container = [c for c in new_containers if 'db' in c.name][0] self.assertEqual(db_container.id, old_db_id) self.assertEqual(db_container.inspect()['Volumes']['/var/db'], db_volume_path) project.kill() project.remove_stopped()
def test_project_up_starts_uncreated_services(self): db = self.create_service("db") web = self.create_service("web", links=[(db, "db")]) project = Project("composetest", [db, web], self.client) project.up(["db"]) self.assertEqual(len(project.containers()), 1) project.up() self.assertEqual(len(project.containers()), 2) self.assertEqual(len(db.containers()), 1) self.assertEqual(len(web.containers()), 1)
def test_project_up(self): web = self.create_service("web") db = self.create_service("db", volumes=["/var/db"]) project = Project("composetest", [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(["db"]) self.assertEqual(len(project.containers()), 1) self.assertEqual(len(db.containers()), 1) self.assertEqual(len(web.containers()), 0)
def test_project_up(self): web = self.create_service('web') db = self.create_service('db', volumes=[VolumeSpec.parse('/var/db')]) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) self.assertEqual(len(project.containers()), 1) self.assertEqual(len(db.containers()), 1) self.assertEqual(len(web.containers()), 0)
def test_project_up_starts_uncreated_services(self): db = self.create_service('db') web = self.create_service('web', links=[(db, 'db')]) project = Project('composetest', [db, web], self.client) project.up(['db']) self.assertEqual(len(project.containers()), 1) project.up() self.assertEqual(len(project.containers()), 2) self.assertEqual(len(db.containers()), 1) self.assertEqual(len(web.containers()), 1)
def test_project_up_without_all_services(self): console = self.create_service('console') db = self.create_service('db') project = Project('composetest', [console, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up() self.assertEqual(len(project.containers()), 2) self.assertEqual(len(db.containers()), 1) self.assertEqual(len(console.containers()), 1)
def test_create_with_links(self): db = self.create_service('db') web = self.create_service('web', links=[(db, 'db')]) project = Project('composetest', [db, web], self.client) project.create(['web']) self.assertEqual(len(project.containers()), 0) self.assertEqual(len(project.containers(stopped=True)), 2) self.assertEqual(len(db.containers()), 0) self.assertEqual(len(db.containers(stopped=True)), 1) self.assertEqual(len(web.containers()), 0) self.assertEqual(len(web.containers(stopped=True)), 1)
def test_create_strategy_never(self): db = self.create_service('db') project = Project('composetest', [db], self.client) project.create(['db']) old_id = project.containers(stopped=True)[0].id project.create(['db'], strategy=ConvergenceStrategy.never) self.assertEqual(len(project.containers()), 0) self.assertEqual(len(project.containers(stopped=True)), 1) db_container = project.containers(stopped=True)[0] self.assertEqual(db_container.id, old_id)
class ProjectTest(DockerClientTestCase): def setUp(self): super(ProjectTest, self).setUp() 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) # Create a single one-off legacy container self.client.create_container( name='{}_{}_run_1'.format(self.project.name, self.services[0].name), **self.services[0].options ) def get_legacy_containers(self, **kwargs): return list(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(stopped=True, one_off=True)), 1) def test_migration_to_labels(self): with self.assertRaises(legacy.LegacyContainersError) as cm: self.assertEqual(self.project.containers(stopped=True), []) self.assertEqual( set(cm.exception.names), set(['composetest_db_1', 'composetest_web_1', 'composetest_nginx_1']), ) legacy.migrate_project_to_labels(self.project) self.assertEqual(len(self.project.containers(stopped=True)), len(self.services))
def test_create_twice(self): web = self.create_service('web') db = self.create_service('db', volumes=[VolumeSpec.parse('/var/db')]) project = Project('composetest', [web, db], self.client) project.create(['db', 'web']) project.create(['db', 'web']) self.assertEqual(len(project.containers()), 0) self.assertEqual(len(project.containers(stopped=True)), 2) self.assertEqual(len(db.containers()), 0) self.assertEqual(len(db.containers(stopped=True)), 1) self.assertEqual(len(web.containers()), 0) self.assertEqual(len(web.containers(stopped=True)), 1)
class ProjectTest(DockerClientTestCase): def setUp(self): super(ProjectTest, self).setUp() 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) # Create a single one-off legacy container self.client.create_container(name='{}_{}_run_1'.format( self.project.name, self.services[0].name), **self.services[0].options) def get_legacy_containers(self, **kwargs): return list( 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(stopped=True, one_off=True)), 1) def test_migration_to_labels(self): with self.assertRaises(legacy.LegacyContainersError) as cm: self.assertEqual(self.project.containers(stopped=True), []) self.assertEqual( set(cm.exception.names), set([ 'composetest_db_1', 'composetest_web_1', 'composetest_nginx_1' ]), ) legacy.migrate_project_to_labels(self.project) self.assertEqual(len(self.project.containers(stopped=True)), len(self.services))
def test_project_up_starts_links(self): console = self.create_service("console") db = self.create_service("db", volumes=["/var/db"]) web = self.create_service("web", links=[(db, "db")]) project = Project("composetest", [web, db, console], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(["web"]) self.assertEqual(len(project.containers()), 2) self.assertEqual(len(web.containers()), 1) self.assertEqual(len(db.containers()), 1) self.assertEqual(len(console.containers()), 0)
def test_migration_to_labels(self): web = self.create_service('web') db = self.create_service('db') project = Project('composetest', [web, db], self.client) self.client.create_container(name='composetest_web_1', **web.options) self.client.create_container(name='composetest_db_1', **db.options) with mock.patch.object(service, 'log', autospec=True) as mock_log: self.assertEqual(project.containers(stopped=True), []) self.assertEqual(mock_log.warn.call_count, 2) migration.migrate_project_to_labels(project) self.assertEqual(len(project.containers(stopped=True)), 2)
class ProjectTest(DockerClientTestCase): def setUp(self): super(ProjectTest, self).setUp() self.services = [ self.create_service('web'), self.create_service('db'), ] self.project = Project('composetest', self.services, self.client) # Create a legacy container for each service for service in self.services: service.ensure_image_exists() self.client.create_container( name='{}_{}_1'.format(self.project.name, service.name), **service.options ) # Create a single one-off legacy container self.client.create_container( name='{}_{}_run_1'.format(self.project.name, self.services[0].name), **self.services[0].options ) def get_names(self, **kwargs): if 'stopped' not in kwargs: kwargs['stopped'] = True return list(legacy.get_legacy_container_names( 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_names()), len(self.services)) def test_get_legacy_container_names_one_off(self): self.assertEqual(len(self.get_names(one_off=True)), 1) def test_migration_to_labels(self): with mock.patch.object(legacy, 'log', autospec=True) as mock_log: self.assertEqual(self.project.containers(stopped=True), []) self.assertEqual(mock_log.warn.call_count, len(self.services)) legacy.migrate_project_to_labels(self.project) self.assertEqual(len(self.project.containers(stopped=True)), len(self.services))
def test_project_up_starts_links(self): console = self.create_service('console') db = self.create_service('db', volumes=[VolumeSpec.parse('/var/db')]) web = self.create_service('web', links=[(db, 'db')]) project = Project('composetest', [web, db, console], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['web']) self.assertEqual(len(project.containers()), 2) self.assertEqual(len(web.containers()), 1) self.assertEqual(len(db.containers()), 1) self.assertEqual(len(console.containers()), 0)
def test_project_up_with_no_deps(self): console = self.create_service('console') db = self.create_service('db', volumes=['/var/db']) web = self.create_service('web', links=[(db, 'db')]) project = Project('composetest', [web, db, console], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['web'], start_links=False) self.assertEqual(len(project.containers()), 1) self.assertEqual(len(web.containers()), 1) self.assertEqual(len(db.containers()), 0) self.assertEqual(len(console.containers()), 0) project.kill() project.remove_stopped()
def test_start_stop_kill_remove(self): web = self.create_service('web') db = self.create_service('db') project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(web.containers()), 0) self.assertEqual(len(db.containers()), 0) web_container_1 = web.create_container() web_container_2 = web.create_container() db_container = db.create_container() project.start(service_names=['web']) self.assertEqual(set(c.name for c in project.containers()), set([web_container_1.name, web_container_2.name])) project.start() self.assertEqual(set(c.name for c in project.containers()), set([web_container_1.name, web_container_2.name, db_container.name])) project.stop(service_names=['web'], timeout=1) self.assertEqual(set(c.name for c in project.containers()), set([db_container.name])) project.kill(service_names=['db']) self.assertEqual(len(project.containers()), 0) self.assertEqual(len(project.containers(stopped=True)), 3) project.remove_stopped(service_names=['web']) self.assertEqual(len(project.containers(stopped=True)), 1) project.remove_stopped() self.assertEqual(len(project.containers(stopped=True)), 0)
def test_containers_with_service_names(self): web = self.create_service("web") db = self.create_service("db") project = Project("composetest", [web, db], self.client) project.up() containers = project.containers(["web"]) self.assertEqual([c.name for c in containers], ["composetest_web_1"])
def test_containers(self): web = self.create_service('web') db = self.create_service('db') project = Project('composetest', [web, db], self.client) project.up() containers = project.containers() self.assertEqual(len(containers), 2)
def test_containers_with_service_names(self): web = self.create_service('web') db = self.create_service('db') project = Project('composetest', [web, db], self.client) project.up() containers = project.containers(['web']) self.assertEqual([c.name for c in containers], ['composetest_web_1'])
def test_containers(self): web = self.create_service("web") db = self.create_service("db") project = Project("composetest", [web, db], self.client) project.up() containers = project.containers() self.assertEqual(len(containers), 2)
def test_containers_with_extra_service(self): web = self.create_service("web") web_1 = web.create_container() db = self.create_service("db") db_1 = db.create_container() self.create_service("extra").create_container() project = Project("composetest", [web, db], self.client) self.assertEqual(set(project.containers(stopped=True)), set([web_1, db_1]))
def test_containers_with_service_names(self): web = self.create_service('web') db = self.create_service('db') project = Project('composetest', [web, db], self.client) project.up() containers = project.containers(['web']) self.assertEqual( [c.name for c in containers], ['composetest_web_1'])
def test_containers_with_extra_service(self): web = self.create_service('web') web_1 = web.create_container() db = self.create_service('db') db_1 = db.create_container() self.create_service('extra').create_container() project = Project('composetest', [web, db], self.client) self.assertEqual( set(project.containers(stopped=True)), set([web_1, db_1]), )
def test_recreate_preserves_volumes(self): web = self.create_service('web') db = self.create_service('db', volumes=[VolumeSpec.parse('/etc')]) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) self.assertEqual(len(project.containers()), 1) old_db_id = project.containers()[0].id db_volume_path = project.containers()[0].get('Volumes./etc') project.up(strategy=ConvergenceStrategy.always) self.assertEqual(len(project.containers()), 2) db_container = [c for c in project.containers() if 'db' in c.name][0] self.assertNotEqual(db_container.id, old_db_id) self.assertEqual(db_container.get('Volumes./etc'), db_volume_path)
def test_project_up_with_no_recreate_running(self): web = self.create_service("web") db = self.create_service("db", volumes=["/var/db"]) project = Project("composetest", [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(["db"]) self.assertEqual(len(project.containers()), 1) old_db_id = project.containers()[0].id db_volume_path = project.containers()[0].inspect()["Volumes"]["/var/db"] project.up(strategy=ConvergenceStrategy.never) self.assertEqual(len(project.containers()), 2) db_container = [c for c in project.containers() if "db" in c.name][0] self.assertEqual(db_container.id, old_db_id) self.assertEqual(db_container.inspect()["Volumes"]["/var/db"], db_volume_path)
def test_project_up_recreates_containers(self): web = self.create_service('web') db = self.create_service('db', volumes=['/etc']) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) self.assertEqual(len(project.containers()), 1) old_db_id = project.containers()[0].id db_volume_path = project.containers()[0].get('Volumes./etc') project.up() self.assertEqual(len(project.containers()), 2) db_container = [c for c in project.containers() if 'db' in c.name][0] self.assertNotEqual(db_container.id, old_db_id) self.assertEqual(db_container.get('Volumes./etc'), db_volume_path)
def test_recreate_preserves_volumes(self): web = self.create_service("web") db = self.create_service("db", volumes=["/etc"]) project = Project("composetest", [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(["db"]) self.assertEqual(len(project.containers()), 1) old_db_id = project.containers()[0].id db_volume_path = project.containers()[0].get("Volumes./etc") project.up(strategy=ConvergenceStrategy.always) self.assertEqual(len(project.containers()), 2) db_container = [c for c in project.containers() if "db" in c.name][0] self.assertNotEqual(db_container.id, old_db_id) self.assertEqual(db_container.get("Volumes./etc"), db_volume_path)
def test_project_up_with_no_recreate_running(self): web = self.create_service('web') db = self.create_service('db', volumes=['/var/db']) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) self.assertEqual(len(project.containers()), 1) old_db_id = project.containers()[0].id db_volume_path = project.containers()[0].inspect()['Volumes']['/var/db'] project.up(strategy=ConvergenceStrategy.never) self.assertEqual(len(project.containers()), 2) db_container = [c for c in project.containers() if 'db' in c.name][0] self.assertEqual(db_container.id, old_db_id) self.assertEqual(db_container.inspect()['Volumes']['/var/db'], db_volume_path)
def test_project_up_with_no_recreate_running(self): web = self.create_service('web') db = self.create_service('db', volumes=['/var/db']) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) self.assertEqual(len(project.containers()), 1) old_db_id = project.containers()[0].id db_volume_path = project.containers()[0].inspect()['Volumes']['/var/db'] project.up(allow_recreate=False) self.assertEqual(len(project.containers()), 2) db_container = [c for c in project.containers() if 'db' in c.name][0] self.assertEqual(db_container.id, old_db_id) self.assertEqual(db_container.inspect()['Volumes']['/var/db'], db_volume_path)
def test_project_up_with_no_recreate_running(self): web = self.create_service('web') db = self.create_service('db', volumes=[VolumeSpec.parse('/var/db')]) project = Project('composetest', [web, db], self.client) project.start() self.assertEqual(len(project.containers()), 0) project.up(['db']) self.assertEqual(len(project.containers()), 1) old_db_id = project.containers()[0].id container, = project.containers() db_volume_path = container.get_mount('/var/db')['Source'] project.up(strategy=ConvergenceStrategy.never) self.assertEqual(len(project.containers()), 2) db_container = [c for c in project.containers() if 'db' in c.name][0] self.assertEqual(db_container.id, old_db_id) self.assertEqual( db_container.get_mount('/var/db')['Source'], db_volume_path)
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)
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)