kopium

CI Crates.io

Kubernetes openapi unmangler.

Generates rust structs from customresourcedefinitions in your kubernetes cluster follwing the spec/status model, by using their embedded openapi schema.

⚠️ WARNING: not feature complete ⚠️

Requirements:

Features

Installation

Grab a prebuilt musl/darwin binary from the latest release, or install from crates.io:

sh cargo install kopium

Usage

sh kopium prometheusrules.monitoring.coreos.com --docs > prometheusrule.rs

Output

```rust use kube::CustomResource; use serde::{Serialize, Deserialize}; use std::collections::BTreeMap;

/// Specification of desired alerting rule definitions for Prometheus.

[derive(CustomResource, Serialize, Deserialize, Clone, Debug)]

[kube(group = "monitoring.coreos.com", version = "v1", kind = "PrometheusRule", plural = "prometheusrules")]

[kube(namespaced)]

[kube(schema = "disabled")]

pub struct PrometheusRuleSpec { /// Content of Prometheus rule file #[serde(default, skipserializingif = "Vec::is_empty")] pub groups: Vec, }

/// RuleGroup is a list of sequentially evaluated recording and alerting rules. Note: PartialResponseStrategy is only used by ThanosRuler and will be ignored by Prometheus instances. Valid values for this field are 'warn' or 'abort'. More info: https://github.com/thanos-io/thanos/blob/master/docs/components/rule.md#partial-response

[derive(Serialize, Deserialize, Clone, Debug)]

pub struct PrometheusRuleGroups { pub interval: Option, pub name: String, pub partialresponsestrategy: Option, pub rules: Vec, }

/// Rule describes an alerting or recording rule See Prometheus documentation: alerting or recording rule

[derive(Serialize, Deserialize, Clone, Debug)]

pub struct PrometheusRuleGroupsRules { pub alert: Option, #[serde(default, skipserializingif = "BTreeMap::isempty")] pub annotations: BTreeMap, pub expr: String, pub r#for: Option, #[serde(default, skipserializingif = "BTreeMap::isempty")] pub labels: BTreeMap, pub record: Option, } ```

Usage with kube

Simply add the generated file (e.g. output from above in prometheusrule.rs) to your library, and import (at least) the special root type:

```rust use prometheusrule::PrometheusRule; use kube::{Api, Client, ResourceExt};

[tokio::main]

async fn main() -> Result<(), Box> { let client = Client::trydefault().await?; let pr: Api = Api::defaultnamespaced(client); for p in pr.list(&Default::default()).await? { println!("Found PrometheusRule {} in current namespace", p.name()); } Ok(()) } ```

Autocomplete

Autocompletion for most shells available via kopium completions:

sh source <(kopium completions bash)

Testing

Generate a CRD, tell the test runner to try to use it.

sh cargo run --bin kopium -- prometheusrules.monitoring.coreos.com > tests/gen.rs echo "pub type CR = PrometheusRule;" >> tests/gen.rs kubectl apply -f tests/pr.yaml # needs to contain a CR with name "gen" cargo test --test runner -- --nocapture

test shortcuts available via just in the justfile.

License

Apache 2.0 licensed. See LICENSE for details.