Explorar o código

support delete predeploy (#3683)

Co-authored-by: David Townley <davidtownley@Davids-MacBook-Air.local>
Feroze Mohideen %!s(int64=2) %!d(string=hai) anos
pai
achega
5cad08db7a

+ 2 - 0
api/server/handlers/porter_app/validate.go

@@ -39,6 +39,7 @@ func NewValidatePorterAppHandler(
 // Deletions are the names of services and env variables to delete
 // Deletions are the names of services and env variables to delete
 type Deletions struct {
 type Deletions struct {
 	ServiceNames     []string `json:"service_names"`
 	ServiceNames     []string `json:"service_names"`
+	Predeploy        []string `json:"predeploy"`
 	EnvVariableNames []string `json:"env_variable_names"`
 	EnvVariableNames []string `json:"env_variable_names"`
 	EnvGroupNames    []string `json:"env_group_names"`
 	EnvGroupNames    []string `json:"env_group_names"`
 }
 }
@@ -150,6 +151,7 @@ func (c *ValidatePorterAppHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 		AppOverrides:       overrides,
 		AppOverrides:       overrides,
 		Deletions: &porterv1.Deletions{
 		Deletions: &porterv1.Deletions{
 			ServiceNames:     request.Deletions.ServiceNames,
 			ServiceNames:     request.Deletions.ServiceNames,
+			PredeployNames:   request.Deletions.Predeploy,
 			EnvVariableNames: request.Deletions.EnvVariableNames,
 			EnvVariableNames: request.Deletions.EnvVariableNames,
 			EnvGroupNames:    request.Deletions.EnvGroupNames,
 			EnvGroupNames:    request.Deletions.EnvGroupNames,
 		},
 		},

+ 1 - 0
dashboard/src/lib/hooks/useAppValidation.ts

@@ -119,6 +119,7 @@ export const useAppValidation = ({
           commit_sha,
           commit_sha,
           deletions: {
           deletions: {
             service_names: data.deletions.serviceNames.map((s) => s.name),
             service_names: data.deletions.serviceNames.map((s) => s.name),
+            predeploy: data.deletions.predeploy.map((s) => s.name),
             env_group_names: data.deletions.envGroupNames.map((eg) => eg.name),
             env_group_names: data.deletions.envGroupNames.map((eg) => eg.name),
             env_variable_names: [],
             env_variable_names: [],
           },
           },

+ 13 - 8
dashboard/src/lib/porter-apps/index.ts

@@ -43,6 +43,11 @@ export const deletionValidator = z.object({
       name: z.string(),
       name: z.string(),
     })
     })
     .array(),
     .array(),
+  predeploy: z
+    .object({
+      name: z.string(),
+    })
+    .array(),
   envGroupNames: z
   envGroupNames: z
     .object({
     .object({
       name: z.string(),
       name: z.string(),
@@ -358,15 +363,15 @@ export function clientAppFromProto({
   const predeployOverrides = serializeService(overrides.predeploy);
   const predeployOverrides = serializeService(overrides.predeploy);
   const predeploy = proto.predeploy
   const predeploy = proto.predeploy
     ? [
     ? [
-        deserializeService({
-          service: serializedServiceFromProto({
-            name: "pre-deploy",
-            service: proto.predeploy,
-            isPredeploy: true,
-          }),
-          override: predeployOverrides,
+      deserializeService({
+        service: serializedServiceFromProto({
+          name: "pre-deploy",
+          service: proto.predeploy,
+          isPredeploy: true,
         }),
         }),
-      ]
+        override: predeployOverrides,
+      }),
+    ]
     : undefined;
     : undefined;
 
 
   return {
   return {

+ 8 - 6
dashboard/src/main/home/app-dashboard/app-view/AppDataContainer.tsx

@@ -121,6 +121,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
       deletions: {
       deletions: {
         serviceNames: [],
         serviceNames: [],
         envGroupNames: [],
         envGroupNames: [],
+        predeploy: [],
       },
       },
     },
     },
   });
   });
@@ -268,7 +269,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
 
 
       // redirect to the default tab after save
       // redirect to the default tab after save
       history.push(`/apps/${porterApp.name}/${DEFAULT_TAB}`);
       history.push(`/apps/${porterApp.name}/${DEFAULT_TAB}`);
-    } catch (err) {}
+    } catch (err) { }
   });
   });
 
 
   const cancelRedeploy = useCallback(() => {
   const cancelRedeploy = useCallback(() => {
@@ -310,6 +311,7 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
       deletions: {
       deletions: {
         envGroupNames: [],
         envGroupNames: [],
         serviceNames: [],
         serviceNames: [],
+        predeploy: [],
       },
       },
       redeployOnSave: false,
       redeployOnSave: false,
     });
     });
