Browse Source

POR-1902 validate name against existing porter apps (#3777)

ianedwards 2 years ago
parent
commit
1934450f3c

+ 7 - 1
dashboard/src/lib/porter-apps/index.ts

@@ -59,7 +59,13 @@ export const deletionValidator = z.object({
 export const clientAppValidator = z.object({
   name: z.object({
     readOnly: z.boolean(),
-    value: z.string(),
+    value: z
+      .string()
+      .min(1, { message: "Name must be at least 1 character" })
+      .max(30, { message: "Name must be 30 characters or less" })
+      .regex(/^[a-z0-9-]{1,61}$/, {
+        message: 'Lowercase letters, numbers, and "-" only.',
+      }),
   }),
   envGroups: z
     .object({ name: z.string(), version: z.bigint() })

+ 21 - 7
dashboard/src/main/home/app-dashboard/create-app/CreateApp.tsx

@@ -80,7 +80,7 @@ const CreateApp: React.FC<CreateAppProps> = ({ history }) => {
   const { maxCPU, maxRAM } = useClusterResourceLimits({
     projectId: currentProject?.id,
     clusterId: currentCluster?.id,
-  })
+  });
 
   const { data: porterApps = [] } = useQuery<string[]>(
     ["getPorterApps", currentProject?.id, currentCluster?.id],
@@ -513,7 +513,7 @@ const CreateApp: React.FC<CreateAppProps> = ({ history }) => {
                       placeholder="ex: academic-sophon"
                       type="text"
                       width="300px"
-                      error={errors.app?.name?.message}
+                      error={errors.app?.name?.value?.message}
                       disabled={name.readOnly}
                       disabledTooltip={
                         "You may only edit this field in your porter.yaml."
@@ -585,10 +585,23 @@ const CreateApp: React.FC<CreateAppProps> = ({ history }) => {
                           <ImageSettings
                             projectId={currentProject.id}
                             imageUri={image?.repository ?? ""}
-                            setImageUri={(uri: string) => setValue("source.image", { ...image, repository: uri })}
+                            setImageUri={(uri: string) =>
+                              setValue("source.image", {
+                                ...image,
+                                repository: uri,
+                              })
+                            }
                             imageTag={image?.tag ?? ""}
-                            setImageTag={(tag: string) => setValue("source.image", { ...image, tag })}
-                            resetImageInfo={() => setValue("source.image", { ...image, repository: "", tag: "" })}
+                            setImageTag={(tag: string) =>
+                              setValue("source.image", { ...image, tag })
+                            }
+                            resetImageInfo={() =>
+                              setValue("source.image", {
+                                ...image,
+                                repository: "",
+                                tag: "",
+                              })
+                            }
                           />
                         )
                       ) : null}
@@ -614,8 +627,9 @@ const CreateApp: React.FC<CreateAppProps> = ({ history }) => {
                             }
                           >
                             {detectedServices.count > 0
-                              ? `Detected ${detectedServices.count} service${detectedServices.count > 1 ? "s" : ""
-                              } from porter.yaml.`
+                              ? `Detected ${detectedServices.count} service${
+                                  detectedServices.count > 1 ? "s" : ""
+                                } from porter.yaml.`
                               : `Could not detect any services from porter.yaml. Make sure it exists in the root of your repo.`}
                           </Text>
                         </AppearingDiv>

+ 1 - 0
internal/repository/test/porter_app.go

@@ -34,6 +34,7 @@ func (repo *PorterAppRepository) UpdatePorterApp(app *models.PorterApp) (*models
 	return nil, errors.New("cannot write database")
 }
 
+// ListPorterAppByClusterID is a test method that is not implemented
 func (repo *PorterAppRepository) ListPorterAppByClusterID(clusterID uint) ([]*models.PorterApp, error) {
 	return nil, errors.New("cannot write database")
 }