Kaynağa Gözat

POR-1903 handle ingress annotations and consolidate service deletions (#3786)

ianedwards 2 yıl önce
ebeveyn
işleme
c4acd6b05b

+ 19 - 12
api/server/handlers/porter_app/validate.go

@@ -36,13 +36,19 @@ func NewValidatePorterAppHandler(
 	}
 }
 
+// ServiceDeletions are deletions to apply to a specific service
+type ServiceDeletions struct {
+	DomainNames           []string `json:"domain_names"`
+	IngressAnnotationKeys []string `json:"ingress_annotation_keys"`
+}
+
 // Deletions are the names of services and env variables to delete
 type Deletions struct {
-	ServiceNames        []string            `json:"service_names"`
-	Predeploy           []string            `json:"predeploy"`
-	EnvVariableNames    []string            `json:"env_variable_names"`
-	EnvGroupNames       []string            `json:"env_group_names"`
-	DomainNameDeletions map[string][]string `json:"domain_name_deletions"`
+	ServiceNames     []string                    `json:"service_names"`
+	Predeploy        []string                    `json:"predeploy"`
+	EnvVariableNames []string                    `json:"env_variable_names"`
+	EnvGroupNames    []string                    `json:"env_group_names"`
+	ServiceDeletions map[string]ServiceDeletions `json:"service_deletions"`
 }
 
 // ValidatePorterAppRequest is the request object for the /apps/validate endpoint
@@ -144,12 +150,13 @@ func (c *ValidatePorterAppHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 		telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "validated-with-overrides", Value: true})
 	}
 
-	var ServiceDomainsDeletions map[string]*porterv1.DomainNameList
-	if request.Deletions.DomainNameDeletions != nil {
-		ServiceDomainsDeletions = make(map[string]*porterv1.DomainNameList)
-		for k, v := range request.Deletions.DomainNameDeletions {
-			ServiceDomainsDeletions[k] = &porterv1.DomainNameList{
-				DomainNames: v,
+	var serviceDeletions map[string]*porterv1.ServiceDeletions
+	if request.Deletions.ServiceDeletions != nil {
+		serviceDeletions = make(map[string]*porterv1.ServiceDeletions)
+		for k, v := range request.Deletions.ServiceDeletions {
+			serviceDeletions[k] = &porterv1.ServiceDeletions{
+				DomainNames:        v.DomainNames,
+				IngressAnnotations: v.IngressAnnotationKeys,
 			}
 		}
 	}
@@ -165,7 +172,7 @@ func (c *ValidatePorterAppHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 			PredeployNames:   request.Deletions.Predeploy,
 			EnvVariableNames: request.Deletions.EnvVariableNames,
 			EnvGroupNames:    request.Deletions.EnvGroupNames,
-			ServiceDomains:   ServiceDomainsDeletions,
+			ServiceDeletions: serviceDeletions,
 		},
 	})
 	ccpResp, err := c.Config().ClusterControlPlaneClient.ValidatePorterApp(ctx, validateReq)

+ 7 - 7
dashboard/package-lock.json

@@ -13,7 +13,7 @@
         "@loadable/component": "^5.15.2",
         "@material-ui/core": "^4.11.3",
         "@material-ui/lab": "^4.0.0-alpha.61",
-        "@porter-dev/api-contracts": "^0.2.13",
+        "@porter-dev/api-contracts": "^0.2.14",
         "@react-spring/web": "^9.6.1",
         "@sentry/react": "^6.13.2",
         "@sentry/tracing": "^6.13.2",
@@ -2455,9 +2455,9 @@
       }
     },
     "node_modules/@porter-dev/api-contracts": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.2.13.tgz",
-      "integrity": "sha512-m8xouZMsz+QeigtNLLe1pUBixGiRVhsaqYuqB1Fn4lzqT3GHE7vupyoHsBZiP7YDxQC85O7sQ0gmLdOsmpsNpQ==",
+      "version": "0.2.14",
+      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.2.14.tgz",
+      "integrity": "sha512-P1OrwtrXiuL0bJ90BYJXE682TTdfaTcrqJNir9kY5HHPcAqJLDRE69awDsta2aBf0YZ89sB+vHYcduAWyY5luA==",
       "dependencies": {
         "@bufbuild/protobuf": "^1.1.0"
       }
