From 8f684cff184dc25dda133192b65aa59212aeadc2 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Fri, 14 Apr 2023 13:39:30 +0300 Subject: [PATCH] Adding validatingwebhookconfigs API Signed-off-by: Alex Andreev --- .../mutating-webhook-configuration.api.ts | 4 +- ...ng-webhook-configuration-api.injectable.ts | 27 +++++++++++ .../validating-webhook-configuration.api.ts | 48 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts create mode 100644 packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration.api.ts diff --git a/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration.api.ts b/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration.api.ts index bdfde072bf..ca7950c981 100644 --- a/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration.api.ts +++ b/packages/core/src/common/k8s-api/endpoints/mutating-webhook-configuration.api.ts @@ -43,7 +43,7 @@ interface RuleWithOperations { scope?: string; } -interface MutatingWebhook { +export interface Webhook { // The name of the webhook configuration. name: string; @@ -88,7 +88,9 @@ interface MutatingWebhook { // needs to run. This should be false when the webhook only applies to resources that have // the sideEffects field set to None. Defaults to true. sideEffects?: string; +} +interface MutatingWebhook extends Webhook { // reinvocationPolicy indicates whether this webhook should be called multiple times as part of a // single admission evaluation. Allowed values are "Never" and "IfNeeded" reinvocationPolicy?: "Never" | "IfNeeded"; diff --git a/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts b/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts new file mode 100644 index 0000000000..a1d6e40417 --- /dev/null +++ b/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration-api.injectable.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import assert from "assert"; +import { storesAndApisCanBeCreatedInjectionToken } from "../stores-apis-can-be-created.token"; +import { kubeApiInjectionToken } from "../kube-api/kube-api-injection-token"; +import loggerInjectable from "../../logger.injectable"; +import maybeKubeApiInjectable from "../maybe-kube-api.injectable"; +import { ValidatingWebhookConfigurationApi } from "./validating-webhook-configuration.api"; + +const validatingWebhookConfigurationApiInjectable = getInjectable({ + id: "validating-webhook-configuration", + instantiate: (di) => { + assert(di.inject(storesAndApisCanBeCreatedInjectionToken), "validatingWebhookApi is only available in certain environments"); + + return new ValidatingWebhookConfigurationApi({ + logger: di.inject(loggerInjectable), + maybeKubeApi: di.inject(maybeKubeApiInjectable), + }); + }, + + injectionToken: kubeApiInjectionToken, +}); + +export default validatingWebhookConfigurationApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration.api.ts b/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration.api.ts new file mode 100644 index 0000000000..835d64ba34 --- /dev/null +++ b/packages/core/src/common/k8s-api/endpoints/validating-webhook-configuration.api.ts @@ -0,0 +1,48 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { NamespaceScopedMetadata, KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import { KubeObject } from "../kube-object"; +import type { DerivedKubeApiOptions, KubeApiDependencies } from "../kube-api"; +import { KubeApi } from "../kube-api"; +import type { KubeJsonApiData } from "../kube-json-api"; +import type { Webhook } from "./mutating-webhook-configuration.api"; +import { MutatingWebhookConfiguration } from "./mutating-webhook-configuration.api"; + +interface ValidatingWebhook extends Webhook { +} + +interface ValidatingWebhookConfigurationData extends KubeJsonApiData, void, void> { + webhooks?: ValidatingWebhook[]; +} + +export class ValidatingWebhookConfiguration extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { + static kind = "ValidatingWebhookConfiguration"; + static namespaced = false; + static apiBase = "/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations"; + + webhooks?: ValidatingWebhook[]; + + constructor({ webhooks, ...rest }: ValidatingWebhookConfigurationData) { + super(rest); + this.webhooks = webhooks; + } + + getWebhooks(): ValidatingWebhook[] { + return this.webhooks ?? []; + } +} + +export class ValidatingWebhookConfigurationApi extends KubeApi { + constructor(deps: KubeApiDependencies, opts?: DerivedKubeApiOptions) { + super(deps, { + ...opts ?? {}, + objectConstructor: MutatingWebhookConfiguration, + }); + } +}