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

Merge branch '0.5.0-live-update-on-chart-revisions' of https://github.com/porter-dev/porter into 0.5.0-live-update-on-chart-revisions

jusrhee 4 лет назад
Родитель
Сommit
d2ea01a6f4

+ 5 - 2
dashboard/src/main/home/cluster-dashboard/chart/Chart.tsx

@@ -110,7 +110,10 @@ const Chart: React.FunctionComponent<Props> = ({
             margin_left={"17px"}
           />
           <LastDeployed>
-            <Dot>•</Dot> Last deployed {readableDate(chart.info.last_deployed)}
+            <Dot>•</Dot> Last deployed{" "}
+            {readableDate(
+              release?.info?.last_deployed || chart.info.last_deployed
+            )}
           </LastDeployed>
         </InfoWrapper>
 
@@ -120,7 +123,7 @@ const Chart: React.FunctionComponent<Props> = ({
         </TagWrapper>
       </BottomWrapper>
 
-      <Version>v{release?.metadata?.labels?.version || chart.version}</Version>
+      <Version>v{release?.version || chart.version}</Version>
     </StyledChart>
   );
 };

+ 36 - 22
dashboard/src/main/home/cluster-dashboard/chart/ChartList.tsx

@@ -104,26 +104,45 @@ const ChartList: React.FunctionComponent<Props> = ({
     }
   };
 
-  const handleReleaseWSNotification = (object: any) => {
-    if (object.type === "helm.sh/release.v1") {
-      setReleases((oldReleases) => {
-        const currentRelease = oldReleases[object.metadata.labels.name];
-        const currentReleaseVersion = Number(
-          currentRelease?.metadata?.labels?.version
-        );
-        const newReleaseVersion = Number(object?.metadata?.labels?.version);
-        if (currentReleaseVersion > newReleaseVersion) {
+  const setupHelmReleasesWebsocket = () => {
+    const apiPath = `/api/projects/${context.currentProject.id}/k8s/helm_releases?cluster_id=${context.currentCluster.id}`;
+
+    const wsConfig = {
+      onopen: () => {
+        console.log("connected to chart live updates websocket");
+      },
+      onmessage: (evt: MessageEvent) => {
+        let event = JSON.parse(evt.data);
+        const object = event.Object;
+        setReleases((oldReleases) => {
+          const currentRelease = oldReleases[object?.name];
+          const currentReleaseVersion = Number(currentRelease?.version);
+          const newReleaseVersion = Number(object?.version);
+          if (currentReleaseVersion > newReleaseVersion) {
+            return {
+              ...oldReleases,
+            };
+          }
+
           return {
             ...oldReleases,
+            [object.name]: object,
           };
-        }
+        });
+      },
 
-        return {
-          ...oldReleases,
-          [object.metadata.labels.name]: object,
-        };
-      });
-    }
+      onclose: () => {
+        console.log("closing chart live updates websocket");
+      },
+
+      onerror: (err: ErrorEvent) => {
+        console.log(err);
+        closeWebsocket("helm_releases");
+      },
+    };
+
+    newWebsocket("helm_releases", apiPath, wsConfig);
+    openWebsocket("helm_releases");
   };
 
   const setupWebsocket = (kind: string) => {
@@ -139,11 +158,6 @@ const ChartList: React.FunctionComponent<Props> = ({
         let object = event.Object;
         object.metadata.kind = event.Kind;
 
-        if (event.Kind === "secrets") {
-          handleReleaseWSNotification(object);
-          return;
-        }
-
         setControllers((oldControllers) => ({
           ...oldControllers,
           [object.metadata.uid]: object,
@@ -176,8 +190,8 @@ const ChartList: React.FunctionComponent<Props> = ({
       "statefulset",
       "daemonset",
       "replicaset",
-      "secrets",
     ]);
+    setupHelmReleasesWebsocket();
 
     return () => {
       closeAllWebsockets();

+ 30 - 41
internal/kubernetes/agent.go

@@ -561,8 +561,6 @@ func (a *Agent) StreamControllerStatus(conn *websocket.Conn, kind string, select
 		informer = factory.Core().V1().Namespaces().Informer()
 	case "pod":
 		informer = factory.Core().V1().Pods().Informer()
-	case "secrets":
-		informer = factory.Core().V1().Secrets().Informer()
 	}
 
 	stopper := make(chan struct{})
@@ -674,6 +672,30 @@ func contains(s []string, str string) bool {
 	return false
 }
 
+func parseSecretToHelmRelease(secret v1.Secret, chartList []string) (*rspb.Release, bool, error) {
+	if secret.Type != "helm.sh/release.v1" {
+		return nil, true, nil
+	}
+
+	releaseData, ok := secret.Data["release"]
+
+	if !ok {
+		return nil, true, fmt.Errorf("release field not found")
+	}
+
+	helm_object, err := decodeRelease(string(releaseData))
+
+	if err != nil {
+		return nil, true, err
+	}
+
+	if len(chartList) > 0 && !contains(chartList, helm_object.Name) {
+		return nil, true, nil
+	}
+
+	return helm_object, false, nil
+}
+
 func (a *Agent) StreamHelmReleases(conn *websocket.Conn, chartList []string, selectors string) error {
 	tweakListOptionsFunc := func(options *metav1.ListOptions) {
 		options.LabelSelector = selectors
@@ -700,28 +722,17 @@ func (a *Agent) StreamHelmReleases(conn *websocket.Conn, chartList []string, sel
 				return
 			}
 
-			if secretObj.Type != "helm.sh/release.v1" {
-				return
-			}
+			helm_object, isNotHelmRelease, err := parseSecretToHelmRelease(*secretObj, chartList)
 
-			releaseData, ok := secretObj.Data["release"]
-
-			if !ok {
-				errorchan <- fmt.Errorf("release field not found")
+			if isNotHelmRelease && err == nil {
 				return
 			}
 
-			helm_object, err := decodeRelease(string(releaseData))
-
 			if err != nil {
 				errorchan <- err
 				return
 			}
 
-			if len(chartList) > 0 && !contains(chartList, helm_object.Name) {
-				return
-			}
-
 			msg := Message{
 				EventType: "UPDATE",
 				Object:    helm_object,
@@ -735,33 +746,22 @@ func (a *Agent) StreamHelmReleases(conn *websocket.Conn, chartList []string, sel
 		AddFunc: func(obj interface{}) {
 			secretObj, ok := obj.(*v1.Secret)
 
-			if secretObj.Type != "helm.sh/release.v1" {
-				return
-			}
-
 			if !ok {
 				errorchan <- fmt.Errorf("could not cast to secret")
 				return
 			}
 
-			releaseData, ok := secretObj.Data["release"]
+			helm_object, isNotHelmRelease, err := parseSecretToHelmRelease(*secretObj, chartList)
 
-			if !ok {
-				errorchan <- fmt.Errorf("release field not found")
+			if isNotHelmRelease && err == nil {
 				return
 			}
 
-			helm_object, err := decodeRelease(string(releaseData))
-
 			if err != nil {
 				errorchan <- err
 				return
 			}
 
-			if len(chartList) > 0 && !contains(chartList, helm_object.Name) {
-				return
-			}
-
 			msg := Message{
 				EventType: "ADD",
 				Object:    helm_object,
@@ -775,33 +775,22 @@ func (a *Agent) StreamHelmReleases(conn *websocket.Conn, chartList []string, sel
 		DeleteFunc: func(obj interface{}) {
 			secretObj, ok := obj.(*v1.Secret)
 
-			if secretObj.Type != "helm.sh/release.v1" {
-				return
-			}
-
 			if !ok {
 				errorchan <- fmt.Errorf("could not cast to secret")
 				return
 			}
 
-			releaseData, ok := secretObj.Data["release"]
+			helm_object, isNotHelmRelease, err := parseSecretToHelmRelease(*secretObj, chartList)
 
-			if !ok {
-				errorchan <- fmt.Errorf("release field not found")
+			if isNotHelmRelease && err == nil {
 				return
 			}
 
-			helm_object, err := decodeRelease(string(releaseData))
-
 			if err != nil {
 				errorchan <- err
 				return
 			}
 
-			if (len(chartList) > 0) && !contains(chartList, helm_object.Name) {
-				return
-			}
-
 			msg := Message{
 				EventType: "DELETE",
 				Object:    helm_object,