Pārlūkot izejas kodu

Setup values the same way as on the launch flow

jnfrati 3 gadi atpakaļ
vecāks
revīzija
7f6c9842dc

+ 86 - 1
dashboard/src/main/home/cluster-dashboard/stacks/launch/NewApp.tsx

@@ -2,15 +2,20 @@ import Helper from "components/form-components/Helper";
 import InputRow from "components/form-components/InputRow";
 import Loading from "components/Loading";
 import PorterFormWrapper from "components/porter-form/PorterFormWrapper";
+import _ from "lodash";
 import React, { useContext, useEffect, useState } from "react";
 import { useParams } from "react-router";
 import api from "shared/api";
+import { Context } from "shared/Context";
 import { useRouting } from "shared/routing";
 import { ExpandedPorterTemplate } from "shared/types";
 import { StacksLaunchContext } from "./Store";
 
+const DEFAULT_STACK_SOURCE_CONFIG_INDEX = 0;
+
 const NewApp = () => {
   const { addAppResource, newStack } = useContext(StacksLaunchContext);
+  const { currentCluster } = useContext(Context);
 
   const params = useParams<{
     template_name: string;
@@ -69,7 +74,87 @@ const NewApp = () => {
     return <>Unexpected error</>;
   }
 
-  const handleSubmit = (values: any) => {
+  const handleSubmit = async (rawValues: any) => {
+    setSaveButtonStatus("loading");
+
+    // Convert dotted keys to nested objects
+    let values: any = {};
+    for (let key in rawValues) {
+      _.set(values, key, rawValues[key]);
+    }
+
+    const stackSourceConfig =
+      newStack.source_configs[DEFAULT_STACK_SOURCE_CONFIG_INDEX];
+    if (!stackSourceConfig) {
+      return;
+    }
+
+    let url = stackSourceConfig.image_repo_uri;
+    let tag = stackSourceConfig.image_tag;
+
+    if (url?.includes(":")) {
+      let splits = url.split(":");
+      url = splits[0];
+      tag = splits[1];
+    } else if (!tag) {
+      tag = "latest";
+    }
+
+    if (!_.isEmpty(stackSourceConfig.build)) {
+      if (template?.metadata?.name === "job") {
+        url = "public.ecr.aws/o1j4x7p4/hello-porter-job";
+        tag = "latest";
+      } else {
+        url = "public.ecr.aws/o1j4x7p4/hello-porter";
+        tag = "latest";
+      }
+    }
+
+    let provider;
+    switch (currentCluster.service) {
+      case "eks":
+        provider = "aws";
+        break;
+      case "gke":
+        provider = "gcp";
+        break;
+      case "doks":
+        provider = "digitalocean";
+        break;
+      case "aks":
+        provider = "azure";
+        break;
+      case "vke":
+        provider = "vultr";
+        break;
+      default:
+        provider = "";
+    }
+
+    // Check the server URL to see if we can detect the cluster provider.
+    // There's no standard URL format for GCP that's why it's not currently included
+    if (provider === "") {
+      const server = currentCluster.server;
+
+      if (server.includes("eks")) provider = "eks";
+      else if (server.includes("ondigitalocean")) provider = "digitalocean";
+      else if (server.includes("azmk8s")) provider = "azure";
+      else if (server.includes("vultr")) provider = "vultr";
+    }
+
+    // don't overwrite for templates that already have a source (i.e. non-Docker templates)
+    if (url && tag) {
+      _.set(values, "image.repository", url);
+      _.set(values, "image.tag", tag);
+    }
+
+    _.set(values, "ingress.provider", provider);
+
+    // pause jobs automatically
+    if (template?.metadata?.name == "job") {
+      _.set(values, "paused", true);
+    }
+
     if (appName === "") {
       setSaveButtonStatus("App name cannot be empty");
       return;