@@ -16956,9 +16956,9 @@
       "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
     },
     "@porter-dev/api-contracts": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.2.13.tgz",
-      "integrity": "sha512-m8xouZMsz+QeigtNLLe1pUBixGiRVhsaqYuqB1Fn4lzqT3GHE7vupyoHsBZiP7YDxQC85O7sQ0gmLdOsmpsNpQ==",
+      "version": "0.2.14",
+      "resolved": "https://registry.npmjs.org/@porter-dev/api-contracts/-/api-contracts-0.2.14.tgz",
+      "integrity": "sha512-P1OrwtrXiuL0bJ90BYJXE682TTdfaTcrqJNir9kY5HHPcAqJLDRE69awDsta2aBf0YZ89sB+vHYcduAWyY5luA==",
       "requires": {
         "@bufbuild/protobuf": "^1.1.0"
       }

+ 1 - 1
dashboard/package.json

@@ -8,7 +8,7 @@
     "@loadable/component": "^5.15.2",
     "@material-ui/core": "^4.11.3",
     "@material-ui/lab": "^4.0.0-alpha.61",
-    "@porter-dev/api-contracts": "^0.2.13",
+    "@porter-dev/api-contracts": "^0.2.14",
     "@react-spring/web": "^9.6.1",
     "@sentry/react": "^6.13.2",
     "@sentry/tracing": "^6.13.2",

+ 17 - 6
dashboard/src/lib/hooks/useAppValidation.ts

@@ -110,15 +110,26 @@ export const useAppValidation = ({
         })
         .exhaustive();
 
