Explorar o código

clean up service types and tweak logs (#3078)

Feroze Mohideen %!s(int64=3) %!d(string=hai) anos
pai
achega
45d28e86bd

+ 35 - 31
dashboard/src/main/home/app-dashboard/expanded-app/ExpandedApp.tsx

@@ -346,15 +346,19 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
               fileData.includes("Run porter-dev/porter-cli-action@v0.1.0")
             ) {
               const lines = fileData.split("\n");
+              const timestampPattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+Z/;
 
               lines.forEach((line, index) => {
-                const anserLine: AnserJsonEntry[] = Anser.ansiToJson(line);
+                const lineWithoutTimestamp = line.replace(timestampPattern, "").trimStart();
+                const anserLine: AnserJsonEntry[] = Anser.ansiToJson(lineWithoutTimestamp);
+                if (lineWithoutTimestamp.toLowerCase().includes("error")) {
+                  anserLine[0].fg = "238,75,43";
+                }
+
                 const log: Log = {
                   line: anserLine,
                   lineNumber: index + 1,
-                  timestamp: line.match(
-                    /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d+Z/
-                  )?.[0],
+                  timestamp: line.match(timestampPattern)?.[0],
                 };
 
                 logs.push(log);
@@ -986,7 +990,7 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
                     shouldUpdate={
                       appData.chart.latest_version &&
                       appData.chart.latest_version !==
-                        appData.chart.chart.metadata.version
+                      appData.chart.chart.metadata.version
                     }
                     latestVersion={appData.chart.latest_version}
                     upgradeVersion={appUpgradeVersion}
@@ -1000,32 +1004,6 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
                   appData.app.git_repo_id
                     ? hasBuiltImage
                       ? [
-                          { label: "Overview", value: "overview" },
-                          { label: "Activity", value: "activity" },
-                          { label: "Events", value: "events" },
-                          { label: "Logs", value: "logs" },
-                          { label: "Metrics", value: "metrics" },
-                          { label: "Debug", value: "status" },
-                          { label: "Pre-deploy", value: "pre-deploy" },
-                          {
-                            label: "Environment",
-                            value: "environment-variables",
-                          },
-                          { label: "Build settings", value: "build-settings" },
-                          { label: "Settings", value: "settings" },
-                        ]
-                      : [
-                          { label: "Overview", value: "overview" },
-                          { label: "Activity", value: "activity" },
-                          { label: "Pre-deploy", value: "pre-deploy" },
-                          {
-                            label: "Environment",
-                            value: "environment-variables",
-                          },
-                          { label: "Build settings", value: "build-settings" },
-                          { label: "Settings", value: "settings" },
-                        ]
-                    : [
                         { label: "Overview", value: "overview" },
                         { label: "Activity", value: "activity" },
                         { label: "Events", value: "events" },
@@ -1037,8 +1015,34 @@ const ExpandedApp: React.FC<Props> = ({ ...props }) => {
                           label: "Environment",
                           value: "environment-variables",
                         },
+                        { label: "Build settings", value: "build-settings" },
                         { label: "Settings", value: "settings" },
                       ]
+                      : [
+                        { label: "Overview", value: "overview" },
+                        { label: "Activity", value: "activity" },
+                        { label: "Pre-deploy", value: "pre-deploy" },
+                        {
+                          label: "Environment",
+                          value: "environment-variables",
+                        },
+                        { label: "Build settings", value: "build-settings" },
+                        { label: "Settings", value: "settings" },
+                      ]
+                    : [
+                      { label: "Overview", value: "overview" },
+                      { label: "Activity", value: "activity" },
+                      { label: "Events", value: "events" },
+                      { label: "Logs", value: "logs" },
+                      { label: "Metrics", value: "metrics" },
+                      { label: "Debug", value: "status" },
+                      { label: "Pre-deploy", value: "pre-deploy" },
+                      {
+                        label: "Environment",
+                        value: "environment-variables",
+                      },
+                      { label: "Settings", value: "settings" },
+                    ]
                 }
                 currentTab={tab}
                 setCurrentTab={(tab: string) => {

+ 1 - 1
dashboard/src/main/home/app-dashboard/expanded-app/status/GHALogsModal.tsx

@@ -158,7 +158,7 @@ const LogSpan = styled.div`
   font-family: monospace;
   user-select: text;
   display: flex;
-  align-items: flex-end;
+  align-items: flex-start;
   gap: 8px;
   width: 100%;
   & > * {

+ 446 - 465
dashboard/src/main/home/app-dashboard/new-app-flow/WebTabs.tsx

@@ -12,10 +12,15 @@ import ExpandableSection from "components/porter/ExpandableSection";
 interface Props {
   service: WebService;
   editService: (service: WebService) => void;
-  setHeight: (height: h) => void;
+  setHeight: (height: Height) => void;
   hasFooter?: boolean;
 }
 
+const RESOURCE_HEIGHT_WITHOUT_AUTOSCALING = 373;
+const RESOURCE_HEIGHT_WITH_AUTOSCALING = 713;
+const ADVANCED_BASE_HEIGHT = 300;
+const PROBE_INPUTS_HEIGHT = 230;
+
 const WebTabs: React.FC<Props> = ({
   service,
   editService,
@@ -153,461 +158,471 @@ const WebTabs: React.FC<Props> = ({
                 },
               },
             });
+            setHeight(service.autoscaling.enabled.value ? RESOURCE_HEIGHT_WITHOUT_AUTOSCALING : RESOURCE_HEIGHT_WITH_AUTOSCALING);
           }}
           disabled={service.autoscaling.enabled.readOnly}
           disabledTooltip={"You may only edit this field in your porter.yaml."}
         >
           <Text color="helper">Enable autoscaling (overrides replicas)</Text>
         </Checkbox>
+        <AnimateHeight height={service.autoscaling.enabled.value ? 'auto' : 0}>
+          <Spacer y={1} />
+          <Input
+            label="Min replicas"
+            placeholder="ex: 1"
+            value={service.autoscaling.minReplicas.value}
+            disabled={
+              service.autoscaling.minReplicas.readOnly ||
+              !service.autoscaling.enabled.value
+            }
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                autoscaling: {
+                  ...service.autoscaling,
+                  minReplicas: { readOnly: false, value: e },
+                },
+              });
+            }}
+            disabledTooltip={
+              service.autoscaling.minReplicas.readOnly
+                ? "You may only edit this field in your porter.yaml."
+                : "Enable autoscaling to specify min replicas."
+            }
+          />
+          <Spacer y={1} />
+          <Input
+            label="Max replicas"
+            placeholder="ex: 10"
+            value={service.autoscaling.maxReplicas.value}
+            disabled={
+              service.autoscaling.maxReplicas.readOnly ||
+              !service.autoscaling.enabled.value
+            }
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                autoscaling: {
+                  ...service.autoscaling,
+                  maxReplicas: { readOnly: false, value: e },
+                },
+              });
+            }}
+            disabledTooltip={
+              service.autoscaling.maxReplicas.readOnly
+                ? "You may only edit this field in your porter.yaml."
+                : "Enable autoscaling to specify max replicas."
+            }
+          />
+          <Spacer y={1} />
+          <Input
+            label="Target CPU utilization (%)"
+            placeholder="ex: 50"
+            value={service.autoscaling.targetCPUUtilizationPercentage.value}
+            disabled={
+              service.autoscaling.targetCPUUtilizationPercentage.readOnly ||
+              !service.autoscaling.enabled.value
+            }
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                autoscaling: {
+                  ...service.autoscaling,
+                  targetCPUUtilizationPercentage: { readOnly: false, value: e },
+                },
+              });
+            }}
+            disabledTooltip={
+              service.autoscaling.targetCPUUtilizationPercentage.readOnly
+                ? "You may only edit this field in your porter.yaml."
+                : "Enable autoscaling to specify target CPU utilization."
+            }
+          />
+          <Spacer y={1} />
+          <Input
+            label="Target RAM utilization (%)"
+            placeholder="ex: 50"
+            value={service.autoscaling.targetMemoryUtilizationPercentage.value}
+            disabled={
+              service.autoscaling.targetMemoryUtilizationPercentage.readOnly ||
+              !service.autoscaling.enabled.value
+            }
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                autoscaling: {
+                  ...service.autoscaling,
+                  targetMemoryUtilizationPercentage: {
+                    readOnly: false,
+                    value: e,
+                  },
+                },
+              });
+            }}
+            disabledTooltip={
+              service.autoscaling.targetMemoryUtilizationPercentage.readOnly
+                ? "You may only edit this field in your porter.yaml."
+                : "Enable autoscaling to specify target RAM utilization."
+            }
+          />
+        </AnimateHeight>
+      </>
+    );
+  };
+
+  const calculateHealthHeight = () => {
+    let height = ADVANCED_BASE_HEIGHT;
+    if (service.health.livenessProbe.enabled.value) {
+      height += PROBE_INPUTS_HEIGHT;
+    }
+    if (service.health.startupProbe.enabled.value) {
+      height += PROBE_INPUTS_HEIGHT;
+    }
+    if (service.health.readinessProbe.enabled.value) {
+      height += PROBE_INPUTS_HEIGHT;
+    }
+    return height;
+  };
+  const renderHealth = () => {
+    return (
+      <>
         <Spacer y={1} />
-        <Input
-          label="Min replicas"
-          placeholder="ex: 1"
-          value={service.autoscaling.minReplicas.value}
-          disabled={
-            service.autoscaling.minReplicas.readOnly ||
-            !service.autoscaling.enabled.value
-          }
-          width="300px"
-          setValue={(e) => {
-            editService({
-              ...service,
-              autoscaling: {
-                ...service.autoscaling,
-                minReplicas: { readOnly: false, value: e },
-              },
-            });
-          }}
-          disabledTooltip={
-            service.autoscaling.minReplicas.readOnly
-              ? "You may only edit this field in your porter.yaml."
-              : "Enable autoscaling to specify min replicas."
-          }
-        />
-        <Spacer y={1} />
-        <Input
-          label="Max replicas"
-          placeholder="ex: 10"
-          value={service.autoscaling.maxReplicas.value}
-          disabled={
-            service.autoscaling.maxReplicas.readOnly ||
-            !service.autoscaling.enabled.value
-          }
-          width="300px"
-          setValue={(e) => {
+        <Text color="helper">
+          <>
+            <span>Health checks</span>
+            <a
+              href="https://docs.porter.run/enterprise/deploying-applications/zero-downtime-deployments#health-checks"
+              target="_blank"
+            >
+              &nbsp;(?)
+            </a>
+          </>
+        </Text>
+        <Spacer y={0.5} />
+        <Checkbox
+          checked={service.health.livenessProbe.enabled.value}
+          toggleChecked={() => {
             editService({
               ...service,
-              autoscaling: {
-                ...service.autoscaling,
-                maxReplicas: { readOnly: false, value: e },
+              health: {
+                ...service.health,
+                livenessProbe: {
+                  ...service.health.livenessProbe,
+                  enabled: {
+                    readOnly: false,
+                    value: !service.health.livenessProbe.enabled.value,
+                  },
+                },
               },
             });
+            setHeight(calculateHealthHeight() + (service.health.livenessProbe.enabled.value ? -PROBE_INPUTS_HEIGHT : PROBE_INPUTS_HEIGHT));
           }}
-          disabledTooltip={
-            service.autoscaling.maxReplicas.readOnly
-              ? "You may only edit this field in your porter.yaml."
-              : "Enable autoscaling to specify max replicas."
-          }
-        />
-        <Spacer y={1} />
-        <Input
-          label="Target CPU utilization (%)"
-          placeholder="ex: 50"
-          value={service.autoscaling.targetCPUUtilizationPercentage.value}
-          disabled={
-            service.autoscaling.targetCPUUtilizationPercentage.readOnly ||
-            !service.autoscaling.enabled.value
-          }
-          width="300px"
-          setValue={(e) => {
+          disabled={service.health.livenessProbe.enabled.readOnly}
+          disabledTooltip={"You may only edit this field in your porter.yaml."}
+        >
+          <Text color="helper">Enable Liveness Probe</Text>
+        </Checkbox>
+        <AnimateHeight height={service.health.livenessProbe.enabled.value ? 'auto' : 0}>
+          <Spacer y={0.5} />
+          <Input
+            label="Liveness Check Endpoint "
+            placeholder="ex: 80"
+            value={service.health.livenessProbe.path.value}
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  livenessProbe: {
+                    ...service.health.livenessProbe,
+                    path: {
+                      readOnly: false,
+                      value: e,
+                    },
+                  },
+                },
+              });
+            }}
+            disabled={service.health.livenessProbe.path.readOnly}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+          <Input
+            label="Failure Threshold"
+            placeholder="ex: 80"
+            value={service.health.livenessProbe.failureThreshold.value}
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  livenessProbe: {
+                    ...service.health.livenessProbe,
+                    failureThreshold: {
+                      readOnly: false,
+                      value: e,
+                    },
+                  },
+                },
+              });
+            }}
+            disabled={
+              service.health.livenessProbe.failureThreshold.readOnly
+            }
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+          <Input
+            label="Retry Interval"
+            placeholder="ex: 80"
+            value={service.health.livenessProbe.periodSeconds.value}
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  livenessProbe: {
+                    ...service.health.livenessProbe,
+                    periodSeconds: {
+                      readOnly: false,
+                      value: e,
+                    },
+                  },
+                },
+              });
+            }}
+            disabled={service.health.livenessProbe.periodSeconds.readOnly}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+        </AnimateHeight>
+        <Spacer y={0.5} />
+        <Checkbox
+          checked={service.health.startupProbe.enabled.value}
+          toggleChecked={() => {
             editService({
               ...service,
-              autoscaling: {
-                ...service.autoscaling,
-                targetCPUUtilizationPercentage: { readOnly: false, value: e },
+              health: {
+                ...service.health,
+                startupProbe: {
+                  ...service.health.startupProbe,
+                  enabled: {
+                    readOnly: false,
+                    value: !service.health.startupProbe.enabled.value,
+                  },
+                },
               },
             });
+            setHeight(calculateHealthHeight() + (service.health.startupProbe.enabled.value ? -PROBE_INPUTS_HEIGHT : PROBE_INPUTS_HEIGHT));
           }}
-          disabledTooltip={
-            service.autoscaling.targetCPUUtilizationPercentage.readOnly
-              ? "You may only edit this field in your porter.yaml."
-              : "Enable autoscaling to specify target CPU utilization."
-          }
-        />
-        <Spacer y={1} />
-        <Input
-          label="Target RAM utilization (%)"
-          placeholder="ex: 50"
-          value={service.autoscaling.targetMemoryUtilizationPercentage.value}
-          disabled={
-            service.autoscaling.targetMemoryUtilizationPercentage.readOnly ||
-            !service.autoscaling.enabled.value
-          }
-          width="300px"
-          setValue={(e) => {
+          disabled={service.health.startupProbe.enabled.readOnly}
+          disabledTooltip={"You may only edit this field in your porter.yaml."}
+        >
+          <Text color="helper">Enable Start Up Probe</Text>
+        </Checkbox>
+        <AnimateHeight height={service.health.startupProbe.enabled.value ? 'auto' : 0}>
+          <Spacer y={0.5} />
+          <Input
+            label="Start Up Check Endpoint "
+            placeholder="ex: 80"
+            value={service.health.startupProbe.path.value}
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  startupProbe: {
+                    ...service.health.startupProbe,
+                    path: {
+                      readOnly: false,
+                      value: e,
+                    },
+                  },
+                },
+              });
+            }}
+            disabled={service.health.startupProbe.path.readOnly}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+          <Input
+            label="Failure Threshold"
+            placeholder="ex: 80"
+            value={service.health.startupProbe.failureThreshold.value}
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  startupProbe: {
+                    ...service.health.startupProbe,
+                    failureThreshold: {
+                      readOnly: false,
+                      value: e,
+                    },
+                  },
+                },
+              });
+            }}
+            disabled={service.health.startupProbe.failureThreshold.readOnly}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+          <Input
+            label="Retry Interval"
+            placeholder="ex: 80"
+            value={service.health.startupProbe.periodSeconds.value}
+            disabled={service.health.startupProbe.periodSeconds.readOnly}
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  startupProbe: {
+                    ...service.health.startupProbe,
+                    periodSeconds: {
+                      readOnly: false,
+                      value: e,
+                    },
+                  },
+                },
+              });
+            }}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+        </AnimateHeight>
+        <Spacer y={0.5} />
+        <Checkbox
+          checked={service.health.readinessProbe.enabled.value}
+          toggleChecked={() => {
             editService({
               ...service,
-              autoscaling: {
-                ...service.autoscaling,
-                targetMemoryUtilizationPercentage: {
-                  readOnly: false,
-                  value: e,
+              health: {
+                ...service.health,
+                readinessProbe: {
+                  ...service.health.readinessProbe,
+                  enabled: {
+                    readOnly: false,
+                    value: !service.health.readinessProbe.enabled.value,
+                  },
                 },
               },
             });
+            setHeight(calculateHealthHeight() + (service.health.readinessProbe.enabled.value ? -PROBE_INPUTS_HEIGHT : PROBE_INPUTS_HEIGHT));
           }}
-          disabledTooltip={
-            service.autoscaling.targetMemoryUtilizationPercentage.readOnly
-              ? "You may only edit this field in your porter.yaml."
-              : "Enable autoscaling to specify target RAM utilization."
-          }
-        />
-      </>
-    );
-  };
-
-  const renderHealth = () => {
-    return (
-      <>
-        <Spacer y={1} />
-        <>
-          <Text size={16}> Configure Liveness Probe settings</Text>
-
-          <PaddingContainer>
-            <Spacer y={1} />
-            <Checkbox
-              checked={service.health.livenessProbe?.enabled.value}
-              toggleChecked={() => {
-                editService({
-                  ...service,
-                  health: {
-                    ...service.health,
-                    livenessProbe: {
-                      ...service.health.livenessProbe,
-                      enabled: {
-                        readOnly: false,
-                        value: !service.health.livenessProbe?.enabled.value,
-                      },
+          disabled={service.health.readinessProbe.enabled.readOnly}
+          disabledTooltip={"You may only edit this field in your porter.yaml."}
+        >
+          <Text color="helper">Enable Readiness Probe</Text>
+        </Checkbox>
+        <AnimateHeight height={service.health.readinessProbe?.enabled.value ? 'auto' : 0}>
+          <Spacer y={0.5} />
+          <Input
+            label="Readiness Check Endpoint "
+            placeholder="ex: 80"
+            value={service.health.readinessProbe.path.value}
+            disabled={service.health.readinessProbe.path.readOnly}
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  readinessProbe: {
+                    ...service.health.readinessProbe,
+                    path: {
+                      readOnly: false,
+                      value: e,
                     },
                   },
-                });
-              }}
-            >
-              <Text color="helper">Enable Liveness Probe</Text>
-            </Checkbox>
-            <Spacer y={1} />
-
-            <>
-              <Input
-                label="Liveness Check Endpoint "
-                placeholder="ex: 80"
-                value={service.health.livenessProbe.path.value}
-                disabled={service.health.livenessProbe.path.readOnly}
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      livenessProbe: {
-                        ...service.health.livenessProbe,
-                        path: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-              <Spacer y={1} />
-              <Input
-                label="Failure Threshold"
-                placeholder="ex: 80"
-                value={service.health.livenessProbe.failureThreshold.value}
-                disabled={
-                  service.health.livenessProbe.failureThreshold.readOnly
-                }
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      livenessProbe: {
-                        ...service.health.livenessProbe,
-                        failureThreshold: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-              <Spacer y={1} />
-              <Input
-                label="Retry Interval"
-                placeholder="ex: 80"
-                value={service.health.livenessProbe.periodSeconds.value}
-                disabled={service.health.livenessProbe.periodSeconds.readOnly}
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      livenessProbe: {
-                        ...service.health.livenessProbe,
-                        periodSeconds: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-            </>
-          </PaddingContainer>
-        </>
-        <Spacer y={1} />
-        <>
-          <Text size={16}> Configure Start Up Probe settings</Text>
-
-          <PaddingContainer>
-            <Spacer y={1} />
-            <Checkbox
-              checked={service.health.startupProbe?.enabled.value}
-              toggleChecked={() => {
-                editService({
-                  ...service,
-                  health: {
-                    ...service.health,
-                    startupProbe: {
-                      ...service.health.startupProbe,
-                      enabled: {
-                        readOnly: false,
-                        value: !service.health.startupProbe?.enabled.value,
-                      },
+                },
+              });
+            }}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+          <Input
+            label="Failure Threshold"
+            placeholder="ex: 80"
+            value={service.health.readinessProbe.failureThreshold.value}
+            disabled={
+              service.health.readinessProbe.failureThreshold.readOnly
+            }
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  readinessProbe: {
+                    ...service.health.readinessProbe,
+                    failureThreshold: {
+                      readOnly: false,
+                      value: e,
                     },
                   },
-                });
-              }}
-              //disabled={service.autoscaling.enabled.readOnly}
-              //disabledTooltip={"You may only edit this field in your porter.yaml."}
-            >
-              <Text color="helper">Enable Start Up Probe</Text>
-            </Checkbox>
-            <Spacer y={1} />
-
-            <>
-              <Input
-                label="Start Up Check Endpoint "
-                placeholder="ex: 80"
-                value={service.health.startupProbe.path.value}
-                disabled={service.health.startupProbe.path.readOnly}
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      startupProbe: {
-                        ...service.health.startupProbe,
-                        path: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-              <Spacer y={1} />
-
-              <Input
-                label="Failure Threshold"
-                placeholder="ex: 80"
-                value={service.health.startupProbe.failureThreshold.value}
-                disabled={service.health.startupProbe.failureThreshold.readOnly}
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      startupProbe: {
-                        ...service.health.startupProbe,
-                        failureThreshold: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-              <Spacer y={1} />
-              <Input
-                label="Retry Interval"
-                placeholder="ex: 80"
-                value={service.health.startupProbe.periodSeconds.value}
-                disabled={service.health.startupProbe.periodSeconds.readOnly}
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      startupProbe: {
-                        ...service.health.startupProbe,
-                        periodSeconds: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-            </>
-          </PaddingContainer>
-        </>
-        <Spacer y={1} />
-        <>
-          <Text size={16}> Configure Readiness Probe settings</Text>
-          <PaddingContainer>
-            <Spacer y={1} />
-            <Checkbox
-              checked={service.health.readinessProbe?.enabled.value}
-              toggleChecked={() => {
-                editService({
-                  ...service,
-                  health: {
-                    ...service.health,
-                    readinessProbe: {
-                      ...service.health.readinessProbe,
-                      enabled: {
-                        readOnly: false,
-                        value: !service.health.readinessProbe?.enabled.value,
-                      },
+                },
+              });
+            }}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+          <Input
+            label="Initial Delay Threshold"
+            placeholder="ex: 80"
+            value={service.health.readinessProbe.initialDelaySeconds.value}
+            disabled={
+              service.health.readinessProbe.initialDelaySeconds.readOnly
+            }
+            width="300px"
+            setValue={(e) => {
+              editService({
+                ...service,
+                health: {
+                  ...service.health,
+                  readinessProbe: {
+                    ...service.health.readinessProbe,
+                    initialDelaySeconds: {
+                      readOnly: false,
+                      value: e,
                     },
                   },
-                });
-              }}
-              //disabled={service.autoscaling.enabled.readOnly}
-              //disabledTooltip={"You may only edit this field in your porter.yaml."}
-            >
-              <Text color="helper">Enable Readiness Probe</Text>
-            </Checkbox>
-            <Spacer y={1} />
-
-            <>
-              <Input
-                label="Readiness Check Endpoint "
-                placeholder="ex: 80"
-                value={service.health.readinessProbe.path.value}
-                disabled={service.health.readinessProbe.path.readOnly}
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      readinessProbe: {
-                        ...service.health.readinessProbe,
-                        path: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-              <Spacer y={0.5} />
-
-              <Input
-                label="Failure Threshold"
-                placeholder="ex: 80"
-                value={service.health.readinessProbe.failureThreshold.value}
-                disabled={
-                  service.health.readinessProbe.failureThreshold.readOnly
-                }
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      readinessProbe: {
-                        ...service.health.readinessProbe,
-                        failureThreshold: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-              <Spacer y={0.5} />
-
-              <Input
-                label="Initial Delay Threshold"
-                placeholder="ex: 80"
-                value={service.health.readinessProbe.initialDelaySeconds.value}
-                disabled={
-                  service.health.readinessProbe.initialDelaySeconds.readOnly
-                }
-                width="300px"
-                setValue={(e) => {
-                  editService({
-                    ...service,
-                    health: {
-                      ...service.health,
-                      readinessProbe: {
-                        ...service.health.readinessProbe,
-                        initialDelaySeconds: {
-                          readOnly: false,
-                          value: e,
-                        },
-                      },
-                    },
-                  });
-                }}
-                disabledTooltip={
-                  "You may only edit this field in your porter.yaml."
-                }
-              />
-            </>
-          </PaddingContainer>
-        </>
+                },
+              });
+            }}
+            disabledTooltip={
+              "You may only edit this field in your porter.yaml."
+            }
+          />
+          <Spacer y={0.5} />
+        </AnimateHeight>
       </>
     );
   };
@@ -622,7 +637,7 @@ const WebTabs: React.FC<Props> = ({
               <>
                 <span>Custom domain</span>
                 <a
-                  href="https://docs.porter.run/deploying-applications/https-and-domains/custom-domains"
+                  href="https://docs.porter.run/standard/deploying-applications/https-and-domains/custom-domains"
                   target="_blank"
                 >
                   &nbsp;(?)
@@ -665,9 +680,10 @@ const WebTabs: React.FC<Props> = ({
             if (value === "main") {
               setHeight(288);
             } else if (value === "resources") {
-              setHeight(713);
+              // extremely hacky
+              service.autoscaling.enabled.value ? setHeight(RESOURCE_HEIGHT_WITH_AUTOSCALING) : setHeight(RESOURCE_HEIGHT_WITHOUT_AUTOSCALING);
             } else if (value === "advanced") {
-              setHeight(1179);
+              setHeight(calculateHealthHeight());
             }
             setCurrentTab(value);
           }}
@@ -681,38 +697,3 @@ const WebTabs: React.FC<Props> = ({
 };
 
 export default WebTabs;
-
-const ScrollableDiv = styled.div`
-  overflow-y: auto;
-  padding: 0 25px;
-  width: calc(100% + 50px);
-  margin-left: -25px;
-  max-height: 400px;
-`;
-const Footer = styled.div`
-  position: relative;
-  width: calc(100% + 50px);
-  margin-left: -25px;
-  padding: 0 25px;
-  background: ${({ theme }) => theme.fg};
-  margin-bottom: -30px;
-  padding-bottom: 30px;
-`;
-
-const Shade = styled.div`
-  position: absolute;
-
-  top: -15px;
-  left: 0;
-  height: 50px;
-  width: 100%;
-  background: linear-gradient(to bottom, #00000000, ${({ theme }) => theme.fg});
-`;
-const StyledAnimateHeight = styled(AnimateHeight)`
-  & > * {
-    padding-left: 5px;
-  }
-`;
-const PaddingContainer = styled.div`
-  padding-left: 15px;
-`;

+ 42 - 175
dashboard/src/main/home/app-dashboard/new-app-flow/serviceTypes.ts

@@ -19,7 +19,6 @@ type Ingress = {
     hosts: ServiceString;
     porterHosts: ServiceString;
 }
-
 type Autoscaling = {
     enabled: ServiceBoolean,
     minReplicas: ServiceString,
@@ -27,58 +26,28 @@ type Autoscaling = {
     targetCPUUtilizationPercentage: ServiceString,
     targetMemoryUtilizationPercentage: ServiceString,
 }
-
-type livenessCommand = {
-    command: ServiceString,
+type LivenessProbe = {
     enabled: ServiceBoolean,
     failureThreshold: ServiceString,
-    initialDelaySeconds: ServiceString,
-    periodSeconds: ServiceString,
-    successThreshold: ServiceString,
-    timeoutSeconds: ServiceString,
-}
-type Auth ={
-    enabled: ServiceBoolean,
-    password: ServiceString,
-    username: ServiceString,
-}
-type  LivenessProbe = {
-    enabled: ServiceBoolean,
-    failureThreshold: ServiceString,
-    initialDelaySeconds: ServiceString,
     path: ServiceString,
     periodSeconds: ServiceString,
-    scheme: ServiceString,
-    successThreshold: ServiceString,
-    timeoutSeconds: ServiceString,
-    auth: Auth,
 }
-type  ReadinessProbe = {
-    auth: Auth,
+type ReadinessProbe = {
     enabled: ServiceBoolean,
     failureThreshold: ServiceString,
-    initialDelaySeconds: ServiceString,
     path: ServiceString,
-    periodSeconds: ServiceString,
-    scheme: ServiceString,
-    successThreshold: ServiceString,
-    timeoutSeconds: ServiceString,
+    initialDelaySeconds: ServiceString,
 }
-type  StartUpProbe = {
-    auth: Auth,
+type StartUpProbe = {
     enabled: ServiceBoolean,
     failureThreshold: ServiceString,
     path: ServiceString,
     periodSeconds: ServiceString,
-    scheme: ServiceString,
-    timeoutSeconds: ServiceString,
 }
-
 type Health = {
     livenessProbe: LivenessProbe,
     startupProbe: StartUpProbe,
     readinessProbe: ReadinessProbe,
-    livenessCommand: livenessCommand,
 }
 
 
@@ -198,57 +167,23 @@ const WebService = {
         port: ServiceField.string('3000', porterJson?.apps?.[name]?.config?.container?.port),
         canDelete: porterJson?.apps?.[name] == null,
         health: {
-            startupProbe:{
-                auth:{
-                    enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.startupProbe?.auth?.enabled),
-                    password: ServiceField.string('', porterJson?.apps?.[name]?.config?.health?.startupProbe?.auth?.password),
-                    username: ServiceField.string('', porterJson?.apps?.[name]?.config?.health?.startupProbe?.auth?.username)
-                },
+            startupProbe: {
                 enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.startupProbe?.enabled),
                 failureThreshold: ServiceField.string('3', porterJson?.apps?.[name]?.config?.health?.startupProbe?.failureThreshold),
                 path: ServiceField.string('/startupz', porterJson?.apps?.[name]?.config?.health?.startupProbe?.path),
                 periodSeconds: ServiceField.string('5', porterJson?.apps?.[name]?.config?.health?.startupProbe?.periodSeconds),
-                scheme: ServiceField.string('HTTP', porterJson?.apps?.[name]?.config?.health?.startupProbe?.scheme),
-                timeoutSeconds: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.startupProbe?.timeoutSeconds),
             },
-            readinessProbe:{
-                auth:{
-                    enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.readinessProbe?.auth?.enabled),
-                    password: ServiceField.string('', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.auth?.password),
-                    username: ServiceField.string('', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.auth?.username)
-                },
+            readinessProbe: {
                 enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.readinessProbe?.enabled),
                 failureThreshold: ServiceField.string('3', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.failureThreshold),
-                initialDelaySeconds: ServiceField.string('0', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.initialDelaySeconds),
                 path: ServiceField.string('/readyz', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.path),
-                periodSeconds: ServiceField.string('5', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.periodSeconds),
-                scheme: ServiceField.string('HTTP', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.scheme),
-                timeoutSeconds: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.timeoutSeconds),
-                successThreshold: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.successThreshold),
-            },
-            livenessCommand:{
-                command: ServiceField.string('ls -l', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.command),
-                enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.livenessCommand?.enabled),
-                failureThreshold: ServiceField.string('3', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.failureThreshold),
-                initialDelaySeconds: ServiceField.string('5', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.initialDelaySeconds),
-                periodSeconds: ServiceField.string('5', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.periodSeconds),
-                timeoutSeconds: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.timeoutSeconds),
-                successThreshold: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.successThreshold),
+                initialDelaySeconds: ServiceField.string('0', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.initialDelaySeconds),
             },
-            livenessProbe:{
-                auth:{
-                    enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.livenessProbe?.auth?.enabled),
-                    password: ServiceField.string('', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.auth?.password),
-                    username: ServiceField.string('', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.auth?.username)
-                },
+            livenessProbe: {
+                enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.livenessProbe?.enabled),
                 failureThreshold: ServiceField.string('3', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.failureThreshold),
-                initialDelaySeconds: ServiceField.string('0', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.initialDelaySeconds),
                 path: ServiceField.string('/livez', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.path),
                 periodSeconds: ServiceField.string('5', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.periodSeconds),
-                scheme: ServiceField.string('HTTP', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.scheme),
-                successThreshold: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.successThreshold),
-                timeoutSeconds: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.timeoutSeconds),
-                enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.livenessProbe?.enabled),
             },
         }
     }),
@@ -282,58 +217,24 @@ const WebService = {
                 porter_hosts: service.ingress.porterHosts.value ? [service.ingress.porterHosts.value] : [],
             },
             health: {
-                startupProbe: service.health.startupProbe ? {
-                    auth:{
-                        enabled: service.health.livenessProbe.auth?.enabled ? service.health.startupProbe.auth.enabled.value : false,
-                        password: service.health.livenessProbe.auth?.password ? service.health.startupProbe.auth.password.value : '',
-                        username: service.health.livenessProbe.auth?.username ? service.health.startupProbe.auth.username.value : '',
-                    },
-                    enabled: service.health.startupProbe.enabled ? service.health.startupProbe.enabled.value : false,
-                    failureThreshold:  service.health.startupProbe.failureThreshold ? service.health.startupProbe.failureThreshold.value : '3',
-                    path: service.health.startupProbe.path ? service.health.startupProbe.path.value : '/startupz',
-                    periodSeconds: service.health.startupProbe.periodSeconds ? service.health.startupProbe.periodSeconds.value : '5',
-                    scheme: service.health.startupProbe.scheme ? service.health.startupProbe.scheme.value : 'HTTP',
-                    timeoutSeconds: service.health.startupProbe.timeoutSeconds ? service.health.startupProbe.timeoutSeconds.value : '1',
-                } : {},
-                readinessProbe: service.health.readinessProbe ? {
-                    auth:{
-                        enabled: service.health.readinessProbe.auth?.enabled ? service.health.readinessProbe.auth.enabled.value : false,
-                        password: service.health.readinessProbe.auth?.password ? service.health.readinessProbe.auth.password.value : '',
-                        username: service.health.readinessProbe.auth?.username ? service.health.readinessProbe.auth.username.value : '',
-                    },
-                    enabled: service.health.readinessProbe.enabled ? service.health.readinessProbe.enabled.value : false,
-                    failureThreshold:service.health.readinessProbe.failureThreshold ? service.health.readinessProbe.failureThreshold.value : '3',
-                    initialDelaySeconds: service.health.readinessProbe.initialDelaySeconds ? service.health.readinessProbe.initialDelaySeconds.value : '0',
-                    path: service.health.readinessProbe.path ? service.health.readinessProbe.path.value : '/readyz',
-                    periodSeconds: service.health.readinessProbe.periodSeconds ? service.health.readinessProbe.periodSeconds.value : '5',
-                    scheme: service.health.readinessProbe.scheme ? service.health.readinessProbe.scheme.value : 'HTTP',
-                    timeoutSeconds: service.health.readinessProbe.timeoutSeconds ? service.health.readinessProbe.timeoutSeconds.value : '1',
-                    successThreshold: service.health.readinessProbe.successThreshold ? service.health.readinessProbe.successThreshold.value : '1',
-                } : {},
-                livenessCommand: service.health.livenessCommand ? {
-                    command: service.health.livenessCommand.command ? service.health.livenessCommand.command.value : 'ls -l',
-                    enabled: service.health.livenessCommand.enabled ? service.health.livenessCommand.enabled.value : false,
-                    failureThreshold: service.health.livenessCommand.failureThreshold ? service.health.livenessCommand.failureThreshold.value : '3',
-                    initialDelaySeconds: service.health.livenessCommand.initialDelaySeconds ? service.health.livenessCommand.initialDelaySeconds.value : '5',
-                    periodSeconds: service.health.livenessCommand.periodSeconds ? service.health.livenessCommand.periodSeconds.value : '5',
-                    timeoutSeconds:service.health.livenessCommand.timeoutSeconds ? service.health.livenessCommand.timeoutSeconds.value : '1' ,
-                    successThreshold: service.health.livenessCommand.successThreshold ? service.health.livenessCommand.successThreshold.value : '1',
-                } : {},
-                livenessProbe: service.health.livenessProbe ? {
-                    auth:{
-                        enabled: service.health.livenessProbe.auth ? service.health.livenessProbe.auth.enabled.value : false,
-                        password: service.health.livenessProbe.auth ? service.health.livenessProbe.auth.password.value : '',
-                        username: service.health.livenessProbe.auth ? service.health.livenessProbe.auth.username.value : '',
-                    },
-                    failureThreshold: service.health.livenessProbe.failureThreshold ? service.health.livenessProbe.failureThreshold.value : '3',
-                    initialDelaySeconds: service.health.livenessProbe.initialDelaySeconds ? service.health.livenessProbe.initialDelaySeconds.value : '0',
-                    path: service.health.livenessProbe.path ? service.health.livenessProbe.path.value : '/livez',
-                    periodSeconds: service.health.livenessProbe.periodSeconds ? service.health.livenessProbe.periodSeconds.value : '5',
-                    scheme: service.health.livenessProbe.scheme ? service.health.livenessProbe.scheme.value : 'HTTP',
-                    successThreshold: service.health.livenessProbe.successThreshold ? service.health.livenessProbe.successThreshold.value : '1',
-                    timeoutSeconds: service.health.livenessProbe.timeoutSeconds ? service.health.livenessProbe.timeoutSeconds.value : '1',
-                    enabled:  service.health.livenessProbe.enabled ? service.health.livenessProbe.enabled.value : false,
-                } : {},
+                startupProbe: {
+                    enabled: service.health.startupProbe.enabled.value,
+                    failureThreshold: service.health.startupProbe.failureThreshold.value,
+                    path: service.health.startupProbe.path.value,
+                    periodSeconds: service.health.startupProbe.periodSeconds.value,
+                },
+                readinessProbe: {
+                    enabled: service.health.readinessProbe.enabled.value,
+                    failureThreshold: service.health.readinessProbe.failureThreshold.value,
+                    path: service.health.readinessProbe.path.value,
+                    initialDelaySeconds: service.health.readinessProbe.initialDelaySeconds.value,
+                },
+                livenessProbe: {
+                    enabled: service.health.livenessProbe.enabled.value,
+                    failureThreshold: service.health.livenessProbe.failureThreshold.value,
+                    path: service.health.livenessProbe.path.value,
+                    periodSeconds: service.health.livenessProbe.periodSeconds.value,
+                },
             }
         }
     },
@@ -360,57 +261,23 @@ const WebService = {
             port: ServiceField.string(values.container?.port ?? '', porterJson?.apps?.[name]?.config?.container?.port),
             canDelete: porterJson?.apps?.[name] == null,
             health: {
-                startupProbe:{
-                    auth:{
-                        enabled: ServiceField.boolean(values.health.startupProbe.auth.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.startupProbe?.auth?.enabled),
-                        password: ServiceField.string(values.health.startupProbe.auth.password ?? '', porterJson?.apps?.[name]?.config?.health?.startupProbe?.auth.password),
-                        username: ServiceField.string(values.health.startupProbe.auth.username ?? '', porterJson?.apps?.[name]?.config?.health?.startupProbe?.auth.username)
-                    },
-                    enabled: ServiceField.boolean(values.health.startupProbe.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.startupProbe?.enabled),
-                    failureThreshold: ServiceField.string(values.health.startupProbe.failureThreshold ?? '3', porterJson?.apps?.[name]?.config?.health?.startupProbe?.failureThreshold),
-                    path: ServiceField.string(values.health.startupProbe.path ?? '/startupz', porterJson?.apps?.[name]?.config?.health?.startupProbe?.path),
-                    periodSeconds: ServiceField.string(values.health.startupProbe.periodSeconds ?? '5', porterJson?.apps?.[name]?.config?.health?.startupProbe?.periodSeconds),
-                    scheme: ServiceField.string(values.health.startupProbe.scheme ?? 'HTTP', porterJson?.apps?.[name]?.config?.health?.startupProbe?.scheme),
-                    timeoutSeconds:ServiceField.string(values.health.startupProbe.timeoutSeconds ?? '1', porterJson?.apps?.[name]?.config?.health?.startupProbe?.timeoutSeconds),
-                },
-                readinessProbe:{
-                    auth:{
-                        enabled: ServiceField.boolean(values.health.readinessProbe.auth.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.readinessProbe?.auth?.enabled),
-                        password: ServiceField.string(values.health.readinessProbe.auth.password ?? '', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.auth.password),
-                        username: ServiceField.string(values.health.readinessProbe.auth.username ?? '', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.auth.username)
-                    },
-                    enabled: ServiceField.boolean(values.health.readinessProbe.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.readinessProbe?.enabled),
-                    failureThreshold: ServiceField.string(values.health.readinessProbe.failureThreshold ?? '3', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.failureThreshold),
-                    path: ServiceField.string(values.health.readinessProbe.path ?? '/startupz', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.path),
-                    periodSeconds: ServiceField.string(values.health.readinessProbe.periodSeconds ?? '5', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.periodSeconds),
-                    scheme: ServiceField.string(values.health.readinessProbe.scheme ?? 'HTTP', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.scheme),
-                    timeoutSeconds:ServiceField.string(values.health.readinessProbe.timeoutSeconds ?? '1', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.timeoutSeconds),
-                    initialDelaySeconds: ServiceField.string(values.health.readinessProbe.initialDelaySeconds ?? '5', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.initialDelaySeconds),
-                    successThreshold: ServiceField.string(values.health.readinessProbe.successThreshold ?? '1', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.successThreshold),
+                startupProbe: {
+                    enabled: ServiceField.boolean(values.health?.startupProbe?.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.startupProbe?.enabled),
+                    failureThreshold: ServiceField.string(values.health?.startupProbe?.failureThreshold ?? '', porterJson?.apps?.[name]?.config?.health?.startupProbe?.failureThreshold),
+                    path: ServiceField.string(values.health?.startupProbe?.path ?? '', porterJson?.apps?.[name]?.config?.health?.startupProbe?.path),
+                    periodSeconds: ServiceField.string(values.health?.startupProbe?.periodSeconds ?? '', porterJson?.apps?.[name]?.config?.health?.startupProbe?.periodSeconds),
                 },
-                livenessCommand:{
-                    command: ServiceField.string('ls -l', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.command),
-                    enabled: ServiceField.boolean(false, porterJson?.apps?.[name]?.config?.health?.livenessCommand?.enabled),
-                    failureThreshold: ServiceField.string('3', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.failureThreshold),
-                    initialDelaySeconds: ServiceField.string('5', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.initialDelaySeconds),
-                    periodSeconds: ServiceField.string('5', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.periodSeconds),
-                    timeoutSeconds: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.timeoutSeconds),
-                    successThreshold: ServiceField.string('1', porterJson?.apps?.[name]?.config?.health?.livenessCommand?.successThreshold),
+                readinessProbe: {
+                    enabled: ServiceField.boolean(values.health?.readinessProbe?.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.readinessProbe?.enabled),
+                    failureThreshold: ServiceField.string(values.health?.readinessProbe?.failureThreshold ?? '', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.failureThreshold),
+                    path: ServiceField.string(values.health?.readinessProbe?.path ?? '', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.path),
+                    initialDelaySeconds: ServiceField.string(values.health?.readinessProbe?.initialDelaySeconds ?? '', porterJson?.apps?.[name]?.config?.health?.readinessProbe?.initialDelaySeconds),
                 },
-                livenessProbe:{
-                    auth:{
-                        enabled: ServiceField.boolean(values.health.livenessProbe.auth.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.livenessProbe?.auth?.enabled),
-                        password: ServiceField.string(values.health.livenessProbe.auth.password ?? '', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.auth.password),
-                        username: ServiceField.string(values.health.livenessProbe.auth.username ?? '', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.auth.username)
-                    },
-                    enabled: ServiceField.boolean(values.health.livenessProbe.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.livenessProbe?.enabled),
-                    failureThreshold: ServiceField.string(values.health.livenessProbe.failureThreshold ?? '3', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.failureThreshold),
-                    path: ServiceField.string(values.health.livenessProbe.path ?? '/startupz', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.path),
-                    periodSeconds: ServiceField.string(values.health.livenessProbe.periodSeconds ?? '5', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.periodSeconds),
-                    scheme: ServiceField.string(values.health.livenessProbe.scheme ?? 'HTTP', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.scheme),
-                    timeoutSeconds:ServiceField.string(values.health.livenessProbe.timeoutSeconds ?? '1', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.timeoutSeconds),
-                    initialDelaySeconds: ServiceField.string(values.health.livenessProbe.initialDelaySeconds ?? '5', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.initialDelaySeconds),
-                    successThreshold: ServiceField.string(values.health.livenessProbe.successThreshold ?? '1', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.successThreshold),
+                livenessProbe: {
+                    enabled: ServiceField.boolean(values.health?.livenessProbe?.enabled ?? false, porterJson?.apps?.[name]?.config?.health?.livenessProbe?.enabled),
+                    failureThreshold: ServiceField.string(values.health?.livenessProbe?.failureThreshold ?? '', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.failureThreshold),
+                    path: ServiceField.string(values.health?.livenessProbe?.path ?? '', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.path),
+                    periodSeconds: ServiceField.string(values.health?.livenessProbe?.periodSeconds ?? '', porterJson?.apps?.[name]?.config?.health?.livenessProbe?.periodSeconds),
                 },
             }
         }