Skip to content

Commit 7d1adbb

Browse files
authored
Merge pull request #1847 from FabianKramm/master
Deduplicate dependencies & print dependency tree
2 parents 5942ff9 + d478d58 commit 7d1adbb

File tree

7 files changed

+142
-12
lines changed

7 files changed

+142
-12
lines changed

cmd/print.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"github.com/loft-sh/devspace/pkg/devspace/config"
66
"github.com/loft-sh/devspace/pkg/devspace/dependency"
7+
"github.com/loft-sh/devspace/pkg/devspace/dependency/types"
78
"github.com/loft-sh/devspace/pkg/devspace/hook"
89
"github.com/loft-sh/devspace/pkg/devspace/plugin"
910
"io"
@@ -113,7 +114,7 @@ func (cmd *PrintCmd) Run(f factory.Factory) error {
113114
}
114115

115116
if !cmd.SkipInfo {
116-
err = printExtraInfo(loadedConfig, log)
117+
err = printExtraInfo(loadedConfig, dependencies, log)
117118
if err != nil {
118119
return err
119120
}
@@ -131,7 +132,7 @@ func (cmd *PrintCmd) Run(f factory.Factory) error {
131132
return nil
132133
}
133134

134-
func printExtraInfo(config config.Config, log logger.Logger) error {
135+
func printExtraInfo(config config.Config, dependencies []types.Dependency, log logger.Logger) error {
135136
log.WriteString("\n-------------------\n\nVars:\n")
136137

137138
headerColumnNames := []string{"Name", "Value"}
@@ -151,5 +152,21 @@ func printExtraInfo(config config.Config, log logger.Logger) error {
151152
}
152153

153154
log.WriteString("\n-------------------\n\nLoaded path: " + config.Path() + "\n\n-------------------\n\n")
155+
156+
if len(dependencies) > 0 {
157+
log.WriteString("Dependency Tree:\n\n> Root\n")
158+
for _, dep := range dependencies {
159+
printDependencyRecursive("--", dep, log)
160+
}
161+
log.WriteString("\n-------------------\n\n")
162+
}
163+
154164
return nil
155165
}
166+
167+
func printDependencyRecursive(prefix string, dep types.Dependency, log logger.Logger) {
168+
log.WriteString(prefix + "> " + dep.Name() + " (ID: " + dep.ID()[:5] + ")\n")
169+
for _, child := range dep.Children() {
170+
printDependencyRecursive(prefix+"--", child, log)
171+
}
172+
}

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: 19 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,22 @@ 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+
executedDependencies = append(executedDependencies, dependency)
280+
continue
281+
}
282+
283+
// make sure we don't execute the dependency again
284+
executedDependenciesIDs[dependency.ID()] = true
285+
270286
// get dependency name
271287
dependencyName := dependency.Name()
272288
if base != "" {
@@ -280,7 +296,7 @@ func (m *manager) executeDependenciesRecursive(base string, dependencies []types
280296
return nil, hooksErr
281297
}
282298

283-
_, err := m.executeDependenciesRecursive(dependencyName, dependency.Children(), skipDependencies, filterDependencies, reverse, silent, verbose, actionName, action)
299+
_, err := m.executeDependenciesRecursive(dependencyName, dependency.Children(), skipDependencies, filterDependencies, reverse, silent, verbose, actionName, action, executedDependenciesIDs)
284300
if err != nil {
285301
hooksErr := hook.ExecuteHooks(dependency.KubeClient(), dependency.Config(), dependency.Children(), map[string]interface{}{
286302
"error": err,
@@ -298,13 +314,6 @@ func (m *manager) executeDependenciesRecursive(base string, dependencies []types
298314
}
299315
}
300316

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

0 commit comments

Comments
 (0)