Este documento foi traduzido usando tecnologia de tradução automática de máquina. Sempre trabalhamos para apresentar traduções precisas, mas não oferecemos nenhuma garantia em relação à integridade, precisão ou confiabilidade do conteúdo traduzido. Em caso de qualquer discrepância, a versão original em inglês prevalecerá e constituirá o texto official.

Esta é uma documentação não divulgada para Admission Controller 1.34-dev.

Definindo configurações de política

A estrutura das configurações de política

Primeiramente, defina a estrutura que contém as configurações de política.

Abra o arquivo demo/src/settings.rs e altere a definição do Settings struct para ficar assim:

pub(crate) struct Settings {
    pub invalid_names: HashSet<String>,
}

Isso coloca automaticamente a lista de nomes inválidos em uma coleção Set.

A função de validação das configurações

Em seguida, escreva uma função de validação das configurações para garantir que a política seja sempre executada com pelo menos um nome inválido.

Você faz isso alterando a implementação do trait Validatable.

Altere a implementação do scaffolding definida em src/settings.rs para ficar assim:

impl kubewarden::settings::Validatable for Settings {
    fn validate(&self) -> Result<(), String> {
        if self.invalid_names.is_empty() {
            Err(String::from("No invalid name specified. Specify at least one invalid name to match"))
        } else {
            Ok(())
        }
    }
}

Adicione testes de unidade

Agora você pode escrever um teste de unidade para garantir que a validação das configurações esteja funcionando. Você pode fazer isso da maneira usual do Rust.

Já existem alguns testes padrão no final do arquivo src/settings.rs. Substitua o código gerado automaticamente para ficar assim:

#[cfg(test)]
mod tests {
    use super::*;

    use kubewarden_policy_sdk::settings::Validatable;

    #[test]
    fn accept_settings_with_a_list_of_invalid_names() -> Result<(), ()> {
        let mut invalid_names = HashSet::new();
        invalid_names.insert(String::from("bad_name1"));
        invalid_names.insert(String::from("bad_name2"));

        let settings = Settings { invalid_names };

        assert!(settings.validate().is_ok());
        Ok(())
    }

    #[test]
    fn reject_settings_without_a_list_of_invalid_names() -> Result<(), ()> {
        let invalid_names = HashSet::<String>::new();
        let settings = Settings { invalid_names };

        assert!(settings.validate().is_err());
        Ok(())
    }
}

Agora você pode executar os testes de unidade fazendo:

cargo test

Isso produz uma saída semelhante à seguinte:

   Compiling demo v0.1.0 (/home/jhk/projects/suse/tmp/demo)
    Finished test [unoptimized + debuginfo] target(s) in 0.59s
     Running unittests src/lib.rs (target/debug/deps/demo-bea8e11b21717093)

running 5 tests
test settings::tests::accept_settings_with_a_list_of_invalid_names ... ok
test settings::tests::reject_settings_without_a_list_of_invalid_names ... ok
test tests::reject_pod_with_invalid_name ... ok
test tests::accept_request_with_non_pod_resource ... ok
test tests::accept_pod_with_valid_name ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s