Merge pull request #3400 from shin-/3333-raise-up-errors

Properly handle APIError failures in Project.up
This commit is contained in:
Joffrey F 2016-05-02 14:34:12 -07:00
commit 3e11a95056
5 changed files with 18 additions and 5 deletions

View File

@ -24,6 +24,7 @@ from ..const import IS_WINDOWS_PLATFORM
from ..progress_stream import StreamOutputError from ..progress_stream import StreamOutputError
from ..project import NoSuchService from ..project import NoSuchService
from ..project import OneOffFilter from ..project import OneOffFilter
from ..project import ProjectError
from ..service import BuildAction from ..service import BuildAction
from ..service import BuildError from ..service import BuildError
from ..service import ConvergenceStrategy from ..service import ConvergenceStrategy
@ -58,7 +59,7 @@ def main():
except (KeyboardInterrupt, signals.ShutdownException): except (KeyboardInterrupt, signals.ShutdownException):
log.error("Aborting.") log.error("Aborting.")
sys.exit(1) sys.exit(1)
except (UserError, NoSuchService, ConfigurationError) as e: except (UserError, NoSuchService, ConfigurationError, ProjectError) as e:
log.error(e.msg) log.error(e.msg)
sys.exit(1) sys.exit(1)
except BuildError as e: except BuildError as e:

View File

@ -59,7 +59,7 @@ def parallel_execute(objects, func, get_name, msg, get_deps=None):
if error_to_reraise: if error_to_reraise:
raise error_to_reraise raise error_to_reraise
return results return results, errors
def _no_deps(x): def _no_deps(x):

View File

@ -390,13 +390,18 @@ class Project(object):
def get_deps(service): def get_deps(service):
return {self.get_service(dep) for dep in service.get_dependency_names()} return {self.get_service(dep) for dep in service.get_dependency_names()}
results = parallel.parallel_execute( results, errors = parallel.parallel_execute(
services, services,
do, do,
operator.attrgetter('name'), operator.attrgetter('name'),
None, None,
get_deps get_deps
) )
if errors:
raise ProjectError(
'Encountered errors while bringing up the project.'
)
return [ return [
container container
for svc_containers in results for svc_containers in results
@ -531,3 +536,7 @@ class NoSuchService(Exception):
def __str__(self): def __str__(self):
return self.msg return self.msg
class ProjectError(Exception):
pass

View File

@ -19,6 +19,7 @@ from compose.const import LABEL_PROJECT
from compose.const import LABEL_SERVICE from compose.const import LABEL_SERVICE
from compose.container import Container from compose.container import Container
from compose.project import Project from compose.project import Project
from compose.project import ProjectError
from compose.service import ConvergenceStrategy from compose.service import ConvergenceStrategy
from tests.integration.testcases import v2_only from tests.integration.testcases import v2_only
@ -752,7 +753,8 @@ class ProjectTest(DockerClientTestCase):
config_data=config_data, config_data=config_data,
) )
assert len(project.up()) == 0 with self.assertRaises(ProjectError):
project.up()
@v2_only() @v2_only()
def test_project_up_volumes(self): def test_project_up_volumes(self):

View File

@ -29,7 +29,7 @@ def get_deps(obj):
def test_parallel_execute(): def test_parallel_execute():
results = parallel_execute( results, errors = parallel_execute(
objects=[1, 2, 3, 4, 5], objects=[1, 2, 3, 4, 5],
func=lambda x: x * 2, func=lambda x: x * 2,
get_name=six.text_type, get_name=six.text_type,
@ -37,6 +37,7 @@ def test_parallel_execute():
) )
assert sorted(results) == [2, 4, 6, 8, 10] assert sorted(results) == [2, 4, 6, 8, 10]
assert errors == {}
def test_parallel_execute_with_deps(): def test_parallel_execute_with_deps():