Correct enabled property in helmfile list (#1921)
Use the value of the `condition` field instead of the `installed` field of a release in the `enabled` column of helmfile list. The value of the `installed` field is shown in a new `installed` column. Fixes #1920 Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>
This commit is contained in:
parent
753de35ee0
commit
346e318fd0
|
|
@ -61,6 +61,7 @@ type HelmRelease struct {
|
|||
Name string `json:"name"`
|
||||
Namespace string `json:"namespace"`
|
||||
Enabled bool `json:"enabled"`
|
||||
Installed bool `json:"installed"`
|
||||
Labels string `json:"labels"`
|
||||
Chart string `json:"chart"`
|
||||
Version string `json:"version"`
|
||||
|
|
@ -575,11 +576,17 @@ func (a *App) ListReleases(c ListConfigProvider) error {
|
|||
}
|
||||
labels = strings.Trim(labels, ",")
|
||||
|
||||
enabled, err := state.ConditionEnabled(r, run.state.Values())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
installed := r.Installed == nil || *r.Installed
|
||||
releases = append(releases, &HelmRelease{
|
||||
Name: r.Name,
|
||||
Namespace: r.Namespace,
|
||||
Enabled: installed,
|
||||
Installed: installed,
|
||||
Enabled: enabled,
|
||||
Labels: labels,
|
||||
Chart: r.Chart,
|
||||
Version: r.Version,
|
||||
|
|
|
|||
|
|
@ -16,15 +16,18 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
|
||||
"github.com/roboll/helmfile/pkg/remote"
|
||||
|
||||
"github.com/roboll/helmfile/pkg/exectest"
|
||||
"gotest.tools/v3/assert"
|
||||
|
||||
"github.com/roboll/helmfile/pkg/exectest"
|
||||
|
||||
"github.com/variantdev/vals"
|
||||
|
||||
"github.com/roboll/helmfile/pkg/helmexec"
|
||||
"github.com/roboll/helmfile/pkg/state"
|
||||
"github.com/roboll/helmfile/pkg/testhelper"
|
||||
"github.com/variantdev/vals"
|
||||
|
||||
"go.uber.org/zap"
|
||||
"gotest.tools/v3/env"
|
||||
|
|
@ -4803,6 +4806,11 @@ func TestList(t *testing.T) {
|
|||
"/path/to/helmfile.d/first.yaml": `
|
||||
commonLabels:
|
||||
common: label
|
||||
environments:
|
||||
default:
|
||||
values:
|
||||
- myrelease2:
|
||||
enabled: false
|
||||
releases:
|
||||
- name: myrelease1
|
||||
chart: mychart1
|
||||
|
|
@ -4811,6 +4819,7 @@ releases:
|
|||
id: myrelease1
|
||||
- name: myrelease2
|
||||
chart: mychart1
|
||||
condition: myrelease2.enabled
|
||||
`,
|
||||
"/path/to/helmfile.d/second.yaml": `
|
||||
releases:
|
||||
|
|
@ -4846,18 +4855,24 @@ releases:
|
|||
assert.NilError(t, err)
|
||||
})
|
||||
|
||||
expected := `NAME NAMESPACE ENABLED LABELS CHART VERSION
|
||||
myrelease1 false common:label,id:myrelease1 mychart1
|
||||
myrelease2 true common:label mychart1
|
||||
myrelease3 true mychart1
|
||||
myrelease4 true id:myrelease1 mychart1
|
||||
expected := `NAME NAMESPACE ENABLED INSTALLED LABELS CHART VERSION
|
||||
myrelease1 true false common:label,id:myrelease1 mychart1
|
||||
myrelease2 false true common:label mychart1
|
||||
myrelease3 true true mychart1
|
||||
myrelease4 true true id:myrelease1 mychart1
|
||||
`
|
||||
|
||||
assert.Equal(t, expected, out)
|
||||
}
|
||||
|
||||
func TestListWithJsonOutput(t *testing.T) {
|
||||
files := map[string]string{
|
||||
"/path/to/helmfile.d/first.yaml": `
|
||||
environments:
|
||||
default:
|
||||
values:
|
||||
- myrelease2:
|
||||
enabled: false
|
||||
releases:
|
||||
- name: myrelease1
|
||||
chart: mychart1
|
||||
|
|
@ -4866,6 +4881,7 @@ releases:
|
|||
id: myrelease1
|
||||
- name: myrelease2
|
||||
chart: mychart1
|
||||
condition: myrelease2.enabled
|
||||
`,
|
||||
"/path/to/helmfile.d/second.yaml": `
|
||||
releases:
|
||||
|
|
@ -4903,7 +4919,7 @@ releases:
|
|||
assert.NilError(t, err)
|
||||
})
|
||||
|
||||
expected := `[{"name":"myrelease1","namespace":"","enabled":false,"labels":"id:myrelease1","chart":"mychart1","version":""},{"name":"myrelease2","namespace":"","enabled":true,"labels":"","chart":"mychart1","version":""},{"name":"myrelease3","namespace":"","enabled":true,"labels":"","chart":"mychart1","version":""},{"name":"myrelease4","namespace":"","enabled":true,"labels":"id:myrelease1","chart":"mychart1","version":""}]
|
||||
expected := `[{"name":"myrelease1","namespace":"","enabled":true,"installed":false,"labels":"id:myrelease1","chart":"mychart1","version":""},{"name":"myrelease2","namespace":"","enabled":false,"installed":true,"labels":"","chart":"mychart1","version":""},{"name":"myrelease3","namespace":"","enabled":true,"installed":true,"labels":"","chart":"mychart1","version":""},{"name":"myrelease4","namespace":"","enabled":true,"installed":true,"labels":"id:myrelease1","chart":"mychart1","version":""}]
|
||||
`
|
||||
assert.Equal(t, expected, out)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,10 +9,10 @@ import (
|
|||
|
||||
func FormatAsTable(releases []*HelmRelease) error {
|
||||
table := uitable.New()
|
||||
table.AddRow("NAME", "NAMESPACE", "ENABLED", "LABELS", "CHART", "VERSION")
|
||||
table.AddRow("NAME", "NAMESPACE", "ENABLED", "INSTALLED", "LABELS", "CHART", "VERSION")
|
||||
|
||||
for _, r := range releases {
|
||||
table.AddRow(r.Name, r.Namespace, fmt.Sprintf("%t", r.Enabled), r.Labels, r.Chart, r.Version)
|
||||
table.AddRow(r.Name, r.Namespace, fmt.Sprintf("%t", r.Enabled), fmt.Sprintf("%t", r.Installed), r.Labels, r.Chart, r.Version)
|
||||
}
|
||||
|
||||
fmt.Println(table.String())
|
||||
|
|
|
|||
|
|
@ -2075,25 +2075,13 @@ func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabe
|
|||
}
|
||||
}
|
||||
var conditionMatch bool
|
||||
if len(r.Condition) > 0 {
|
||||
conditionSplit := strings.Split(r.Condition, ".")
|
||||
if len(conditionSplit) != 2 {
|
||||
return nil, fmt.Errorf("Condition value must be in the form 'foo.enabled' where 'foo' can be modified as necessary")
|
||||
}
|
||||
if v, ok := values[conditionSplit[0]]; ok {
|
||||
if v == nil {
|
||||
panic(fmt.Sprintf("environment values field '%s' is nil", conditionSplit[0]))
|
||||
}
|
||||
if v.(map[string]interface{})["enabled"] == true {
|
||||
conditionMatch = true
|
||||
}
|
||||
} else {
|
||||
panic(fmt.Sprintf("environment values does not contain field '%s'", conditionSplit[0]))
|
||||
}
|
||||
conditionMatch, err := ConditionEnabled(r, values)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to parse condition in release %s: %w", r.Name, err)
|
||||
}
|
||||
res := Release{
|
||||
ReleaseSpec: r,
|
||||
Filtered: (len(filters) > 0 && !filterMatch) || (len(r.Condition) > 0 && !conditionMatch),
|
||||
Filtered: (len(filters) > 0 && !filterMatch) || (!conditionMatch),
|
||||
}
|
||||
filteredReleases = append(filteredReleases, res)
|
||||
}
|
||||
|
|
@ -2103,6 +2091,29 @@ func markExcludedReleases(releases []ReleaseSpec, selectors []string, commonLabe
|
|||
return filteredReleases, nil
|
||||
}
|
||||
|
||||
func ConditionEnabled(r ReleaseSpec, values map[string]interface{}) (bool, error) {
|
||||
var conditionMatch bool
|
||||
if len(r.Condition) == 0 {
|
||||
return true, nil
|
||||
}
|
||||
conditionSplit := strings.Split(r.Condition, ".")
|
||||
if len(conditionSplit) != 2 {
|
||||
return false, fmt.Errorf("Condition value must be in the form 'foo.enabled' where 'foo' can be modified as necessary")
|
||||
}
|
||||
if v, ok := values[conditionSplit[0]]; ok {
|
||||
if v == nil {
|
||||
panic(fmt.Sprintf("environment values field '%s' is nil", conditionSplit[0]))
|
||||
}
|
||||
if v.(map[string]interface{})["enabled"] == true {
|
||||
conditionMatch = true
|
||||
}
|
||||
} else {
|
||||
panic(fmt.Sprintf("environment values does not contain field '%s'", conditionSplit[0]))
|
||||
}
|
||||
|
||||
return conditionMatch, nil
|
||||
}
|
||||
|
||||
func unmarkNeedsAndTransitives(filteredReleases []Release, allReleases []ReleaseSpec) {
|
||||
needsWithTranstives := collectAllNeedsWithTransitives(filteredReleases, allReleases)
|
||||
unmarkReleases(needsWithTranstives, filteredReleases)
|
||||
|
|
|
|||
Loading…
Reference in New Issue