|
Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar. |
|
Dies ist eine unveröffentlichte Dokumentation für Admission Controller 1.34-dev. |
Roh-Richtlinien
Roh-Richtlinien sind Richtlinien, die beliebige JSON-Dokumente auswerten können. Für weitere Informationen zu Roh-Richtlinien verweisen Sie bitte auf die Roh-Richtlinien Seite.
Beispiele
Die folgenden Beispiele sollten Ihnen vertraut sein, wenn Sie die Validierung-Seite dieses Tutorials abgeschlossen haben.
|
Denken Sie daran, die Richtlinie als |
Validation
Lassen Sie uns eine Richtlinie schreiben, die eine Anfrage im folgenden Format akzeptiert:
{
"request": {
"user": "alice",
"action": "delete",
"resource": "products"
}
}
und validiert, dass:
-
userist in der Liste der gültigen Benutzer -
actionist in der Liste der gültigen Aktionen -
resourceist in der Liste der gültigen Ressourcen
Beginnen Sie damit, die Richtlinie mit der Rust-Richtlinie-Vorlage zu erstellen.
Zuerst definieren wir die Typen, die die Nutzlast der Anfrage darstellen.
Wir werden einen benutzerdefinierten RawValidationRequest Typ deklarieren, der die Request und die Settings enthält, anstatt den ValidationRequest Typ zu verwenden, der vom SDK bereitgestellt wird:
/// RawValidationRequest represents the request that is sent to the validate function by the Policy Server.
#[derive(Deserialize)]
pub(crate) struct RawValidationRequest {
pub(crate) request: Request,
pub(crate) settings: Settings,
}
#[derive(Serialize, Deserialize)]
/// Request represents the payload of the request.
pub(crate) struct Request {
pub(crate) user: String,
pub(crate) resource: String,
pub(crate) action: String,
}
Dann müssen wir den Settings Typ definieren und das Validatable Trait implementieren:
/// Settings represents the settings of the policy.
#[derive(Serialize, Deserialize, Default, Debug)]
#[serde(default, rename_all = "camelCase")]
pub(crate) struct Settings {
pub(crate) valid_users: Vec<String>,
pub(crate) valid_actions: Vec<String>,
pub(crate) valid_resources: Vec<String>,
}
impl kubewarden::settings::Validatable for Settings {
fn validate(&self) -> Result<(), String> {
info!(LOG_DRAIN, "starting settings validation");
if self.valid_users.is_empty() {
return Err("validUsers cannot be empty".to_string());
}
if self.valid_actions.is_empty() {
return Err("validActions cannot be empty".to_string());
}
if self.valid_resources.is_empty() {
return Err("validResources cannot be empty".to_string());
}
Ok(())
}
}
Schließlich definieren wir die validate Funktion:
fn validate(payload: &[u8]) -> CallResult {
let validation_request: RawValidationRequest =
if let Ok(validation_request) = serde_json::from_slice(payload) {
validation_request
} else {
return kubewarden::reject_request(
Some("cannot unmarshal request".to_string()),
None,
None,
None,
);
};
info!(LOG_DRAIN, "starting validation");
let request = validation_request.request;
let settings = validation_request.settings;
if settings.valid_users.contains(&request.user)
&& settings.valid_actions.contains(&request.action)
&& settings.valid_resources.contains(&request.resource)
{
info!(LOG_DRAIN, "accepting resource");
kubewarden::accept_request()
} else {
kubewarden::reject_request(
Some("this request is not accepted".to_string()),
None,
None,
None,
)
}
}
Mutation
Lassen Sie uns das vorherige Beispiel ändern, um die Anfrage zu verändern, anstatt sie abzulehnen.
In diesem Fall werden die Einstellungen die defaultUser, defaultAction und defaultRequest enthalten, die verwendet werden, um die Anfrage zu verändern, wenn der Benutzer, die Aktion oder die Ressource nicht gültig ist.
Wir müssen den Settings Typ mit den neuen Feldern aktualisieren:
/// Settings represents the settings of the policy.
#[derive(Serialize, Deserialize, Default, Debug)]
#[serde(default, rename_all = "camelCase")]
pub(crate) struct Settings {
pub(crate) valid_users: Vec<String>,
pub(crate) valid_actions: Vec<String>,
pub(crate) valid_resources: Vec<String>,
pub(crate) default_user: String,
pub(crate) default_action: String,
pub(crate) default_resource: String,
}
impl kubewarden::settings::Validatable for Settings {
fn validate(&self) -> Result<(), String> {
info!(LOG_DRAIN, "starting settings validation");
if self.valid_users.is_empty() {
return Err("validUsers cannot be empty".to_string());
}
if self.valid_actions.is_empty() {
return Err("validActions cannot be empty".to_string());
}
if self.valid_resources.is_empty() {
return Err("validResources cannot be empty".to_string());
}
if self.default_user.is_empty() {
return Err("defaultUser cannot be empty".to_string());
}
if self.default_action.is_empty() {
return Err("defaultAction cannot be empty".to_string());
}
if self.default_resource.is_empty() {
return Err("defaultResource cannot be empty".to_string());
}
Ok(())
}
}
und die validate Funktion zur Einführung der Mutation:
fn validate(payload: &[u8]) -> CallResult {
let validation_request: RawValidationRequest =
if let Ok(validation_request) = serde_json::from_slice(payload) {
validation_request
} else {
return kubewarden::reject_request(
Some("cannot unmarshal request".to_string()),
None,
None,
None,
);
};
info!(LOG_DRAIN, "starting validation");
let request = validation_request.request;
let settings = validation_request.settings;
if settings.valid_users.contains(&request.user)
&& settings.valid_actions.contains(&request.action)
&& settings.valid_resources.contains(&request.resource)
{
info!(LOG_DRAIN, "accepting request");
return kubewarden::accept_request();
}
info!(LOG_DRAIN, "mutating request");
let mut request = request;
if !settings.valid_users.contains(&request.user) {
request.user = settings.default_user;
}
if !settings.valid_actions.contains(&request.action) {
request.action = settings.default_action;
}
if !settings.valid_resources.contains(&request.resource) {
request.resource = settings.default_resource;
}
let mutated_request = serde_json::to_value(request)?;
kubewarden::mutate_request(mutated_request)
}