@@ -372,11 +374,11 @@ const AppDataContainer: React.FC<AppDataContainerProps> = ({ tabParam }) => {
             { label: "Environment", value: "environment" },
             { label: "Environment", value: "environment" },
             ...(latestProto.build
             ...(latestProto.build
               ? [
               ? [
-                  {
-                    label: "Build Settings",
-                    value: "build-settings",
-                  },
-                ]
+                {
+                  label: "Build Settings",
+                  value: "build-settings",
+                },
+              ]
               : []),
               : []),
             { label: "Settings", value: "settings" },
             { label: "Settings", value: "settings" },
           ]}
           ]}

+ 1 - 1
dashboard/src/main/home/app-dashboard/app-view/tabs/Overview.tsx

@@ -59,7 +59,7 @@ const Overview: React.FC = () => {
                 type: "predeploy",
                 type: "predeploy",
               }),
               }),
             })}
             })}
-            existingServiceNames={Object.keys(latestProto.services)}
+            existingServiceNames={latestProto.predeploy ? ["pre-deploy"] : []}
             isPredeploy
             isPredeploy
             fieldArrayName={"app.predeploy"}
             fieldArrayName={"app.predeploy"}
           />
           />

+ 1 - 0
dashboard/src/main/home/app-dashboard/create-app/CreateApp.tsx

@@ -159,6 +159,7 @@ const CreateApp: React.FC<CreateAppProps> = ({ history }) => {
       deletions: {
       deletions: {
         serviceNames: [],
         serviceNames: [],
         envGroupNames: [],
         envGroupNames: [],
+        predeploy: [],
       },
       },
     },
     },
   });
   });

+ 1 - 1
dashboard/src/main/home/app-dashboard/validate-apply/services-settings/ServiceList.tsx

@@ -87,7 +87,7 @@ const ServiceList: React.FC<ServiceListProps> = ({
     fields: deletedServices,
     fields: deletedServices,
   } = useFieldArray({
   } = useFieldArray({
     control: appControl,
     control: appControl,
-    name: "deletions.serviceNames",
+    name: fieldArrayName === "app.services" ? "deletions.serviceNames" : "deletions.predeploy",
   });
   });
 
 
   const serviceType = watch("type");
   const serviceType = watch("type");

+ 1 - 0
dashboard/src/shared/api.tsx

@@ -898,6 +898,7 @@ const validatePorterApp = baseApi<
     commit_sha: string;
     commit_sha: string;
     deletions: {
     deletions: {
       service_names: string[];
       service_names: string[];
+      predeploy: string[];
       env_variable_names: string[];
       env_variable_names: string[];
       env_group_names: string[];
       env_group_names: string[];
     };
     };

+ 2 - 0
go.work.sum

@@ -823,6 +823,8 @@ github.com/porter-dev/api-contracts v0.0.63/go.mod h1:qr2L58mJLr5DUGV5OPw3REiSrQ
 github.com/porter-dev/api-contracts v0.0.86/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/porter-dev/api-contracts v0.0.86/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/porter-dev/api-contracts v0.1.7 h1:Mxua9qTur0HIhIS4gmK0a9sLcHrgJfFwSQI0CxZBkh4=
 github.com/porter-dev/api-contracts v0.1.7 h1:Mxua9qTur0HIhIS4gmK0a9sLcHrgJfFwSQI0CxZBkh4=
 github.com/porter-dev/api-contracts v0.1.7/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/porter-dev/api-contracts v0.1.7/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
+github.com/porter-dev/api-contracts v0.2.3 h1:JDdi2QT6RkI37XiYRaKM3L5wvFSp070pWmnlexDsd4c=
+github.com/porter-dev/api-contracts v0.2.3/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
 github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
 github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc=
 github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc=
 github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
 github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=