-      const domainDeletions = data.app.services.reduce(
-        (acc: Record<string, string[]>, svc) => {
-          if (svc.domainDeletions.length) {
-            acc[svc.name.value] = svc.domainDeletions.map((d) => d.name);
-          }
+      const serviceDeletions = data.app.services.reduce(
+        (
+          acc: Record<
+            string,
+            { domain_names: string[]; ingress_annotation_keys: string[] }
+          >,
+          svc
+        ) => {
+          acc[svc.name.value] = {
+            domain_names: svc.domainDeletions.map((d) => d.name),
+            ingress_annotation_keys: svc.ingressAnnotationDeletions.map(
+              (ia) => ia.key
+            ),
+          };
+
           return acc;
         },
         {}
       );
+
       const res = await api.validatePorterApp(
         "<token>",
         {
@@ -134,7 +145,7 @@ export const useAppValidation = ({
             predeploy: data.deletions.predeploy.map((s) => s.name),
             env_group_names: data.deletions.envGroupNames.map((eg) => eg.name),
             env_variable_names: [],
-            domain_name_deletions: domainDeletions,
+            service_deletions: serviceDeletions,
           },
         },
         {

+ 4 - 0
dashboard/src/lib/porter-apps/services.ts

@@ -87,6 +87,9 @@ export const serviceValidator = z.object({
     })
     .array()
     .default([]),
+  ingressAnnotationDeletions: z.object({
+    key: z.string(),
+  }).array().default([])
 });
 
 export type ClientService = z.infer<typeof serviceValidator>;
@@ -325,6 +328,7 @@ export function deserializeService({
       override?.smartOptimization
     ),
     domainDeletions: [],
+    ingressAnnotationDeletions: [],
   };
 
   return match(service.config)

+ 2 - 2
dashboard/src/main/home/app-dashboard/validate-apply/services-settings/tabs/CustomDomains.tsx

@@ -33,7 +33,8 @@ const CustomDomains: React.FC<Props> = ({ index }) => {
       {fields.length !== 0 && (
         <>
           {fields.map((customDomain, i) => {
-            return !customDomain.name.value.includes("onporter.run") && !customDomain.name.value.includes("withporter.run") ? (
+            return !customDomain.name.value.includes("onporter.run") &&
+              !customDomain.name.value.includes("withporter.run") ? (
               <div key={customDomain.id}>
                 <AnnotationContainer>
                   <ControlledInput
@@ -62,7 +63,6 @@ const CustomDomains: React.FC<Props> = ({ index }) => {
               </div>
             ) : null;
           })}
-          <Spacer y={0.5} />
         </>
       )}
       <Button

+ 14 - 1
dashboard/src/main/home/app-dashboard/validate-apply/services-settings/tabs/IngressCustomAnnotations.tsx

@@ -16,6 +16,17 @@ const IngressCustomAnnotations: React.FC<Props> = ({ index }) => {
     control,
     name: `app.services.${index}.config.ingressAnnotations`,
   });
+  const { append: appendAnnotationDeletion } = useFieldArray({
+    control,
+    name: `app.services.${index}.ingressAnnotationDeletions`,
+  });
+
+  const onRemove = (i: number, key: string) => {
+    remove(i);
+    appendAnnotationDeletion({
+      key,
+    });
+  };
 
   return (
     <div>
@@ -50,7 +61,9 @@ const IngressCustomAnnotations: React.FC<Props> = ({ index }) => {
                   />
                   <DeleteButton
                     onClick={() => {
-                      remove(i);
+                      if (!annotation.readOnly) {
+                        onRemove(i, annotation.key);
+                      }
                     }}
                   >
                     <i className="material-icons">cancel</i>

+ 10 - 0
dashboard/src/main/home/app-dashboard/validate-apply/services-settings/tabs/Networking.tsx

@@ -96,6 +96,16 @@ const Networking: React.FC<NetworkingProps> = ({ index, service }) => {
           <Spacer y={0.5} />
           <CustomDomains index={index} />
           <Spacer y={0.5} />
+          <Text color="helper">
+            Ingress Custom Annotations
+            <a
+              href="https://docs.porter.run/standard/deploying-applications/runtime-configuration-options/web-applications#ingress-custom-annotations"
+              target="_blank"
+            >
+              &nbsp;(?)
+            </a>
+          </Text>
+          <Spacer y={0.5} />
           <IngressCustomAnnotations index={index} />
         </>
       )}

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

@@ -901,7 +901,10 @@ const validatePorterApp = baseApi<
       predeploy: string[];
       env_variable_names: string[];
       env_group_names: string[];
-      domain_name_deletions: Record<string, string[]>;
+      service_deletions: Record<string, {
+        domain_names: string[];
+        ingress_annotation_keys: string[];
+      }>
     };
   },
   {

+ 1 - 1
go.mod

@@ -82,7 +82,7 @@ require (
 	github.com/matryer/is v1.4.0
 	github.com/nats-io/nats.go v1.24.0
 	github.com/open-policy-agent/opa v0.44.0
-	github.com/porter-dev/api-contracts v0.2.13
+	github.com/porter-dev/api-contracts v0.2.14
 	github.com/riandyrn/otelchi v0.5.1
 	github.com/santhosh-tekuri/jsonschema/v5 v5.0.1
 	github.com/stefanmcshane/helm v0.0.0-20221213002717-88a4a2c6e77d

+ 2 - 2
go.sum

@@ -1516,8 +1516,8 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
-github.com/porter-dev/api-contracts v0.2.13 h1:z878AzwirK28dybdLlOan2U02ZNljw3rFJ79jnc1rFM=
-github.com/porter-dev/api-contracts v0.2.13/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
+github.com/porter-dev/api-contracts v0.2.14 h1:ZjA/2ViDf2CkFsSTJ9Kffo4YTj/xeLc0JiAe4FfGxY0=
+github.com/porter-dev/api-contracts v0.2.14/go.mod h1:fX6JmP5QuzxDLvqP3evFOTXjI4dHxsG0+VKNTjImZU8=
 github.com/porter-dev/switchboard v0.0.3 h1:dBuYkiVLa5Ce7059d6qTe9a1C2XEORFEanhbtV92R+M=
 github.com/porter-dev/switchboard v0.0.3/go.mod h1:xSPzqSFMQ6OSbp42fhCi4AbGbQbsm6nRvOkrblFeXU4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=