use kube::CustomResource;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(CustomResource, Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[kube(
group = "crabka.io",
version = "v1alpha1",
kind = "SchemaRegistry",
plural = "schemaregistries",
singular = "schemaregistry",
shortname = "sr",
namespaced,
status = "SchemaRegistryStatus",
derive = "PartialEq"
)]
#[serde(rename_all = "camelCase")]
pub struct SchemaRegistrySpec {
#[schemars(range(min = 1, max = 1_000))]
pub replicas: i32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bootstrap_servers: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub schemas_topic: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub schemas_topic_replication_factor: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kafka_client: Option<SchemaRegistryKafkaClient>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tls: Option<SchemaRegistryTls>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authentication: Option<SchemaRegistryAuthn>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authorization: Option<SchemaRegistryAuthz>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resources: Option<k8s_openapi::api::core::v1::ResourceRequirements>,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CertManagerIssuerRef {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SchemaRegistryTls {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub secret_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub issuer_ref: Option<CertManagerIssuerRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_auth: Option<TlsClientAuth>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_ca_secret_name: Option<String>,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, JsonSchema, PartialEq, Eq)]
pub enum TlsClientAuth {
Disabled,
Optional,
Required,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SchemaRegistryAuthn {
#[serde(default)]
pub require_auth: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub realm: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub basic: Option<BasicAuthn>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bearer: Option<BearerAuthn>,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct BasicAuthn {
pub users_secret_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub users_secret_key: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct BearerAuthn {
pub mode: BearerMode,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub principal_claim: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub jwks_endpoint_uri: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub jwks_valid_issuer: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub jwks_expected_audience: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub jwks_tls_secret_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub jwks_principal_claim: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub jwks_refresh_ms: Option<i64>,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, JsonSchema, PartialEq, Eq)]
pub enum BearerMode {
Unsecured,
Jwks,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SchemaRegistryAuthz {
#[serde(default)]
pub enabled: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub super_users: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub acl_refresh_seconds: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SchemaRegistryKafkaClient {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub security_protocol: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sasl: Option<KafkaClientSasl>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tls: Option<KafkaClientTls>,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct KafkaClientSasl {
pub mechanism: String,
pub secret_ref: String,
}
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct KafkaClientTls {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ca_secret_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub server_name_override: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SchemaRegistryStatus {
#[serde(default)]
pub conditions: Vec<crate::crd::KafkaCondition>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub observed_generation: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub replicas: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ready_replicas: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
}