From 3c561e7017b4ff4071dca8f2e7103ea730f1ffe5 Mon Sep 17 00:00:00 2001 From: Nick Sieger Date: Wed, 17 Aug 2022 11:48:45 -0500 Subject: [PATCH 1/2] create: pull all services logic out of loop; add DependsOn deps Signed-off-by: Nick Sieger --- pkg/compose/create.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pkg/compose/create.go b/pkg/compose/create.go index 3ee694b0e..74a2184ac 100644 --- a/pkg/compose/create.go +++ b/pkg/compose/create.go @@ -146,6 +146,9 @@ func prepareNetworks(project *types.Project) { } func prepareServicesDependsOn(p *types.Project) error { + allServices := types.Project{} + allServices.Services = p.AllServices() + for i, service := range p.Services { var dependencies []string networkDependency := getDependentServiceFromMode(service.NetworkMode) @@ -178,20 +181,24 @@ func prepareServicesDependsOn(p *types.Project) error { dependencies = append(dependencies, strings.Split(link, ":")[0]) } + for d := range service.DependsOn { + dependencies = append(dependencies, d) + } + if len(dependencies) == 0 { continue } + + // Verify dependencies exist in the project, whether disabled or not + deps, err := allServices.GetServices(dependencies...) + if err != nil { + return err + } + if service.DependsOn == nil { service.DependsOn = make(types.DependsOnConfig) } - // Verify dependencies exist in the project, whether disabled or not - projAllServices := types.Project{} - projAllServices.Services = p.AllServices() - deps, err := projAllServices.GetServices(dependencies...) - if err != nil { - return err - } for _, d := range deps { if _, ok := service.DependsOn[d.Name]; !ok { service.DependsOn[d.Name] = types.ServiceDependency{ From 09e6b0292ac0f6b80b1f8ce17cd496f595677285 Mon Sep 17 00:00:00 2001 From: Nick Sieger Date: Wed, 17 Aug 2022 12:32:10 -0500 Subject: [PATCH 2/2] up/start/run: don't wait for disabled service Signed-off-by: Nick Sieger --- pkg/compose/convergence.go | 6 +++ .../dependencies/recreate-no-deps.yaml | 15 +++++++ pkg/e2e/recreate_no_deps_test.go | 39 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 pkg/e2e/fixtures/dependencies/recreate-no-deps.yaml create mode 100644 pkg/e2e/recreate_no_deps_test.go diff --git a/pkg/compose/convergence.go b/pkg/compose/convergence.go index a2e434817..78ef972a8 100644 --- a/pkg/compose/convergence.go +++ b/pkg/compose/convergence.go @@ -352,6 +352,12 @@ func shouldWaitForDependency(serviceName string, dependencyConfig types.ServiceD return false, nil } if service, err := project.GetService(serviceName); err != nil { + for _, ds := range project.DisabledServices { + if ds.Name == serviceName { + // don't wait for disabled service (--no-deps) + return false, nil + } + } return false, err } else if service.Scale == 0 { // don't wait for the dependency which configured to have 0 containers running diff --git a/pkg/e2e/fixtures/dependencies/recreate-no-deps.yaml b/pkg/e2e/fixtures/dependencies/recreate-no-deps.yaml new file mode 100644 index 000000000..b69e6e0de --- /dev/null +++ b/pkg/e2e/fixtures/dependencies/recreate-no-deps.yaml @@ -0,0 +1,15 @@ +version: '3.8' +services: + my-service: + image: alpine + command: tail -f /dev/null + depends_on: + nginx: {condition: service_healthy} + + nginx: + image: nginx:alpine + healthcheck: + test: "echo | nc -w 5 localhost:80" + interval: 2s + timeout: 1s + retries: 10 diff --git a/pkg/e2e/recreate_no_deps_test.go b/pkg/e2e/recreate_no_deps_test.go new file mode 100644 index 000000000..2b32e0d5b --- /dev/null +++ b/pkg/e2e/recreate_no_deps_test.go @@ -0,0 +1,39 @@ +/* + Copyright 2022 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package e2e + +import ( + "testing" + + "gotest.tools/v3/icmd" +) + +func TestRecreateWithNoDeps(t *testing.T) { + c := NewParallelCLI(t, WithEnv( + "COMPOSE_PROJECT_NAME=recreate-no-deps", + )) + + res := c.RunDockerComposeCmdNoCheck(t, "-f", "fixtures/dependencies/recreate-no-deps.yaml", "up", "-d") + res.Assert(t, icmd.Success) + + res = c.RunDockerComposeCmdNoCheck(t, "-f", "fixtures/dependencies/recreate-no-deps.yaml", "up", "-d", "--force-recreate", "--no-deps", "my-service") + res.Assert(t, icmd.Success) + + RequireServiceState(t, c, "my-service", "running") + + c.RunDockerComposeCmd(t, "down") +}