1
0
mirror of https://github.com/rancher/steve.git synced 2025-07-15 07:32:17 +00:00
steve/pkg/resources/helm/helm3.go
2020-06-11 21:51:19 -07:00

133 lines
3.2 KiB
Go

package helm
import (
"bytes"
"compress/gzip"
"encoding/base64"
"encoding/json"
"io/ioutil"
"strings"
"helm.sh/helm/v3/pkg/release"
)
func isHelm3(labels map[string]string) bool {
return labels["owner"] == "helm"
}
func fromHelm3Data(data string, isNamespaced IsNamespaced) (*Release, error) {
release, err := decodeHelm3(data)
if err != nil {
return nil, err
}
return fromHelm3ReleaseToRelease(release, isNamespaced)
}
func fromHelm3ReleaseToRelease(release *release.Release, isNamespaced IsNamespaced) (*Release, error) {
var (
info = &Info{}
chart = &Chart{}
err error
)
if release.Info != nil {
info = &Info{
FirstDeployed: release.Info.FirstDeployed.Time,
LastDeployed: release.Info.LastDeployed.Time,
Deleted: release.Info.Deleted.Time,
Description: release.Info.Description,
Status: Status(release.Info.Status),
Notes: release.Info.Notes,
}
}
if release.Chart != nil {
chart = &Chart{
Values: release.Chart.Values,
}
if release.Chart.Metadata != nil {
chart.Metadata = &Metadata{
Name: release.Chart.Metadata.Name,
Home: release.Chart.Metadata.Home,
Sources: release.Chart.Metadata.Sources,
Version: release.Chart.Metadata.Version,
Description: release.Chart.Metadata.Description,
Keywords: release.Chart.Metadata.Keywords,
Icon: release.Chart.Metadata.Icon,
APIVersion: release.Chart.Metadata.APIVersion,
Condition: release.Chart.Metadata.Condition,
Tags: release.Chart.Metadata.Tags,
AppVersion: release.Chart.Metadata.AppVersion,
Deprecated: release.Chart.Metadata.Deprecated,
Annotations: release.Chart.Metadata.Annotations,
KubeVersion: release.Chart.Metadata.KubeVersion,
Type: release.Chart.Metadata.Type,
}
for _, m := range release.Chart.Metadata.Maintainers {
if m == nil {
continue
}
chart.Metadata.Maintainers = append(chart.Metadata.Maintainers, Maintainer{
Name: m.Name,
Email: m.Email,
URL: m.URL,
})
}
}
for _, f := range release.Chart.Files {
if f == nil {
continue
}
if readmes[strings.ToLower(f.Name)] {
info.Readme = string(f.Data)
}
}
}
hr := &Release{
Name: release.Name,
Info: info,
Chart: chart,
Values: release.Config,
Resources: nil,
Version: release.Version,
Namespace: release.Namespace,
HelmMajorVersion: 3,
}
hr.Resources, err = resourcesFromManifest(release.Namespace, release.Manifest, isNamespaced)
return hr, err
}
func decodeHelm3(data string) (*release.Release, error) {
b, err := base64.StdEncoding.DecodeString(data)
if err != nil {
return nil, err
}
// For backwards compatibility with releases that were stored before
// compression was introduced we skip decompression if the
// gzip magic header is not found
if bytes.Equal(b[0:3], magicGzip) {
r, err := gzip.NewReader(bytes.NewReader(b))
if err != nil {
return nil, err
}
b2, err := ioutil.ReadAll(r)
if err != nil {
return nil, err
}
b = b2
}
var rls release.Release
// unmarshal release object bytes
if err := json.Unmarshal(b, &rls); err != nil {
return nil, err
}
return &rls, nil
}