Преглед изворни кода

Merge branch 'beta.3.application-types' into main

sunguroku пре 5 година
родитељ
комит
7896569036

+ 2 - 10
dashboard/src/components/StatusIndicator.tsx

@@ -33,14 +33,6 @@ export default class StatusIndicator extends Component<PropsType, StateType> {
       for (var uid in this.props.controllers) {
         let value = this.props.controllers[uid];
         let available = this.getAvailability(value.metadata.kind, value);
-
-        if (
-          value.metadata.kind?.toLowerCase() === "job" &&
-          !value.status?.active
-        ) {
-          return "completed";
-        }
-
         let progressing = true;
 
         this.props.controllers[uid]?.status?.conditions?.forEach(
@@ -75,8 +67,8 @@ export default class StatusIndicator extends Component<PropsType, StateType> {
         return c.status.readyReplicas == c.status.replicas;
       case "daemonset":
         return c.status.numberAvailable == c.status.desiredNumberScheduled;
-      case "job":
-        return c.status.active;
+      case "cronjob":
+        return 1
     }
   };
 

+ 7 - 14
dashboard/src/main/home/cluster-dashboard/expanded-chart/ExpandedChart.tsx

@@ -107,6 +107,7 @@ export default class ExpandedChart extends Component<PropsType, StateType> {
 
     // don't retrieve controllers for chart that failed to even deploy.
     if (chart.info.status == "failed") return;
+
     // TODO: properly promisify
     await new Promise((next: (res?: any) => void) => {
       api
@@ -288,14 +289,16 @@ export default class ExpandedChart extends Component<PropsType, StateType> {
       case "metrics":
         return <MetricsSection currentChart={chart} />;
       case "status":
-        let controller_uid = Object.keys(this.state.controllers)[0];
+        let activeJobs = Object.values(this.state.controllers)[0]?.status.active;
+        let selectors = activeJobs?.map((job: any) => {
+          return `job-name=${job.name},controller-uid=${job.uid}`
+        })
+
         if (chart.chart.metadata.name == "job") {
           return (
             <StatusSection
               currentChart={chart}
-              selectors={[
-                `job-name=${chart.name}-job,controller-uid=${controller_uid}`,
-              ]}
+              selectors={selectors}
             />
           );
         }
@@ -458,14 +461,6 @@ export default class ExpandedChart extends Component<PropsType, StateType> {
       for (var uid in this.state.controllers) {
         let value = this.state.controllers[uid];
         let available = this.getAvailability(value.metadata.kind, value);
-
-        if (
-          value.metadata.kind?.toLowerCase() == "job" &&
-          !value.status?.active
-        ) {
-          return "completed";
-        }
-
         let progressing = true;
 
         this.state.controllers[uid]?.status?.conditions?.forEach(
@@ -500,8 +495,6 @@ export default class ExpandedChart extends Component<PropsType, StateType> {
         return c.status.readyReplicas == c.status.replicas;
       case "daemonset":
         return c.status.numberAvailable == c.status.desiredNumberScheduled;
-      case "job":
-        return c.status.active;
     }
   };
 

+ 7 - 14
dashboard/src/main/home/cluster-dashboard/expanded-chart/status/ControllerTab.tsx

@@ -47,7 +47,7 @@ export default class ControllerTab extends Component<PropsType, StateType> {
     }
     selectors.push(selector);
 
-    if (selectors.length == 0 && this.props.selectors) {
+    if (controller.kind.toLowerCase() == "job" && this.props.selectors) {
       selectors = this.props.selectors;
     }
 
@@ -111,7 +111,8 @@ export default class ControllerTab extends Component<PropsType, StateType> {
           c.status?.desiredNumberScheduled || 0,
         ];
       case "job":
-        return [1, 1];
+        console.log(c)
+        return [1, 1]
     }
   };
 
@@ -121,7 +122,6 @@ export default class ControllerTab extends Component<PropsType, StateType> {
       status?.containerStatuses !== undefined
     ) {
       return status.containerStatuses[0].state.waiting.reason;
-      // return 'waiting'
     } else if (status?.phase === "Pending") {
       return "Pending";
     }
@@ -155,28 +155,21 @@ export default class ControllerTab extends Component<PropsType, StateType> {
     let [available, total] = this.getAvailability(controller.kind, controller);
     let status = available == total ? "running" : "waiting";
 
-    if (controller.kind?.toLowerCase() == "job" && !controller.status.active) {
-      status = "completed";
+    if (controller.kind.toLowerCase() === "job" && this.state.raw.length == 0) {
+      status = "completed" 
     }
 
-    console.log("STATUS", status);
-
     return (
       <ResourceTab
         label={controller.kind}
-        name={controller.metadata.name}
+        // handle CronJob case
+        name={controller.metadata?.name || controller.name}
         status={{ label: status, available, total }}
         isLast={isLast}
         expanded={isFirst}
       >
         {this.state.raw.map((pod, i) => {
           let status = this.getPodStatus(pod.status);
-          if (
-            controller.kind?.toLowerCase() == "job" &&
-            !controller.status.active
-          ) {
-            status = "completed";
-          }
           return (
             <Tab
               key={pod.metadata?.name}

+ 17 - 6
dashboard/src/main/home/cluster-dashboard/expanded-chart/status/StatusSection.tsx

@@ -53,12 +53,13 @@ export default class StatusSection extends Component<PropsType, StateType> {
     return this.state.controllers.map((c, i) => {
       return (
         <ControllerTab
-          key={c.metadata.uid}
+          // handle CronJob case
+          key={c.metadata?.uid || c.uid}
           selectedPod={this.state.selectedPod}
           selectPod={this.selectPod.bind(this)}
-          selectors={this.props.selectors}
+          selectors={this.props.selectors ? [this.props.selectors[i]] : null}
           controller={c}
-          isLast={i === this.state.controllers.length - 1}
+          isLast={i === this.state.controllers?.length - 1}
           isFirst={i === 0}
           setPodError={(x: string) => this.setState({ podError: x })}
         />
@@ -74,7 +75,7 @@ export default class StatusSection extends Component<PropsType, StateType> {
         </NoControllers>
       );
     }
-    if (this.state.controllers.length > 0) {
+    if (this.state.controllers?.length > 0) {
       return (
         <Wrapper>
           <TabWrapper>{this.renderTabs()}</TabWrapper>
@@ -83,6 +84,15 @@ export default class StatusSection extends Component<PropsType, StateType> {
       );
     }
 
+    if (this.props.currentChart.chart.metadata.name === "job") {
+      return (
+        <NoControllers>
+          <i className="material-icons">category</i>
+          There are no jobs currently running.
+        </NoControllers>
+      );
+    }
+
     return (
       <NoControllers>
         <i className="material-icons">category</i>
@@ -110,8 +120,9 @@ export default class StatusSection extends Component<PropsType, StateType> {
           revision: currentChart.version,
         }
       )
-      .then((res) => {
-        this.setState({ controllers: res.data, loading: false });
+      .then((res : any) => {
+        let controllers = currentChart.chart.metadata.name == "job" ? res.data[0]?.status.active : res.data
+        this.setState({controllers, loading: false})
       })
       .catch((err) => {
         setCurrentError(JSON.stringify(err));

+ 1 - 1
internal/helm/grapher/object.go

@@ -67,7 +67,7 @@ func ParseControllers(objs []map[string]interface{}) []Object {
 
 		switch kind.(string) {
 		// Parse for all possible controller types
-		case "Deployment", "StatefulSet", "ReplicaSet", "DaemonSet", "Job":
+		case "Deployment", "StatefulSet", "ReplicaSet", "DaemonSet", "Job", "CronJob":
 			name := getField(obj, "metadata", "name")
 			namespace := getField(obj, "metadata", "namespace")
 

+ 10 - 0
internal/kubernetes/agent.go

@@ -28,6 +28,7 @@ import (
 	"github.com/porter-dev/porter/internal/helm/grapher"
 	appsv1 "k8s.io/api/apps/v1"
 	batchv1 "k8s.io/api/batch/v1"
+	batchv1beta1 "k8s.io/api/batch/v1beta1"
 	v1 "k8s.io/api/core/v1"
 	v1beta1 "k8s.io/api/extensions/v1beta1"
 	"k8s.io/apimachinery/pkg/api/errors"
@@ -119,6 +120,15 @@ func (a *Agent) GetJob(c grapher.Object) (*batchv1.Job, error) {
 	)
 }
 
+// GetCronJob gets the CronJob by name and namespace
+func (a *Agent) GetCronJob(c grapher.Object) (*batchv1beta1.CronJob, error) {
+	return a.Clientset.BatchV1beta1().CronJobs(c.Namespace).Get(
+		context.TODO(),
+		c.Name,
+		metav1.GetOptions{},
+	)
+}
+
 // GetPodsByLabel retrieves pods with matching labels
 func (a *Agent) GetPodsByLabel(selector string) (*v1.PodList, error) {
 	// Search in all namespaces for matching pods

+ 0 - 0
internal/repository/gorm/porter_list_clusters.db-journal


+ 2 - 2
server/api/release_handler.go

@@ -371,8 +371,8 @@ func (app *App) HandleGetReleaseControllers(w http.ResponseWriter, r *http.Reque
 
 			rc.Kind = c.Kind
 			retrievedControllers = append(retrievedControllers, rc)
-		case "Job":
-			rc, err := k8sAgent.GetJob(c)
+		case "CronJob":
+			rc, err := k8sAgent.GetCronJob(c)
 
 			if err != nil {
 				app.handleErrorDataRead(err, w)