Просмотр исходного кода

rewrite chart list to query secrets directly

Alexander Belanger 4 лет назад
Родитель
Сommit
d3cc4ca25d

+ 0 - 1
dashboard/src/main/home/cluster-dashboard/chart/ChartList.tsx

@@ -74,7 +74,6 @@ const ChartList: React.FunctionComponent<Props> = ({
             "pending-install",
             "pending-upgrade",
             "pending-rollback",
-            "superseded",
             "failed",
           ],
         },

+ 60 - 3
internal/helm/agent.go

@@ -1,7 +1,10 @@
 package helm
 
 import (
+	"context"
 	"fmt"
+	"strconv"
+	"strings"
 
 	"github.com/pkg/errors"
 	"github.com/porter-dev/porter/internal/helm/loader"
@@ -9,6 +12,8 @@ import (
 	"helm.sh/helm/v3/pkg/action"
 	"helm.sh/helm/v3/pkg/chart"
 	"helm.sh/helm/v3/pkg/release"
+	corev1 "k8s.io/api/core/v1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/helm/pkg/chartutil"
 
 	"github.com/porter-dev/porter/api/types"
@@ -28,11 +33,63 @@ func (a *Agent) ListReleases(
 	namespace string,
 	filter *types.ReleaseListFilter,
 ) ([]*release.Release, error) {
-	cmd := action.NewList(a.ActionConfig)
+	lsel := fmt.Sprintf("owner=helm,status in (%s)", strings.Join(filter.StatusFilter, ","))
+	fsel := fmt.Sprintf("type=helm.sh/release.v1")
+
+	// list secrets
+	secretList, err := a.K8sAgent.Clientset.CoreV1().Secrets(namespace).List(
+		context.Background(),
+		v1.ListOptions{
+			LabelSelector: lsel,
+			FieldSelector: fsel,
+		},
+	)
 
-	filter.Apply(cmd)
+	if err != nil {
+		return nil, err
+	}
+
+	// before decoding to helm release, only keep the latest releases for each chart
+	latestMap := make(map[string]corev1.Secret)
+
+	for _, secret := range secretList.Items {
+		relName, relNameExists := secret.Labels["name"]
+
+		if !relNameExists {
+			continue
+		}
+
+		id := fmt.Sprintf("%s/%s", secret.Namespace, relName)
+
+		if currLatest, exists := latestMap[id]; exists {
+			// get version
+			currVersionStr, currVersionExists := currLatest.Labels["version"]
+			versionStr, versionExists := secret.Labels["version"]
+
+			if versionExists && currVersionExists {
+				currVersion, currErr := strconv.Atoi(currVersionStr)
+				version, err := strconv.Atoi(versionStr)
+				if currErr != nil && err != nil && currVersion < version {
+					latestMap[id] = secret
+				}
+			}
+		} else {
+			latestMap[id] = secret
+		}
+	}
+
+	chartList := []string{}
+	res := make([]*release.Release, 0)
 
-	return cmd.Run()
+	for _, secret := range latestMap {
+		rel, isErr, err := kubernetes.ParseSecretToHelmRelease(secret, chartList)
+
+		if !isErr && err == nil {
+			res = append(res, rel)
+		}
+	}
+
+	return res, nil
 }
 
 // GetRelease returns the info of a release.

+ 4 - 4
internal/kubernetes/agent.go

@@ -876,7 +876,7 @@ func contains(s []string, str string) bool {
 	return false
 }
 
-func parseSecretToHelmRelease(secret v1.Secret, chartList []string) (*rspb.Release, bool, error) {
+func ParseSecretToHelmRelease(secret v1.Secret, chartList []string) (*rspb.Release, bool, error) {
 	if secret.Type != "helm.sh/release.v1" {
 		return nil, true, nil
 	}
@@ -934,7 +934,7 @@ func (a *Agent) StreamHelmReleases(namespace string, chartList []string, selecto
 					return
 				}
 
-				helm_object, isNotHelmRelease, err := parseSecretToHelmRelease(*secretObj, chartList)
+				helm_object, isNotHelmRelease, err := ParseSecretToHelmRelease(*secretObj, chartList)
 
 				if isNotHelmRelease && err == nil {
 					return
@@ -960,7 +960,7 @@ func (a *Agent) StreamHelmReleases(namespace string, chartList []string, selecto
 					return
 				}
 
-				helm_object, isNotHelmRelease, err := parseSecretToHelmRelease(*secretObj, chartList)
+				helm_object, isNotHelmRelease, err := ParseSecretToHelmRelease(*secretObj, chartList)
 
 				if isNotHelmRelease && err == nil {
 					return
@@ -986,7 +986,7 @@ func (a *Agent) StreamHelmReleases(namespace string, chartList []string, selecto
 					return
 				}
 
-				helm_object, isNotHelmRelease, err := parseSecretToHelmRelease(*secretObj, chartList)
+				helm_object, isNotHelmRelease, err := ParseSecretToHelmRelease(*secretObj, chartList)
 
 				if isNotHelmRelease && err == nil {
 					return