Définir les paramètres de stratégie

Critique : Ne pas écrire d’informations de journalisation sur STDOUT.

Écrire sur STDOUT enfreint les stratégies. Utilisez plutôt STDERR pour la journalisation ou le service de journalisation fourni par le SUSE Security Admission Controller SDK. La sortie de la stratégie sur STDOUT ne doit contenir que la réponse de validation.

Tout d’abord, définissez la structure qui contient les paramètres de stratégie dans 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;
}

Création d’instances de Settings

Les stratégies Admission Controller utilisent deux fonctions qui gèrent les paramètres :

  • validate : Appelées lors de la validation de l’objet.

  • validateSettings : Appelées au moment du chargement de la stratégie.

Dans src/index.ts, la fonction validate ressemble à :

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}+`));
  }
}

Implémentation de la validation 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);
  }
}