Bail out immediately if there are legacy containers

Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
Aanand Prasad 2015-05-21 12:41:36 +01:00
parent 889d3636f4
commit 0b4d9401ee
3 changed files with 40 additions and 14 deletions

View File

@ -33,7 +33,7 @@ def main():
except KeyboardInterrupt: except KeyboardInterrupt:
log.error("\nAborting.") log.error("\nAborting.")
sys.exit(1) sys.exit(1)
except (UserError, NoSuchService, ConfigurationError) as e: except (UserError, NoSuchService, ConfigurationError, legacy.LegacyContainersError) as e:
log.error(e.msg) log.error(e.msg)
sys.exit(1) sys.exit(1)
except NoSuchCommand as e: except NoSuchCommand as e:

View File

@ -10,6 +10,20 @@ log = logging.getLogger(__name__)
# TODO: remove this section when migrate_project_to_labels is removed # TODO: remove this section when migrate_project_to_labels is removed
NAME_RE = re.compile(r'^([^_]+)_([^_]+)_(run_)?(\d+)$') NAME_RE = re.compile(r'^([^_]+)_([^_]+)_(run_)?(\d+)$')
ERROR_MESSAGE_FORMAT = """
Compose found the following containers without labels:
{names_list}
As of Compose 1.3.0, containers are identified with labels instead of naming convention. If you want to continue using these containers, run:
$ docker-compose migrate-to-labels
Alternatively, remove them:
$ docker rm -f {rm_args}
"""
def check_for_legacy_containers( def check_for_legacy_containers(
client, client,
@ -21,20 +35,30 @@ def check_for_legacy_containers(
and warn the user that those containers may need to be migrated to and warn the user that those containers may need to be migrated to
using labels, so that compose can find them. using labels, so that compose can find them.
""" """
names = get_legacy_container_names( names = list(get_legacy_container_names(
client, client,
project, project,
services, services,
stopped=stopped, stopped=stopped,
one_off=one_off) one_off=one_off))
for name in names: if names:
log.warn( raise LegacyContainersError(names)
"Compose found a found a container named %s without any "
"labels. As of compose 1.3.0 containers are identified with "
"labels instead of naming convention. If you'd like compose " class LegacyContainersError(Exception):
"to use this container, please run " def __init__(self, names):
"`docker-compose migrate-to-labels`" % (name,)) self.names = names
self.msg = ERROR_MESSAGE_FORMAT.format(
names_list="\n".join(" {}".format(name) for name in names),
rm_args=" ".join(names),
)
def __unicode__(self):
return self.msg
__str__ = __unicode__
def add_labels(project, container, name): def add_labels(project, container, name):

View File

@ -1,5 +1,3 @@
import mock
from compose import legacy from compose import legacy
from compose.project import Project from compose.project import Project
from .testcases import DockerClientTestCase from .testcases import DockerClientTestCase
@ -49,9 +47,13 @@ class ProjectTest(DockerClientTestCase):
self.assertEqual(len(self.get_names(one_off=True)), 1) self.assertEqual(len(self.get_names(one_off=True)), 1)
def test_migration_to_labels(self): def test_migration_to_labels(self):
with mock.patch.object(legacy, 'log', autospec=True) as mock_log: with self.assertRaises(legacy.LegacyContainersError) as cm:
self.assertEqual(self.project.containers(stopped=True), []) self.assertEqual(self.project.containers(stopped=True), [])
self.assertEqual(mock_log.warn.call_count, len(self.services))
self.assertEqual(
set(cm.exception.names),
set(['composetest_web_1', 'composetest_db_1']),
)
legacy.migrate_project_to_labels(self.project) legacy.migrate_project_to_labels(self.project)
self.assertEqual(len(self.project.containers(stopped=True)), len(self.services)) self.assertEqual(len(self.project.containers(stopped=True)), len(self.services))