1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

allow to mark as default IngressClass from menu item

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2023-01-05 15:27:45 +02:00
parent 0f1cb787e8
commit 3fc5a0a81d
3 changed files with 40 additions and 7 deletions

View File

@ -5,7 +5,7 @@
import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object";
import { KubeObject } from "../kube-object"; import { KubeObject } from "../kube-object";
import { KubeApi } from "../kube-api"; import { KubeApi, ResourceDescriptor } from "../kube-api";
export class IngressClassApi extends KubeApi<IngressClass> { export class IngressClassApi extends KubeApi<IngressClass> {
constructor() { constructor() {
@ -15,6 +15,25 @@ export class IngressClassApi extends KubeApi<IngressClass> {
fallbackApiBases: ["/apis/extensions/v1beta1/ingressclasses"], 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 // 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<IngressClassMetadata, IngressClassS
static readonly kind = "IngressClass"; static readonly kind = "IngressClass";
static readonly namespaced = false; static readonly namespaced = false;
static readonly apiBase = "/apis/networking.k8s.io/v1/ingressclasses"; static readonly apiBase = "/apis/networking.k8s.io/v1/ingressclasses";
static readonly ANNOTATION_IS_DEFAULT = "ingressclass.kubernetes.io/is-default-class";
getController(): string { getController(): string {
return this.spec.controller; return this.spec.controller;
@ -76,6 +96,6 @@ export class IngressClass extends KubeObject<IngressClassMetadata, IngressClassS
} }
get isDefault() { get isDefault() {
return this.metadata.annotations?.["ingressclass.kubernetes.io/is-default-class"] === "true"; return this.metadata.annotations?.[IngressClass.ANNOTATION_IS_DEFAULT] === "true";
} }
} }

View File

@ -7,10 +7,11 @@ import styles from "./ingress-class-details.module.scss";
import React from "react"; import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { withInjectables } from "@ogre-tools/injectable-react";
import { DrawerItem, DrawerTitle } from "../drawer"; import { DrawerItem, DrawerTitle } from "../drawer";
import type { IngressClass } from "../../../common/k8s-api/endpoints"; import type { IngressClass } from "../../../common/k8s-api/endpoints";
import type { KubeObjectDetailsProps } from "../kube-object-details"; import type { KubeObjectDetailsProps } from "../kube-object-details";
import { withInjectables } from "@ogre-tools/injectable-react"; import { Badge } from "../badge";
export interface IngressClassDetailsProps extends KubeObjectDetailsProps<IngressClass> { export interface IngressClassDetailsProps extends KubeObjectDetailsProps<IngressClass> {
} }
@ -50,7 +51,7 @@ class NonInjectedIngressDetails extends React.Component<IngressClassDetailsProps
return ( return (
<div className={styles.IngressClassDetails}> <div className={styles.IngressClassDetails}>
<DrawerItem name="Controller"> <DrawerItem name="Controller">
{ingressClass.getController()} <Badge label={ingressClass.getController()} />
</DrawerItem> </DrawerItem>
{this.renderParameters()} {this.renderParameters()}
</div> </div>

View File

@ -4,13 +4,25 @@
*/ */
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
import type { IngressClass } from "../../../common/k8s-api/endpoints/ingress-class.api"; 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({ export const ingressClassSetDefaultInjectable = getInjectable({
id: "ingressClassSetDefaultInjectable", id: "ingressClassSetDefaultInjectable",
instantiate() { instantiate(di) {
return (item: IngressClass) => { return async (currentItem: IngressClass) => {
console.log(`TODO: implement set-default ingress-class api call(s)`, item); 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 });
}; };
}, },