From 3fc5a0a81de8d1f1d89b4abaf38416c20f8daa0a Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 5 Jan 2023 15:27:45 +0200 Subject: [PATCH] allow to mark as default IngressClass from menu item Signed-off-by: Roman --- .../k8s-api/endpoints/ingress-class.api.ts | 24 +++++++++++++++++-- .../ingress-class-details.tsx | 5 ++-- .../ingress-class-set-default.injectable.ts | 18 +++++++++++--- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/common/k8s-api/endpoints/ingress-class.api.ts b/src/common/k8s-api/endpoints/ingress-class.api.ts index 5835081960..2491b298df 100644 --- a/src/common/k8s-api/endpoints/ingress-class.api.ts +++ b/src/common/k8s-api/endpoints/ingress-class.api.ts @@ -5,7 +5,7 @@ import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; import { KubeObject } from "../kube-object"; -import { KubeApi } from "../kube-api"; +import { KubeApi, ResourceDescriptor } from "../kube-api"; export class IngressClassApi extends KubeApi { constructor() { @@ -15,6 +15,25 @@ export class IngressClassApi extends KubeApi { fallbackApiBases: ["/apis/extensions/v1beta1/ingressclasses"], }); } + + setAsDefault({ name }: ResourceDescriptor, isDefault: boolean = true) { + const reqUrl = this.formatUrlForNotListing({ name }); + + return this.request.patch(reqUrl, { + data: { + metadata: { + annotations: { + [IngressClass.ANNOTATION_IS_DEFAULT]: JSON.stringify(isDefault), + } + } + } + }, { + headers: { + "content-type": "application/strategic-merge-patch+json", + // "content-type": "application/merge-patch+json", + }, + }); + } } // API docs: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.22/#ingressclass-v1-networking-k8s-io @@ -50,6 +69,7 @@ export class IngressClass extends KubeObject { } @@ -50,7 +51,7 @@ class NonInjectedIngressDetails extends React.Component - {ingressClass.getController()} + {this.renderParameters()} diff --git a/src/renderer/components/+network-ingresses/ingress-class-set-default.injectable.ts b/src/renderer/components/+network-ingresses/ingress-class-set-default.injectable.ts index 289ebc21c0..c2cc72fe61 100644 --- a/src/renderer/components/+network-ingresses/ingress-class-set-default.injectable.ts +++ b/src/renderer/components/+network-ingresses/ingress-class-set-default.injectable.ts @@ -4,13 +4,25 @@ */ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; import type { IngressClass } from "../../../common/k8s-api/endpoints/ingress-class.api"; +import ingressClassApiInjectable + from "../../../common/k8s-api/endpoints/ingress-class.api.injectable"; +import ingressClassStoreInjectable from "./ingress-class-store.injectable"; export const ingressClassSetDefaultInjectable = getInjectable({ id: "ingressClassSetDefaultInjectable", - instantiate() { - return (item: IngressClass) => { - console.log(`TODO: implement set-default ingress-class api call(s)`, item); + instantiate(di) { + return async (currentItem: IngressClass) => { + const api = di.inject(ingressClassApiInjectable); + const store = di.inject(ingressClassStoreInjectable); + + const defaultIngressClassesUpdate = store.items + .filter((item: IngressClass) => item.isDefault && currentItem !== item) + .map(item => api.setAsDefault({ name: item.getName() }, false)); + + await Promise.all(defaultIngressClassesUpdate); + await api.setAsDefault({ name: currentItem.getName() }); + await store.reloadAll({ force: true }); }; },