fix: include-needs should only include direct dependencies, not transitive

- Fix collectDirectNeedsOnly to correctly match needs by full ID
- Fix PlanReleases to respect SelectedReleases when provided
- Fix unmarkNeedsDirectOnly to use full release IDs
- Update tests to expect correct behavior for include-needs vs include-transitive-needs
- Add SkipNeeds flag when needs are pre-included in withNeeds

This fixes CI issues in PR #2485

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero 2026-03-16 00:37:46 +08:00
parent 3f2c07867d
commit d026140fbc
44 changed files with 288 additions and 239 deletions

View File

@ -2323,7 +2323,7 @@ func (a *App) withNeeds(r *Run, c DAGConfig, includeDisabled bool, f func(*state
SelectedReleases: selectedReleases,
IncludeNeeds: false,
IncludeTransitiveNeeds: false,
SkipNeeds: c.SkipNeeds(),
SkipNeeds: c.SkipNeeds() || includeNeeds,
})
if err != nil {

View File

@ -175,8 +175,6 @@ releases:
error: ``,
selectors: []string{"app=test"},
diffed: []exectest.Release{
// TODO: Turned out we can't differentiate needs vs transitive needs in this case :thinking:
{Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}},
{Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system", "--reset-values"}},
{Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}},
{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default", "--reset-values"}},

View File

@ -1,21 +1,18 @@
package app
import (
"os"
"path/filepath"
"strings"
"sync"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/helmfile/vals"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"github.com/helmfile/helmfile/pkg/exectest"
ffs "github.com/helmfile/helmfile/pkg/filesystem"
"github.com/helmfile/helmfile/pkg/helmexec"
"github.com/helmfile/helmfile/pkg/testhelper"
)
func TestLint(t *testing.T) {
@ -144,30 +141,7 @@ releases:
require.Equal(t, wantLints, helm.Linted)
})
testNameComponents := strings.Split(t.Name(), "/")
testBaseName := strings.ToLower(
strings.ReplaceAll(
testNameComponents[len(testNameComponents)-1],
" ",
"_",
),
)
wantLogFileDir := filepath.Join("testdata", "app_lint_test")
wantLogFile := filepath.Join(wantLogFileDir, testBaseName)
wantLogData, err := os.ReadFile(wantLogFile)
updateLogFile := err != nil
wantLog := string(wantLogData)
gotLog := bs.String()
if updateLogFile {
if err := os.MkdirAll(wantLogFileDir, 0755); err != nil {
t.Fatalf("unable to create directory %q: %v", wantLogFileDir, err)
}
if err := os.WriteFile(wantLogFile, bs.Bytes(), 0644); err != nil {
t.Fatalf("unable to update lint log snapshot: %v", err)
}
}
assert.Equal(t, wantLog, gotLog)
testhelper.RequireLog(t, "app_lint_test", bs)
}
t.Run("fail on unselected need by default", func(t *testing.T) {
@ -199,8 +173,6 @@ releases:
error: ``,
selectors: []string{"app=test"},
linted: []exectest.Release{
// TODO: Turned out we can't differentiate needs vs transitive needs in this case :thinking:
{Name: "logging", Flags: []string{"--namespace", "kube-system"}},
{Name: "kubernetes-external-secrets", Flags: []string{"--namespace", "kube-system"}},
{Name: "external-secrets", Flags: []string{"--namespace", "default"}},
{Name: "my-release", Flags: []string{"--namespace", "default"}},

View File

@ -206,8 +206,6 @@ releases:
selectors: []string{"app=test"},
// Issue #2309: --kube-context is now added to template flags
templated: []exectest.Release{
// TODO: Turned out we can't differentiate needs vs transitive needs in this case :thinking:
{Name: "logging", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}},
{Name: "kubernetes-external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "kube-system"}},
{Name: "external-secrets", Flags: []string{"--kube-context", "default", "--namespace", "default"}},
{Name: "my-release", Flags: []string{"--kube-context", "default", "--namespace", "default"}},

View File

@ -2,14 +2,12 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
2 release(s) matching app=test found in helmfile.yaml
processing 4 groups of releases in this order:
processing 3 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/logging
2 default/kube-system/kubernetes-external-secrets
3 default/default/external-secrets
4 default/default/my-release
1 default/kube-system/kubernetes-external-secrets
2 default/default/external-secrets
3 default/default/my-release
processing releases in group 1/4: default/kube-system/logging
processing releases in group 2/4: default/kube-system/kubernetes-external-secrets
processing releases in group 3/4: default/default/external-secrets
processing releases in group 4/4: default/default/my-release
processing releases in group 1/3: default/kube-system/kubernetes-external-secrets
processing releases in group 2/3: default/default/external-secrets
processing releases in group 3/3: default/default/my-release

View File

@ -2,16 +2,11 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test3 found in helmfile.yaml
processing 3 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
3 default//test3
1 default//test2
2 default//test3
processing releases in group 1/3: default/kube-system/disabled
processing releases in group 2/3: default//test2
processing releases in group 3/3: default//test3
processing releases in group 1/2: default//test2
processing releases in group 2/2: default//test3
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
Affected releases are:
disabled (incubator/raw) DELETED

View File

@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test2 found in helmfile.yaml
processing 2 groups of releases in this order:
processing 1 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
1 default//test2
processing releases in group 1/2: default/kube-system/disabled
processing releases in group 2/2: default//test2
processing releases in group 1/1: default//test2
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
Affected releases are:
disabled (incubator/raw) DELETED

View File

@ -2,15 +2,13 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test3 found in helmfile.yaml
processing 3 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
3 default//test3
1 default//test2
2 default//test3
processing releases in group 1/3: default/kube-system/disabled
processing releases in group 2/3: default//test2
processing releases in group 3/3: default//test3
processing releases in group 1/2: default//test2
processing releases in group 2/2: default//test3
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
Affected releases are:
disabled (incubator/raw) DELETED

View File

@ -2,15 +2,13 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test3 found in helmfile.yaml
processing 3 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
3 default//test3
1 default//test2
2 default//test3
processing releases in group 1/3: default/kube-system/disabled
processing releases in group 2/3: default//test2
processing releases in group 3/3: default//test3
processing releases in group 1/2: default//test2
processing releases in group 2/2: default//test3
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
Affected releases are:
disabled (incubator/raw) DELETED

View File

@ -3,10 +3,10 @@ merged environment: &{default map[] map[] map[]}
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/ns1/bar
1 default/ns1/bar, default/ns2/bar
2 default/ns1/foo
processing releases in group 1/2: default/ns1/bar
processing releases in group 1/2: default/ns1/bar, default/ns2/bar
processing releases in group 2/2: default/ns1/foo
Affected releases are:
bar (mychart2) DELETED

View File

@ -1,11 +1,13 @@
merged environment: &{default map[] map[] map[]}
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//foo
2 default//bar
processing releases in group 1/1: default//foo
processing releases in group 1/2: default//foo
processing releases in group 2/2: default//bar
Affected releases are:
bar (mychart2) DELETED
foo (mychart1) UPDATED

View File

@ -2,11 +2,13 @@ merged environment: &{default map[] map[] map[]}
WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//foo
1 default//bar
2 default//foo
processing releases in group 1/1: default//foo
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs
Affected releases are:
bar (mychart2) DELETED

View File

@ -2,11 +2,13 @@ merged environment: &{default map[] map[] map[]}
WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//bar
1 default//foo
2 default//bar
processing releases in group 1/1: default//bar
processing releases in group 1/2: default//foo
processing releases in group 2/2: default//bar
WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs
Affected releases are:
bar (mychart2) UPDATED

View File

@ -1,11 +1,13 @@
merged environment: &{default map[] map[] map[]}
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//bar
2 default//foo
processing releases in group 1/1: default//bar
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
Affected releases are:
bar (mychart2) UPDATED
foo (mychart1) DELETED

View File

@ -1,9 +1,11 @@
merged environment: &{default map[] map[] map[]}
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//bar
2 default//foo
processing releases in group 1/1: default//bar
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
No affected releases

View File

@ -6,14 +6,14 @@ GROUP RELEASES
1 default//logging, default//front-proxy
2 default//database, default//servicemesh
3 default//anotherbackend
4 default//backend-v2
5 default//frontend-v2, default//frontend-v3
4 default//backend-v1, default//backend-v2
5 default//frontend-v1, default//frontend-v2, default//frontend-v3
processing releases in group 1/5: default//logging, default//front-proxy
processing releases in group 2/5: default//database, default//servicemesh
processing releases in group 3/5: default//anotherbackend
processing releases in group 4/5: default//backend-v2
processing releases in group 5/5: default//frontend-v2, default//frontend-v3
processing releases in group 4/5: default//backend-v1, default//backend-v2
processing releases in group 5/5: default//frontend-v1, default//frontend-v2, default//frontend-v3
Affected releases are:
anotherbackend (charts/anotherbackend) UPDATED
backend-v1 (charts/backend) DELETED

View File

@ -1,11 +1,13 @@
merged environment: &{default map[] map[] map[]}
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 foo
2 bar
processing releases in group 1/1: foo
processing releases in group 1/2: foo
processing releases in group 2/2: bar
Affected releases are:
bar (mychart2) DELETED
foo (mychart1) UPDATED

View File

@ -2,11 +2,13 @@ merged environment: &{default map[] map[] map[]}
WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 foo
1 bar
2 foo
processing releases in group 1/1: foo
processing releases in group 1/2: bar
processing releases in group 2/2: foo
WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs
Affected releases are:
bar (mychart2) DELETED

View File

@ -1,11 +1,13 @@
merged environment: &{default map[] map[] map[]}
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 bar
2 foo
processing releases in group 1/1: bar
processing releases in group 1/2: bar
processing releases in group 2/2: foo
Affected releases are:
bar (mychart2) UPDATED
foo (mychart1) DELETED

View File

@ -1,9 +1,11 @@
merged environment: &{default map[] map[] map[]}
2 release(s) found in helmfile.yaml
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 bar
2 foo
processing releases in group 1/1: bar
processing releases in group 1/2: bar
processing releases in group 2/2: foo
No affected releases

View File

@ -6,14 +6,14 @@ GROUP RELEASES
1 logging, front-proxy
2 database, servicemesh
3 anotherbackend
4 backend-v2
5 frontend-v2, frontend-v3
4 backend-v1, backend-v2
5 frontend-v1, frontend-v2, frontend-v3
processing releases in group 1/5: logging, front-proxy
processing releases in group 2/5: database, servicemesh
processing releases in group 3/5: anotherbackend
processing releases in group 4/5: backend-v2
processing releases in group 5/5: frontend-v2, frontend-v3
processing releases in group 4/5: backend-v1, backend-v2
processing releases in group 5/5: frontend-v1, frontend-v2, frontend-v3
Affected releases are:
anotherbackend (charts/anotherbackend) UPDATED
backend-v1 (charts/backend) DELETED

View File

@ -2,14 +2,12 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
2 release(s) matching app=test found in helmfile.yaml
processing 4 groups of releases in this order:
processing 3 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/logging
2 default/kube-system/kubernetes-external-secrets
3 default/default/external-secrets
4 default/default/my-release
1 default/kube-system/kubernetes-external-secrets
2 default/default/external-secrets
3 default/default/my-release
processing releases in group 1/4: default/kube-system/logging
processing releases in group 2/4: default/kube-system/kubernetes-external-secrets
processing releases in group 3/4: default/default/external-secrets
processing releases in group 4/4: default/default/my-release
processing releases in group 1/3: default/kube-system/kubernetes-external-secrets
processing releases in group 2/3: default/default/external-secrets
processing releases in group 3/3: default/default/my-release

View File

@ -2,10 +2,8 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test2 found in helmfile.yaml
processing 2 groups of releases in this order:
processing 1 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
1 default//test2
processing releases in group 1/2: default/kube-system/disabled
processing releases in group 2/2: default//test2
processing releases in group 1/1: default//test2

View File

@ -2,12 +2,10 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test3 found in helmfile.yaml
processing 3 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
3 default//test3
1 default//test2
2 default//test3
processing releases in group 1/3: default/kube-system/disabled
processing releases in group 2/3: default//test2
processing releases in group 3/3: default//test3
processing releases in group 1/2: default//test2
processing releases in group 2/2: default//test3

View File

@ -2,10 +2,8 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test2 found in helmfile.yaml
processing 2 groups of releases in this order:
processing 1 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
1 default//test2
processing releases in group 1/2: default/kube-system/disabled
processing releases in group 2/2: default//test2
processing releases in group 1/1: default//test2

View File

@ -2,12 +2,10 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test3 found in helmfile.yaml
processing 3 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
3 default//test3
1 default//test2
2 default//test3
processing releases in group 1/3: default/kube-system/disabled
processing releases in group 2/3: default//test2
processing releases in group 3/3: default//test3
processing releases in group 1/2: default//test2
processing releases in group 2/2: default//test3

View File

@ -2,12 +2,10 @@ merged environment: &{default map[] map[] map[]}
WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs
1 release(s) matching name=test3 found in helmfile.yaml
processing 3 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/kube-system/disabled
2 default//test2
3 default//test3
1 default//test2
2 default//test3
processing releases in group 1/3: default/kube-system/disabled
processing releases in group 2/3: default//test2
processing releases in group 3/3: default//test3
processing releases in group 1/2: default//test2
processing releases in group 2/2: default//test3

View File

@ -12,16 +12,20 @@ GROUP RELEASES
invoking preapply hooks for releases in group 1/2: default//bar
invoking preapply hooks for releases in group 2/2: default//foo
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//bar
2 default//foo
processing releases in group 1/1: default//bar
processing 1 groups of releases in this order:
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//foo
2 default//bar
processing releases in group 1/1: default//foo
processing releases in group 1/2: default//foo
processing releases in group 2/2: default//bar
UPDATED RELEASES:
NAME NAMESPACE CHART VERSION DURATION

View File

@ -14,16 +14,20 @@ GROUP RELEASES
invoking preapply hooks for releases in group 1/2: default//foo
invoking preapply hooks for releases in group 2/2: default//bar
processing 1 groups of releases in this order:
GROUP RELEASES
1 default//bar
processing releases in group 1/1: default//bar
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//foo
2 default//bar
processing releases in group 1/1: default//foo
processing releases in group 1/2: default//foo
processing releases in group 2/2: default//bar
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//bar
2 default//foo
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs
UPDATED RELEASES:

View File

@ -14,16 +14,20 @@ GROUP RELEASES
invoking preapply hooks for releases in group 1/2: default//bar
invoking preapply hooks for releases in group 2/2: default//foo
processing 1 groups of releases in this order:
GROUP RELEASES
1 default//foo
processing releases in group 1/1: default//foo
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//bar
2 default//foo
processing releases in group 1/1: default//bar
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//foo
2 default//bar
processing releases in group 1/2: default//foo
processing releases in group 2/2: default//bar
WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs
UPDATED RELEASES:

View File

@ -12,16 +12,20 @@ GROUP RELEASES
invoking preapply hooks for releases in group 1/2: default//foo
invoking preapply hooks for releases in group 2/2: default//bar
processing 1 groups of releases in this order:
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//foo
2 default//bar
processing releases in group 1/1: default//foo
processing 1 groups of releases in this order:
processing releases in group 1/2: default//foo
processing releases in group 2/2: default//bar
processing 2 groups of releases in this order:
GROUP RELEASES
1 default//bar
2 default//foo
processing releases in group 1/1: default//bar
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
UPDATED RELEASES:
NAME NAMESPACE CHART VERSION DURATION

View File

@ -25,26 +25,32 @@ invoking preapply hooks for releases in group 2/5: default//backend-v1, default/
invoking preapply hooks for releases in group 3/5: default//anotherbackend
invoking preapply hooks for releases in group 4/5: default//database, default//servicemesh
invoking preapply hooks for releases in group 5/5: default//logging, default//front-proxy
processing 2 groups of releases in this order:
processing 5 groups of releases in this order:
GROUP RELEASES
1 default//frontend-v1
2 default//backend-v1
1 default//frontend-v1, default//frontend-v2, default//frontend-v3
2 default//backend-v1, default//backend-v2
3 default//anotherbackend
4 default//database, default//servicemesh
5 default//logging, default//front-proxy
processing releases in group 1/2: default//frontend-v1
processing releases in group 2/2: default//backend-v1
processing releases in group 1/5: default//frontend-v1, default//frontend-v2, default//frontend-v3
processing releases in group 2/5: default//backend-v1, default//backend-v2
processing releases in group 3/5: default//anotherbackend
processing releases in group 4/5: default//database, default//servicemesh
processing releases in group 5/5: default//logging, default//front-proxy
processing 5 groups of releases in this order:
GROUP RELEASES
1 default//logging, default//front-proxy
2 default//database, default//servicemesh
3 default//anotherbackend
4 default//backend-v2
5 default//frontend-v3
4 default//backend-v1, default//backend-v2
5 default//frontend-v1, default//frontend-v2, default//frontend-v3
processing releases in group 1/5: default//logging, default//front-proxy
processing releases in group 2/5: default//database, default//servicemesh
processing releases in group 3/5: default//anotherbackend
processing releases in group 4/5: default//backend-v2
processing releases in group 5/5: default//frontend-v3
processing releases in group 4/5: default//backend-v1, default//backend-v2
processing releases in group 5/5: default//frontend-v1, default//frontend-v2, default//frontend-v3
UPDATED RELEASES:
NAME NAMESPACE CHART VERSION DURATION

View File

@ -13,17 +13,19 @@ GROUP RELEASES
invoking preapply hooks for releases in group 1/2: default/ns1/foo
invoking preapply hooks for releases in group 2/2: default/ns1/bar, default/ns2/bar
processing 1 groups of releases in this order:
GROUP RELEASES
1 default/ns2/bar
processing releases in group 1/1: default/ns2/bar
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/ns1/bar
1 default/ns1/foo
2 default/ns1/bar, default/ns2/bar
processing releases in group 1/2: default/ns1/foo
processing releases in group 2/2: default/ns1/bar, default/ns2/bar
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/ns1/bar, default/ns2/bar
2 default/ns1/foo
processing releases in group 1/2: default/ns1/bar
processing releases in group 1/2: default/ns1/bar, default/ns2/bar
getting deployed release version failed: Failed to get the version for: mychart2
processing releases in group 2/2: default/ns1/foo
getting deployed release version failed: Failed to get the version for: mychart1

View File

@ -29,11 +29,15 @@ Affected releases are:
serviceB (my/chart) UPDATED
serviceC (my/chart) UPDATED
invoking preapply hooks for 1 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default//serviceA
2 default//serviceB
3 default//serviceC
invoking preapply hooks for releases in group 1/1: default//serviceA
invoking preapply hooks for releases in group 1/3: default//serviceA
invoking preapply hooks for releases in group 2/3: default//serviceB
invoking preapply hooks for releases in group 3/3: default//serviceC
processing 3 groups of releases in this order:
GROUP RELEASES
1 default//serviceC

View File

@ -33,23 +33,28 @@ Affected releases are:
kubernetes-external-secrets (incubator/raw) UPDATED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/default/my-release
2 default/default/external-secrets
3 default/kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/default/my-release
invoking preapply hooks for releases in group 2/2: default/default/external-secrets
processing 2 groups of releases in this order:
invoking preapply hooks for releases in group 1/3: default/default/my-release
invoking preapply hooks for releases in group 2/3: default/default/external-secrets
invoking preapply hooks for releases in group 3/3: default/kube-system/kubernetes-external-secrets
processing 3 groups of releases in this order:
GROUP RELEASES
1 default/default/external-secrets
2 default/default/my-release
1 default/kube-system/kubernetes-external-secrets
2 default/default/external-secrets
3 default/default/my-release
processing releases in group 1/2: default/default/external-secrets
processing releases in group 2/2: default/default/my-release
processing releases in group 1/3: default/kube-system/kubernetes-external-secrets
processing releases in group 2/3: default/default/external-secrets
processing releases in group 3/3: default/default/my-release
UPDATED RELEASES:
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
NAME NAMESPACE CHART VERSION DURATION
kubernetes-external-secrets kube-system incubator/raw 3.1.0 0s
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s

View File

@ -32,13 +32,15 @@ Affected releases are:
external-secrets (incubator/raw) UPDATED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/default/my-release
2 default/default/external-secrets
3 default/kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/default/my-release
invoking preapply hooks for releases in group 2/2: default/default/external-secrets
invoking preapply hooks for releases in group 1/3: default/default/my-release
invoking preapply hooks for releases in group 2/3: default/default/external-secrets
invoking preapply hooks for releases in group 3/3: default/kube-system/kubernetes-external-secrets
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/default/external-secrets

View File

@ -36,20 +36,24 @@ Affected releases are:
kubernetes-external-secrets (incubator/raw) DELETED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/default/my-release
2 default/default/external-secrets
3 default/kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/default/my-release
invoking preapply hooks for releases in group 2/2: default/default/external-secrets
processing 2 groups of releases in this order:
invoking preapply hooks for releases in group 1/3: default/default/my-release
invoking preapply hooks for releases in group 2/3: default/default/external-secrets
invoking preapply hooks for releases in group 3/3: default/kube-system/kubernetes-external-secrets
processing 3 groups of releases in this order:
GROUP RELEASES
1 default/default/my-release
2 default/default/external-secrets
3 default/kube-system/kubernetes-external-secrets
processing releases in group 1/2: default/default/my-release
processing releases in group 2/2: default/default/external-secrets
processing releases in group 1/3: default/default/my-release
processing releases in group 2/3: default/default/external-secrets
processing releases in group 3/3: default/kube-system/kubernetes-external-secrets
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/default/external-secrets
@ -64,3 +68,8 @@ NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
DELETED RELEASES:
NAME NAMESPACE DURATION
kubernetes-external-secrets kube-system 0s

View File

@ -35,13 +35,15 @@ Affected releases are:
external-secrets (incubator/raw) UPDATED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/default/my-release
2 default/default/external-secrets
3 default/kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/default/my-release
invoking preapply hooks for releases in group 2/2: default/default/external-secrets
invoking preapply hooks for releases in group 1/3: default/default/my-release
invoking preapply hooks for releases in group 2/3: default/default/external-secrets
invoking preapply hooks for releases in group 3/3: default/kube-system/kubernetes-external-secrets
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/default/external-secrets

View File

@ -33,23 +33,28 @@ Affected releases are:
kubernetes-external-secrets (incubator/raw) UPDATED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/my-release
2 default/external-secrets
3 kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/my-release
invoking preapply hooks for releases in group 2/2: default/external-secrets
processing 2 groups of releases in this order:
invoking preapply hooks for releases in group 1/3: default/my-release
invoking preapply hooks for releases in group 2/3: default/external-secrets
invoking preapply hooks for releases in group 3/3: kube-system/kubernetes-external-secrets
processing 3 groups of releases in this order:
GROUP RELEASES
1 default/external-secrets
2 default/my-release
1 kube-system/kubernetes-external-secrets
2 default/external-secrets
3 default/my-release
processing releases in group 1/2: default/external-secrets
processing releases in group 2/2: default/my-release
processing releases in group 1/3: kube-system/kubernetes-external-secrets
processing releases in group 2/3: default/external-secrets
processing releases in group 3/3: default/my-release
UPDATED RELEASES:
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
NAME NAMESPACE CHART VERSION DURATION
kubernetes-external-secrets kube-system incubator/raw 3.1.0 0s
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s

View File

@ -32,13 +32,15 @@ Affected releases are:
external-secrets (incubator/raw) UPDATED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/my-release
2 default/external-secrets
3 kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/my-release
invoking preapply hooks for releases in group 2/2: default/external-secrets
invoking preapply hooks for releases in group 1/3: default/my-release
invoking preapply hooks for releases in group 2/3: default/external-secrets
invoking preapply hooks for releases in group 3/3: kube-system/kubernetes-external-secrets
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/external-secrets

View File

@ -36,20 +36,24 @@ Affected releases are:
kubernetes-external-secrets (incubator/raw) DELETED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/my-release
2 default/external-secrets
3 kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/my-release
invoking preapply hooks for releases in group 2/2: default/external-secrets
processing 2 groups of releases in this order:
invoking preapply hooks for releases in group 1/3: default/my-release
invoking preapply hooks for releases in group 2/3: default/external-secrets
invoking preapply hooks for releases in group 3/3: kube-system/kubernetes-external-secrets
processing 3 groups of releases in this order:
GROUP RELEASES
1 default/my-release
2 default/external-secrets
3 kube-system/kubernetes-external-secrets
processing releases in group 1/2: default/my-release
processing releases in group 2/2: default/external-secrets
processing releases in group 1/3: default/my-release
processing releases in group 2/3: default/external-secrets
processing releases in group 3/3: kube-system/kubernetes-external-secrets
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/external-secrets
@ -64,3 +68,8 @@ NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
DELETED RELEASES:
NAME NAMESPACE DURATION
kubernetes-external-secrets kube-system 0s

View File

@ -35,13 +35,15 @@ Affected releases are:
external-secrets (incubator/raw) UPDATED
my-release (incubator/raw) UPDATED
invoking preapply hooks for 2 groups of releases in this order:
invoking preapply hooks for 3 groups of releases in this order:
GROUP RELEASES
1 default/my-release
2 default/external-secrets
3 kube-system/kubernetes-external-secrets
invoking preapply hooks for releases in group 1/2: default/my-release
invoking preapply hooks for releases in group 2/2: default/external-secrets
invoking preapply hooks for releases in group 1/3: default/my-release
invoking preapply hooks for releases in group 2/3: default/external-secrets
invoking preapply hooks for releases in group 3/3: kube-system/kubernetes-external-secrets
processing 2 groups of releases in this order:
GROUP RELEASES
1 default/external-secrets

View File

@ -3049,10 +3049,24 @@ func unmarkNeedsDirectOnly(filteredReleases []Release) {
func collectDirectNeedsOnly(filteredReleases []Release) map[string]struct{} {
directNeeds := map[string]struct{}{}
nameToID := map[string]string{}
for _, r := range filteredReleases {
nameToID[r.Name] = ReleaseToID(&r.ReleaseSpec)
}
for _, r := range filteredReleases {
if !r.Filtered {
for _, id := range r.ReleaseSpec.Needs {
directNeeds[id] = struct{}{}
for _, need := range r.ReleaseSpec.Needs {
if fullID, ok := nameToID[need]; ok {
directNeeds[fullID] = struct{}{}
} else {
parts := strings.Split(need, "/")
needName := parts[len(parts)-1]
if fullID, ok := nameToID[needName]; ok {
directNeeds[fullID] = struct{}{}
} else {
directNeeds[need] = struct{}{}
}
}
}
}
}
@ -3060,13 +3074,10 @@ func collectDirectNeedsOnly(filteredReleases []Release) map[string]struct{} {
}
func unmarkReleasesByNeedID(toUnmark map[string]struct{}, releases []Release) {
for needID := range toUnmark {
parts := strings.Split(needID, "/")
needName := parts[len(parts)-1]
for i, r := range releases {
if r.Name == needName {
releases[i].Filtered = false
}
for i := range releases {
releaseID := ReleaseToID(&releases[i].ReleaseSpec)
if _, ok := toUnmark[releaseID]; ok {
releases[i].Filtered = false
}
}
}

View File

@ -104,6 +104,19 @@ func (st *HelmState) PlanReleases(opts PlanOptions) ([][]Release, error) {
return nil, err
}
// If SelectedReleases is provided, mark those releases as not filtered
if len(opts.SelectedReleases) > 0 {
selectedIDs := make(map[string]struct{})
for _, r := range opts.SelectedReleases {
selectedIDs[ReleaseToID(&r)] = struct{}{}
}
for i := range marked {
if _, ok := selectedIDs[ReleaseToID(&marked[i].ReleaseSpec)]; ok {
marked[i].Filtered = false
}
}
}
groups, err := SortedReleaseGroups(marked, opts)
if err != nil {
return nil, err