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, } ```

Note: Doc comments on members are also exported when they exist within the schema.

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(()) } ```

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

License

Apache 2.0 licensed. See LICENSE for details.