1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-08-05 05:45:22 +02:00

feat(ingress): support-regex-with-k8s-ingress EE-2644 (#6748)

* support regex with k8s ingress

* remove text for rewrite to /

* added tooltip
This commit is contained in:
Richard Wei 2022-04-20 16:45:20 +12:00 committed by GitHub
parent e20c34e12a
commit 9de0704775
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 166 additions and 75 deletions

View file

@ -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';

View file

@ -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) => {