mirror of
https://github.com/helm/helm.git
synced 2026-04-07 01:56:35 -04:00
Fixes #11712 A change was made that when validation was turned off the Kubernetes packages were building objects as a Table type. This was done for display purposes. When details about the objects was going to be printed as part of #10912. This broke rollback, and possibly other functionality, as a Table type was returned in some cases that needed the regular object. This caused things to break silently. The fix involved adding in a new Function (and interface) to query for tables instead of the objects themselves. There was not a clean way to add it to the existing function that covered all cases. A second problem was noticed along the way. When data was output via status as YAML or JSON it was in the form of a table rather than the objects themselves. This did not reflect expectations and did not match the functionality in kubectl. The code was updated to return a table when that was presented and the objects when they are being output for YAML or JSON. The API also supports this handling to SDK users can replicate this functionality. API changes made here were never released. The functions were developed for this release of Helm and only ever appeared in an RC. In this case, they can be changed. Signed-off-by: Matt Farina <matt.farina@suse.com>
95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
/*
|
|
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 (
|
|
"bytes"
|
|
"errors"
|
|
|
|
"helm.sh/helm/v3/pkg/kube"
|
|
"helm.sh/helm/v3/pkg/release"
|
|
)
|
|
|
|
// Status is the action for checking the deployment status of releases.
|
|
//
|
|
// It provides the implementation of 'helm status'.
|
|
type Status struct {
|
|
cfg *Configuration
|
|
|
|
Version int
|
|
|
|
// If true, display description to output format,
|
|
// only affect print type table.
|
|
// TODO Helm 4: Remove this flag and output the description by default.
|
|
ShowDescription bool
|
|
|
|
// ShowResources sets if the resources should be retrieved with the status.
|
|
// TODO Helm 4: Remove this flag and output the resources by default.
|
|
ShowResources bool
|
|
|
|
// ShowResourcesTable is used with ShowResources. When true this will cause
|
|
// the resulting objects to be retrieved as a kind=table.
|
|
ShowResourcesTable bool
|
|
}
|
|
|
|
// NewStatus creates a new Status object with the given configuration.
|
|
func NewStatus(cfg *Configuration) *Status {
|
|
return &Status{
|
|
cfg: cfg,
|
|
}
|
|
}
|
|
|
|
// Run executes 'helm status' against the given release.
|
|
func (s *Status) Run(name string) (*release.Release, error) {
|
|
if err := s.cfg.KubeClient.IsReachable(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if !s.ShowResources {
|
|
return s.cfg.releaseContent(name, s.Version)
|
|
}
|
|
|
|
rel, err := s.cfg.releaseContent(name, s.Version)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if kubeClient, ok := s.cfg.KubeClient.(kube.InterfaceResources); ok {
|
|
var resources kube.ResourceList
|
|
if s.ShowResourcesTable {
|
|
resources, err = kubeClient.BuildTable(bytes.NewBufferString(rel.Manifest), false)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
} else {
|
|
resources, err = s.cfg.KubeClient.Build(bytes.NewBufferString(rel.Manifest), false)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
resp, err := kubeClient.Get(resources, true)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rel.Info.Resources = resp
|
|
|
|
return rel, nil
|
|
}
|
|
return nil, errors.New("unable to get kubeClient with interface InterfaceResources")
|
|
}
|