diff --git a/pkg/action/get_metadata.go b/pkg/action/get_metadata.go index e760ae4d1..4cb77361a 100644 --- a/pkg/action/get_metadata.go +++ b/pkg/action/get_metadata.go @@ -34,11 +34,14 @@ type GetMetadata struct { } type Metadata struct { - Name string `json:"name" yaml:"name"` - Chart string `json:"chart" yaml:"chart"` - Version string `json:"version" yaml:"version"` - AppVersion string `json:"appVersion" yaml:"appVersion"` - Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` + Name string `json:"name" yaml:"name"` + Chart string `json:"chart" yaml:"chart"` + Version string `json:"version" yaml:"version"` + AppVersion string `json:"appVersion" yaml:"appVersion"` + // Annotations are fetched from the Chart.yaml file + Annotations map[string]string `json:"annotations,omitempty" yaml:"annotations,omitempty"` + // Labels of the release which are stored in driver metadata fields storage + Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` Dependencies []*chart.Dependency `json:"dependencies,omitempty" yaml:"dependencies,omitempty"` Namespace string `json:"namespace" yaml:"namespace"` Revision int `json:"revision" yaml:"revision"` @@ -71,6 +74,7 @@ func (g *GetMetadata) Run(name string) (*Metadata, error) { AppVersion: rel.Chart.Metadata.AppVersion, Dependencies: rel.Chart.Metadata.Dependencies, Annotations: rel.Chart.Metadata.Annotations, + Labels: rel.Labels, Namespace: rel.Namespace, Revision: rel.Version, Status: rel.Info.Status.String(), diff --git a/pkg/action/get_metadata_test.go b/pkg/action/get_metadata_test.go new file mode 100644 index 000000000..08e99d8d6 --- /dev/null +++ b/pkg/action/get_metadata_test.go @@ -0,0 +1,42 @@ +/* +Copyright The Helm 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 action + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + release "helm.sh/helm/v4/pkg/release/v1" +) + +func TestGetMetadata_Labels(t *testing.T) { + rel := releaseStub() + rel.Info.Status = release.StatusDeployed + customLabels := map[string]string{"key1": "value1", "key2": "value2"} + rel.Labels = customLabels + + metaGetter := NewGetMetadata(actionConfigFixture(t)) + err := metaGetter.cfg.Releases.Create(rel) + assert.NoError(t, err) + + metadata, err := metaGetter.Run(rel.Name) + assert.NoError(t, err) + + assert.Equal(t, metadata.Name, rel.Name) + assert.Equal(t, metadata.Labels, customLabels) +} diff --git a/pkg/cmd/get_metadata.go b/pkg/cmd/get_metadata.go index 9f58e0f4e..aea149f5e 100644 --- a/pkg/cmd/get_metadata.go +++ b/pkg/cmd/get_metadata.go @@ -80,6 +80,7 @@ func (w metadataWriter) WriteTable(out io.Writer) error { _, _ = fmt.Fprintf(out, "VERSION: %v\n", w.metadata.Version) _, _ = fmt.Fprintf(out, "APP_VERSION: %v\n", w.metadata.AppVersion) _, _ = fmt.Fprintf(out, "ANNOTATIONS: %v\n", k8sLabels.Set(w.metadata.Annotations).String()) + _, _ = fmt.Fprintf(out, "LABELS: %v\n", k8sLabels.Set(w.metadata.Labels).String()) _, _ = fmt.Fprintf(out, "DEPENDENCIES: %v\n", w.metadata.FormattedDepNames()) _, _ = fmt.Fprintf(out, "NAMESPACE: %v\n", w.metadata.Namespace) _, _ = fmt.Fprintf(out, "REVISION: %v\n", w.metadata.Revision) diff --git a/pkg/cmd/get_metadata_test.go b/pkg/cmd/get_metadata_test.go index a2ab2cba1..59fc3b82c 100644 --- a/pkg/cmd/get_metadata_test.go +++ b/pkg/cmd/get_metadata_test.go @@ -27,23 +27,23 @@ func TestGetMetadataCmd(t *testing.T) { name: "get metadata with a release", cmd: "get metadata thomas-guide", golden: "output/get-metadata.txt", - rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide", Labels: map[string]string{"key1": "value1"}})}, }, { name: "get metadata requires release name arg", cmd: "get metadata", golden: "output/get-metadata-args.txt", - rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide", Labels: map[string]string{"key1": "value1"}})}, wantError: true, }, { name: "get metadata to json", cmd: "get metadata thomas-guide --output json", golden: "output/get-metadata.json", - rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide", Labels: map[string]string{"key1": "value1"}})}, }, { name: "get metadata to yaml", cmd: "get metadata thomas-guide --output yaml", golden: "output/get-metadata.yaml", - rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide"})}, + rels: []*release.Release{release.Mock(&release.MockReleaseOptions{Name: "thomas-guide", Labels: map[string]string{"key1": "value1"}})}, }} runTestCmd(t, tests) } diff --git a/pkg/cmd/testdata/output/get-metadata.json b/pkg/cmd/testdata/output/get-metadata.json index 4c015b977..9166f87ac 100644 --- a/pkg/cmd/testdata/output/get-metadata.json +++ b/pkg/cmd/testdata/output/get-metadata.json @@ -1 +1 @@ -{"name":"thomas-guide","chart":"foo","version":"0.1.0-beta.1","appVersion":"1.0","annotations":{"category":"web-apps","supported":"true"},"dependencies":[{"name":"cool-plugin","version":"1.0.0","repository":"https://coolplugin.io/charts","condition":"coolPlugin.enabled","enabled":true},{"name":"crds","version":"2.7.1","repository":"","condition":"crds.enabled"}],"namespace":"default","revision":1,"status":"deployed","deployedAt":"1977-09-02T22:04:05Z"} +{"name":"thomas-guide","chart":"foo","version":"0.1.0-beta.1","appVersion":"1.0","annotations":{"category":"web-apps","supported":"true"},"labels":{"key1":"value1"},"dependencies":[{"name":"cool-plugin","version":"1.0.0","repository":"https://coolplugin.io/charts","condition":"coolPlugin.enabled","enabled":true},{"name":"crds","version":"2.7.1","repository":"","condition":"crds.enabled"}],"namespace":"default","revision":1,"status":"deployed","deployedAt":"1977-09-02T22:04:05Z"} diff --git a/pkg/cmd/testdata/output/get-metadata.txt b/pkg/cmd/testdata/output/get-metadata.txt index 01083b333..5744083dd 100644 --- a/pkg/cmd/testdata/output/get-metadata.txt +++ b/pkg/cmd/testdata/output/get-metadata.txt @@ -3,6 +3,7 @@ CHART: foo VERSION: 0.1.0-beta.1 APP_VERSION: 1.0 ANNOTATIONS: category=web-apps,supported=true +LABELS: key1=value1 DEPENDENCIES: cool-plugin,crds NAMESPACE: default REVISION: 1 diff --git a/pkg/cmd/testdata/output/get-metadata.yaml b/pkg/cmd/testdata/output/get-metadata.yaml index 6298436c9..98f567837 100644 --- a/pkg/cmd/testdata/output/get-metadata.yaml +++ b/pkg/cmd/testdata/output/get-metadata.yaml @@ -14,6 +14,8 @@ dependencies: repository: "" version: 2.7.1 deployedAt: "1977-09-02T22:04:05Z" +labels: + key1: value1 name: thomas-guide namespace: default revision: 1 diff --git a/pkg/release/v1/mock.go b/pkg/release/v1/mock.go index 9ca57284c..3d3b0c2e2 100644 --- a/pkg/release/v1/mock.go +++ b/pkg/release/v1/mock.go @@ -46,6 +46,7 @@ type MockReleaseOptions struct { Chart *chart.Chart Status Status Namespace string + Labels map[string]string } // Mock creates a mock release object based on options set by MockReleaseOptions. This function should typically not be used outside of testing. @@ -66,6 +67,10 @@ func Mock(opts *MockReleaseOptions) *Release { if namespace == "" { namespace = "default" } + var labels map[string]string + if len(opts.Labels) > 0 { + labels = opts.Labels + } ch := opts.Chart if opts.Chart == nil { @@ -130,5 +135,6 @@ func Mock(opts *MockReleaseOptions) *Release { }, }, Manifest: MockManifest, + Labels: labels, } }