Definiendo ajustes de directiva
|
Crítico: No escribas información de registro en STDOUT. Escribir en STDOUT rompe las directivas. En su lugar, utiliza STDERR para el registro o el mecanismo de registro proporcionado por el SUSE Security Admission Controller SDK. La salida de la directiva a STDOUT debe contener únicamente la respuesta de validación. |
Primero, define la estructura que contiene los ajustes de directiva en src/types.ts:
import type { PodSpec } from 'kubernetes-types/core/v1';
import type { ObjectMeta } from 'kubernetes-types/meta/v1';
/**
* Interface representing policy settings structure.
*/
export interface PolicySettings {
// List of hostnames that are denied by the policy.
denied_hostnames?: string[];
}
/**
* Generic Kubernetes resource interface
*/
export interface KubernetesResource {
apiVersion: string;
kind: string;
metadata: ObjectMeta;
spec?: PodSpec | any;
}
Construyendo instancias de Settings
Las directivas de Admission Controller utilizan dos funciones que manejan ajustes:
-
validate: Llamada durante la validación del objeto. -
validateSettings: Llamada en el momento de carga de la directiva.
En src/index.ts, la función validate se ve así:
function validate(): void {
try {
const validationRequest = Validation.Validation.readValidationRequest();
const settings: PolicySettings = validationRequest.settings || {};
// Policy logic...
} catch (err) {
console.error('Validation error:', err);
writeOutput(Validation.Validation.rejectRequest(`+Validation failed: ${err}+`));
}
}
Implementando la validación de Settings
function validateSettings(): void {
try {
const settingsInput = Validation.Validation.readValidationRequest();
const settings: PolicySettings = settingsInput as PolicySettings;
if (settings.denied_hostnames && !Array.isArray(settings.denied_hostnames)) {
const errorResponse = new Validation.Validation.SettingsValidationResponse(
false,
'denied_hostnames must be an array of strings',
);
writeOutput(errorResponse);
return;
}
for (const hostname of settings.denied_hostnames || []) {
if (typeof hostname !== 'string') {
const errorResponse = new Validation.Validation.SettingsValidationResponse(
false,
'All hostnames in denied_hostnames must be strings',
);
writeOutput(errorResponse);
return;
}
}
const response = new Validation.Validation.SettingsValidationResponse(true);
writeOutput(response);
} catch (err) {
console.error('Settings validation error:', err);
const errorResponse = new Validation.Validation.SettingsValidationResponse(
false,
`+Settings validation failed: ${err}+`,
);
writeOutput(errorResponse);
}
}