diff --git a/app/kubernetes/ingress/constants.js b/app/kubernetes/ingress/constants.js index bd7a5cfea..053952789 100644 --- a/app/kubernetes/ingress/constants.js +++ b/app/kubernetes/ingress/constants.js @@ -2,12 +2,25 @@ export const KubernetesIngressClassAnnotation = 'kubernetes.io/ingress.class'; // keys must match KubernetesIngressClassTypes values to map them quickly using the ingress type // KubernetesIngressClassRewriteTargetAnnotations[KubernetesIngressClassTypes.NGINX] for example -export const KubernetesIngressClassRewriteTargetAnnotations = Object.freeze({ - nginx: { 'nginx.ingress.kubernetes.io/rewrite-target': '/' }, - traefik: { 'traefik.ingress.kubernetes.io/rewrite-target': '/' }, -}); + +export const KubernetesNginxRewriteTargetAnnotations = { + Key: 'nginx.ingress.kubernetes.io/rewrite-target', + Value: '/$1', +}; + +export const KubernetesTraefikRewriteTargetAnnotations = { + Key: 'traefik.ingress.kubernetes.io/rewrite-target', + Value: '/$1', +}; + +export const KubernetesNginxUseregexAnnotations = { + Key: 'nginx.ingress.kubernetes.io/use-regex', + Value: 'true', +}; export const KubernetesIngressClassTypes = Object.freeze({ NGINX: 'nginx', TRAEFIK: 'traefik', }); + +export const PortainerIngressClassTypes = 'ingress.portainer.io/ingress-type'; diff --git a/app/kubernetes/ingress/converter.js b/app/kubernetes/ingress/converter.js index 6a1dac903..4fea053da 100644 --- a/app/kubernetes/ingress/converter.js +++ b/app/kubernetes/ingress/converter.js @@ -10,7 +10,7 @@ import { import { KubernetesApplicationPublishingTypes } from '../models/application/models'; import { KubernetesIngress, KubernetesIngressRule } from './models'; import { KubernetesIngressCreatePayload, KubernetesIngressRuleCreatePayload, KubernetesIngressRulePathCreatePayload } from './payloads'; -import { KubernetesIngressClassAnnotation, KubernetesIngressClassRewriteTargetAnnotations } from './constants'; +import { KubernetesIngressClassAnnotation, PortainerIngressClassTypes } from './constants'; export class KubernetesIngressConverter { static apiToModel(data) { @@ -151,10 +151,7 @@ export class KubernetesIngressConverter { res.Namespace = formValues.Namespace; const pairs = _.map(formValues.Annotations, (a) => [a.Key, a.Value]); res.Annotations = _.fromPairs(pairs); - if (formValues.RewriteTarget) { - _.extend(res.Annotations, KubernetesIngressClassRewriteTargetAnnotations[formValues.IngressClass.Type]); - } - res.Annotations[KubernetesIngressClassAnnotation] = formValues.IngressClass.Name; + res.Annotations[PortainerIngressClassTypes] = formValues.IngressClass.Name; res.IngressClassName = formValues.IngressClass.Name; res.Hosts = formValues.Hosts; res.Paths = formValues.Paths; @@ -180,11 +177,8 @@ export class KubernetesIngressConverter { hfv.IsNew = false; return hfv; }); - const [[rewriteKey]] = _.toPairs(KubernetesIngressClassRewriteTargetAnnotations[ic.Type]); const annotations = _.map(_.toPairs(ingress.Annotations), ([key, value]) => { - if (key === rewriteKey) { - fv.RewriteTarget = true; - } else if (key !== KubernetesIngressClassAnnotation) { + if (key !== PortainerIngressClassTypes) { const annotation = new KubernetesResourcePoolIngressClassAnnotationFormValue(); annotation.Key = key; annotation.Value = value; @@ -204,6 +198,7 @@ export class KubernetesIngressConverter { const res = new KubernetesIngressCreatePayload(); res.metadata.name = data.Name; res.metadata.namespace = data.Namespace; + res.metadata.annotations = data.Annotations; res.spec.ingressClassName = data.IngressClassName; if (data.Paths && data.Paths.length) { _.forEach(data.Paths, (p) => { diff --git a/app/kubernetes/models/resource-pool/formValues.js b/app/kubernetes/models/resource-pool/formValues.js index d174bf2a8..9259feba5 100644 --- a/app/kubernetes/models/resource-pool/formValues.js +++ b/app/kubernetes/models/resource-pool/formValues.js @@ -1,3 +1,5 @@ +import { KubernetesNginxRewriteTargetAnnotations, KubernetesNginxUseregexAnnotations, KubernetesTraefikRewriteTargetAnnotations } from 'Kubernetes/ingress/constants'; + export function KubernetesResourcePoolFormValues(defaults) { this.Name = ''; this.MemoryLimit = defaults.MemoryLimit; @@ -41,3 +43,15 @@ export function KubernetesResourcePoolIngressClassHostFormValue() { IsNew: true, }; } + +export function KubernetesResourcePoolNginxRewriteAnnotationFormValue() { + return KubernetesNginxRewriteTargetAnnotations; +} + +export function KubernetesResourcePoolNginxUseregexAnnotationFormValue() { + return KubernetesNginxUseregexAnnotations; +} + +export function KubernetesResourcePoolTraefikRewriteAnnotationFormValue() { + return KubernetesTraefikRewriteTargetAnnotations; +} diff --git a/app/kubernetes/views/resource-pools/create/createResourcePool.html b/app/kubernetes/views/resource-pools/create/createResourcePool.html index 657df3ec5..4b0e4eea1 100644 --- a/app/kubernetes/views/resource-pools/create/createResourcePool.html +++ b/app/kubernetes/views/resource-pools/create/createResourcePool.html @@ -277,42 +277,16 @@ -
-
- - -
-
-
-

