Skip to content

Commit 472411c

Browse files
committed
fix: deduplicate deployed dependencies
1 parent e29380a commit 472411c

File tree

6 files changed

+122
-10
lines changed

6 files changed

+122
-10
lines changed

e2e/tests/dependencies/dependencies.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,41 @@ var _ = DevSpaceDescribe("dependencies", func() {
3939
kubeClient, err = kube.NewKubeHelper()
4040
})
4141

42+
ginkgo.It("should skip equal dependencies", func() {
43+
tempDir, err := framework.CopyToTempDir("tests/dependencies/testdata/overlapping")
44+
framework.ExpectNoError(err)
45+
defer framework.CleanupTempDir(initialDir, tempDir)
46+
47+
ns, err := kubeClient.CreateNamespace("dependencies")
48+
framework.ExpectNoError(err)
49+
defer func() {
50+
err := kubeClient.DeleteNamespace(ns)
51+
framework.ExpectNoError(err)
52+
}()
53+
54+
// create a new dev command
55+
deployCmd := &cmd.DeployCmd{
56+
GlobalFlags: &flags.GlobalFlags{
57+
NoWarn: true,
58+
Namespace: ns,
59+
},
60+
}
61+
62+
// run the command
63+
err = deployCmd.Run(f)
64+
framework.ExpectNoError(err)
65+
66+
// make sure the dependencies are correctly deployed
67+
_, err = kubeClient.RawClient().AppsV1().Deployments(ns).Get(context.TODO(), "dep1", metav1.GetOptions{})
68+
framework.ExpectNoError(err)
69+
_, err = kubeClient.RawClient().AppsV1().Deployments(ns).Get(context.TODO(), "dep2", metav1.GetOptions{})
70+
framework.ExpectNoError(err)
71+
_, err = kubeClient.RawClient().AppsV1().Deployments(ns).Get(context.TODO(), "dep3", metav1.GetOptions{})
72+
framework.ExpectNoError(err)
73+
_, err = kubeClient.RawClient().AppsV1().Deployments(ns).Get(context.TODO(), "dep4", metav1.GetOptions{})
74+
framework.ExpectNoError(err)
75+
})
76+
4277
ginkgo.It("should skip dependencies", func() {
4378
tempDir, err := framework.CopyToTempDir("tests/dependencies/testdata/skip")
4479
framework.ExpectNoError(err)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
version: v1beta11
2+
3+
dependencies:
4+
- name: dep2
5+
source:
6+
path: ../dep2
7+
- name: dep3
8+
source:
9+
path: ../dep3
10+
11+
deployments:
12+
- name: dep1
13+
helm:
14+
componentChart: true
15+
values:
16+
containers:
17+
- image: alpine
18+
command: ["sleep", "infinity"]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
version: v1beta11
2+
3+
dependencies:
4+
- name: dep3
5+
source:
6+
path: ../dep3
7+
vars:
8+
- name: NAME
9+
value: dep4
10+
11+
hooks:
12+
- events: ["before:deploy"]
13+
command: |-
14+
if [ -f "test.yaml" ]; then
15+
echo File test.yaml already exists
16+
exit 1
17+
else
18+
echo 123 > test.yaml
19+
fi
20+
21+
deployments:
22+
- name: dep2
23+
helm:
24+
componentChart: true
25+
values:
26+
containers:
27+
- image: alpine
28+
command: ["sleep", "infinity"]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
version: v1beta11
2+
3+
vars:
4+
- name: NAME
5+
value: dep3
6+
7+
deployments:
8+
- name: ${NAME}
9+
helm:
10+
componentChart: true
11+
values:
12+
containers:
13+
- image: alpine
14+
command: ["sleep", "infinity"]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
version: v1beta11
2+
3+
dependencies:
4+
- name: dep1
5+
source:
6+
path: dep1
7+
- name: dep2
8+
source:
9+
path: dep2

pkg/devspace/dependency/dependency.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ func (m *manager) handleDependencies(skipDependencies, filterDependencies []stri
232232
m.log.Infof("To display the complete dependency execution log run with the '--verbose-dependencies' flag")
233233
}
234234

235-
executedDependencies, err := m.executeDependenciesRecursive("", dependencies, skipDependencies, filterDependencies, reverse, silent, verbose, actionName, action)
235+
executedDependencies, err := m.executeDependenciesRecursive("", dependencies, skipDependencies, filterDependencies, reverse, silent, verbose, actionName, action, map[string]bool{})
236236
if err != nil {
237237
hooksErr := hook.ExecuteHooks(m.client, m.config, dependencies, map[string]interface{}{
238238
"error": err,
@@ -252,7 +252,7 @@ func (m *manager) handleDependencies(skipDependencies, filterDependencies []stri
252252
return executedDependencies, nil
253253
}
254254

255-
func (m *manager) executeDependenciesRecursive(base string, dependencies []types.Dependency, skipDependencies, filterDependencies []string, reverse, silent, verbose bool, actionName string, action func(dependency *Dependency, log log.Logger) error) ([]types.Dependency, error) {
255+
func (m *manager) executeDependenciesRecursive(base string, dependencies []types.Dependency, skipDependencies, filterDependencies []string, reverse, silent, verbose bool, actionName string, action func(dependency *Dependency, log log.Logger) error, executedDependenciesIDs map[string]bool) ([]types.Dependency, error) {
256256
// Execute all dependencies
257257
i := 0
258258
if reverse {
@@ -267,6 +267,21 @@ func (m *manager) executeDependenciesRecursive(base string, dependencies []types
267267
dependencyLogger = m.log
268268
)
269269

270+
// Increase / Decrease counter
271+
if reverse {
272+
i--
273+
} else {
274+
i++
275+
}
276+
277+
// skip if dependency was executed already
278+
if executedDependenciesIDs[dependency.ID()] {
279+
continue
280+
}
281+
282+
// make sure we don't execute the dependency again
283+
executedDependenciesIDs[dependency.ID()] = true
284+
270285
// get dependency name
271286
dependencyName := dependency.Name()
272287
if base != "" {
@@ -280,7 +295,7 @@ func (m *manager) executeDependenciesRecursive(base string, dependencies []types
280295
return nil, hooksErr
281296
}
282297

283-
_, err := m.executeDependenciesRecursive(dependencyName, dependency.Children(), skipDependencies, filterDependencies, reverse, silent, verbose, actionName, action)
298+
_, err := m.executeDependenciesRecursive(dependencyName, dependency.Children(), skipDependencies, filterDependencies, reverse, silent, verbose, actionName, action, executedDependenciesIDs)
284299
if err != nil {
285300
hooksErr := hook.ExecuteHooks(dependency.KubeClient(), dependency.Config(), dependency.Children(), map[string]interface{}{
286301
"error": err,
@@ -298,13 +313,6 @@ func (m *manager) executeDependenciesRecursive(base string, dependencies []types
298313
}
299314
}
300315

301-
// Increase / Decrease counter
302-
if reverse {
303-
i--
304-
} else {
305-
i++
306-
}
307-
308316
// Check if we should act on this dependency
309317
if !foundDependency(dependencyName, filterDependencies) {
310318
continue

0 commit comments

Comments
 (0)