Skip to content

Commit

Permalink
refactor: draft ValidatorManager class
Browse files Browse the repository at this point in the history
  • Loading branch information
f1ames committed Sep 28, 2023
1 parent 6f908b3 commit e65bf62
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 57 deletions.
56 changes: 6 additions & 50 deletions admission-webhook/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import pino from 'pino';
import {AnnotationSuppressor, FingerprintSuppressor, MonokleValidator, RemotePluginLoader, SchemaLoader, DisabledFixer, ResourceParser} from '@monokle/validation';
import {getInformer} from './utils/get-informer.js';
import {MonoklePolicy, MonoklePolicyBinding, PolicyManager} from './utils/policy-manager.js';
import {ValidatorManager} from './utils/validator-manager.js';
import {ValidationServer} from './utils/validation-server.js';

const logger = pino({
name: 'Monokle',
Expand All @@ -28,56 +29,11 @@ const logger = pino({
);

const policyManager = new PolicyManager(policyInformer, bindingsInformer, logger);
const validatorManager = new ValidatorManager(policyManager);

// POLICY MANAGER
await policyManager.start();

// // INFORMER
// const onPolicy = async (policy: MonoklePolicy) => {
// logger.info({msg: 'Informer: Policy updated', policy});
const server = new ValidationServer(validatorManager, logger);

// const policyNamespace = policy.metadata?.namespace;
// if (!policyNamespace) {
// logger.error({msg: 'Informer: Policy namespace is empty', metadata: policy.metadata});
// return;
// }

// policies.set(policyNamespace, policy.spec);

// if (!validators.has(policyNamespace)) {
// validators.set(
// policyNamespace,
// new MonokleValidator(
// {
// loader: new RemotePluginLoader(),
// parser: new ResourceParser(),
// schemaLoader: new SchemaLoader(),
// suppressors: [new AnnotationSuppressor(), new FingerprintSuppressor()],
// fixer: new DisabledFixer(),
// },
// {}
// )
// );
// }

// await validators.get(policyNamespace)!.preload(policy.spec);
// }

// const onPolicyRemoval = async (policy: MonoklePolicy) => {
// logger.info('Informer: Policy removed');

// const policyNamespace = policy.metadata?.namespace;
// if (!policyNamespace) {
// logger.error({msg: 'Informer: Policy namespace is empty', metadata: policy.metadata});
// return;
// }

// policies.delete(policyNamespace);
// validators.delete(policyNamespace);
// }


// // SERVER
// const server = new ValidationServer(validators, logger);

// await server.start();
await server.start();
})();
14 changes: 7 additions & 7 deletions admission-webhook/src/utils/validation-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ import fastify from "fastify";
import pino from 'pino';
import path from "path";
import {readFileSync} from "fs";
import {MonokleValidator, Resource} from "@monokle/validation";
import {Resource} from "@monokle/validation";
import {V1ValidatingWebhookConfiguration, V1ObjectMeta} from "@kubernetes/client-node";
import {ValidatorManager} from "./validator-manager";

export type ValidationServerOptions = {
port: number;
Expand Down Expand Up @@ -33,7 +34,7 @@ export class ValidationServer {
private _shouldValidate: boolean

constructor(
private readonly _validators: Map<string, MonokleValidator>,
private readonly _validators: ValidatorManager,
private readonly _logger: ReturnType<typeof pino>,
private readonly _options: ValidationServerOptions = {
port: 8443,
Expand Down Expand Up @@ -113,10 +114,8 @@ export class ValidationServer {
return response;
}

const validator = this._validators.get(namespace);
if (!validator) {
this._logger.info({msg: 'No validator found for namespace', namespace});

const validators = this._validators.getMatchingValidators();
if (validators.length === 0) {
return response;
}

Expand All @@ -129,7 +128,8 @@ export class ValidationServer {
}

const resourceForValidation = this._createResourceForValidation(body);
const validationResponse = await validator.validate({ resources: [resourceForValidation] });
// @TODO iterate over validators and run them all
const validationResponse = await validators[0].validate({ resources: [resourceForValidation] });

const warnings = [];
const errors = [];
Expand Down
25 changes: 25 additions & 0 deletions admission-webhook/src/utils/validator-manager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import {MonokleValidator} from "@monokle/validation";
import {PolicyManager} from "./policy-manager";

export class ValidatorManager {
private _validators = new Map<string, MonokleValidator>(); // Map<policyName, validator>

constructor(
private readonly _policyManager: PolicyManager,
) {
// @TODO implement this._policyManager.on(policyUpdated, this._reloadValidator)
// We should preload configuration here instead of in getMatchingValidators since
// it would affect performance of the admission webhook response time
}

getMatchingValidators(): MonokleValidator[] {
const matchingPolicies = this._policyManager.getMatchingPolicies();

if (matchingPolicies.length === 0) {
return [];
}

// @TODO
return [];
}
}

0 comments on commit e65bf62

Please sign in to comment.