- - Advanced configuration - - - Hide configuration - -

-
- -
+

You can specify a list of annotations that will be associated to the ingress.

-
+
add annotation + + + + add rewrite annotation + + + + + add regular expression annotation + + +
- -
+
Key @@ -332,7 +339,11 @@ type="text" class="form-control" ng-model="annotation.Key" - placeholder="nginx.ingress.kubernetes.io/rewrite-target" + placeholder="{{ + ic.IngressClass.Type === $ctrl.IngressClassTypes.NGINX + ? 'e.g. nginx.ingress.kubernetes.io/enable-rewrite-log' + : 'e.g. traefik.ingress.kubernetes.io/router.priority' + }}" required data-cy="namespaceCreate-annotationKey{{ ic.IngressClass.Name }}" /> @@ -343,7 +354,7 @@ type="text" class="form-control" ng-model="annotation.Value" - placeholder="/$1" + placeholder="{{ ic.IngressClass.Type === $ctrl.IngressClassTypes.NGINX ? 'e.g. true or false' : 'e.g. 42' }}" required data-cy="namespaceCreate-annotationValue{{ ic.IngressClass.Name }}" /> diff --git a/app/kubernetes/views/resource-pools/create/createResourcePoolController.js b/app/kubernetes/views/resource-pools/create/createResourcePoolController.js index f925a7daa..8088e8597 100644 --- a/app/kubernetes/views/resource-pools/create/createResourcePoolController.js +++ b/app/kubernetes/views/resource-pools/create/createResourcePoolController.js @@ -6,6 +6,9 @@ import { KubernetesResourcePoolFormValues, KubernetesResourcePoolIngressClassAnnotationFormValue, KubernetesResourcePoolIngressClassHostFormValue, + KubernetesResourcePoolNginxRewriteAnnotationFormValue, + KubernetesResourcePoolNginxUseregexAnnotationFormValue, + KubernetesResourcePoolTraefikRewriteAnnotationFormValue, } from 'Kubernetes/models/resource-pool/formValues'; import { KubernetesIngressConverter } from 'Kubernetes/ingress/converter'; import KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper'; @@ -96,6 +99,20 @@ class KubernetesCreateResourcePoolController { ingressClass.Annotations.push(new KubernetesResourcePoolIngressClassAnnotationFormValue()); } + addRewriteAnnotation(ingressClass) { + if (ingressClass.IngressClass.Type === this.IngressClassTypes.NGINX) { + ingressClass.Annotations.push(new KubernetesResourcePoolNginxRewriteAnnotationFormValue()); + } + + if (ingressClass.IngressClass.Type === this.IngressClassTypes.TRAEFIK) { + ingressClass.Annotations.push(new KubernetesResourcePoolTraefikRewriteAnnotationFormValue()); + } + } + + addUseregexAnnotation(ingressClass) { + ingressClass.Annotations.push(new KubernetesResourcePoolNginxUseregexAnnotationFormValue()); + } + removeAnnotation(ingressClass, index) { ingressClass.Annotations.splice(index, 1); } diff --git a/app/kubernetes/views/resource-pools/edit/resourcePool.html b/app/kubernetes/views/resource-pools/edit/resourcePool.html index 42747bc71..121c49fb4 100644 --- a/app/kubernetes/views/resource-pools/edit/resourcePool.html +++ b/app/kubernetes/views/resource-pools/edit/resourcePool.html @@ -237,56 +237,80 @@
- -
-
- - -
-
- - -
+

You can specify a list of annotations that will be associated to the ingress.

-
+
add annotation + + + + add rewrite annotation + + + + + add regular expression annotation + + +
-
+
Key - +
Value - +