From 2bb1997fa4c7453fdf3e16d8cc85284f2f86cefb Mon Sep 17 00:00:00 2001 From: Luke Bond Date: Wed, 5 Jul 2023 17:47:08 +0100 Subject: [PATCH 1/3] feat: add SinkerContainer CRD --- Cargo.lock | 1 + Cargo.toml | 3 ++- src/main.rs | 5 +++-- src/resources.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bff1011..01805ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1583,6 +1583,7 @@ dependencies = [ "jsonpath_lib", "k8s-openapi", "kube", + "kube-derive", "kubert", "rstest", "schemars", diff --git a/Cargo.toml b/Cargo.toml index a33706f..7f34d7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,10 +12,11 @@ description = "Copy k8s resources (or parts thereof) across clusters" clap = { version = "4.1", features = ["derive", "help", "env", "std"] } futures = "0.3" kube = { version = "0.80.0", features = ["runtime", "derive"] } +kube-derive = "0.80.0" k8s-openapi = { version = "0.17.0", features = ["v1_26"] } kubert = { version = "0.16.1", features = ["clap", "runtime", "server"] } tokio = { version = "1.26", features = ["full"] } -anyhow = { version = "1", features = ["backtrace"] } +anyhow = { version = "1", features = ["backtrace"] } tracing = "0.1" schemars = "0.8.12" serde = { version = "1", features = ["derive"] } diff --git a/src/main.rs b/src/main.rs index efa3a7b..f4c76a7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,8 +45,9 @@ async fn main() -> anyhow::Result<()> { match &command { Some(Commands::Manifests) => { println!( - "{}", - serde_yaml::to_string(&sinker::resources::ResourceSync::crd()).unwrap() + "{}\n---\n{}", + serde_yaml::to_string(&sinker::resources::ResourceSync::crd()).unwrap(), + serde_yaml::to_string(&sinker::resources::SinkerContainer::crd_with_manual_schema()).unwrap() ); } None => { diff --git a/src/resources.rs b/src/resources.rs index f4b3778..77e25c6 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -1,3 +1,6 @@ +use k8s_openapi::apiextensions_apiserver::pkg::apis::apiextensions::v1::{ + CustomResourceDefinition, CustomResourceValidation, JSONSchemaProps, +}; use kube::{ core::{gvk::ParseGroupVersionError, GroupVersionKind, TypeMeta}, CustomResource, @@ -98,3 +101,42 @@ pub struct SecretRef { pub name: String, pub key: String, } + +#[derive(CustomResource, Debug, Serialize, Deserialize, Default, Clone, JsonSchema)] +#[kube( + group = "sinker.influxdata.io", + version = "v1alpha1", + kind = "SinkerContainer", + namespaced, + schema = "disabled" +)] +#[serde(rename_all = "camelCase")] +pub struct SinkerContainerSpec { +} + +const MANUAL_SCHEMA: &str = r#" +description: This is a handy generic resource container for use as ResourceSync sources or targets +type: object +properties: + spec: + description: This is an arbitrary object + type: object + x-kubernetes-preserve-unknown-fields: true +required: +- spec +"#; + +impl SinkerContainer { + pub fn crd_with_manual_schema() -> CustomResourceDefinition { + use kube::CustomResourceExt; + let schema: JSONSchemaProps = serde_yaml::from_str(MANUAL_SCHEMA).expect("invalid schema"); + + let mut crd = ::crd(); + crd.spec.versions.iter_mut().for_each(|v| { + v.schema = Some(CustomResourceValidation { + open_api_v3_schema: Some(schema.clone()), + }) + }); + crd + } +} From b965362a51184c8c44d316a844bdc9690a137bf8 Mon Sep 17 00:00:00 2001 From: Luke Bond Date: Wed, 5 Jul 2023 21:06:08 +0100 Subject: [PATCH 2/3] fix: regen manifests. CR fix --- manifests/crd.yml | 31 +++++++++++++++++++++++++++++++ src/main.rs | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/manifests/crd.yml b/manifests/crd.yml index 70b2d17..881d760 100644 --- a/manifests/crd.yml +++ b/manifests/crd.yml @@ -148,4 +148,35 @@ spec: storage: true subresources: status: {} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: sinkercontainers.sinker.influxdata.io +spec: + group: sinker.influxdata.io + names: + categories: [] + kind: SinkerContainer + plural: sinkercontainers + shortNames: [] + singular: sinkercontainer + scope: Namespaced + versions: + - additionalPrinterColumns: [] + name: v1alpha1 + schema: + openAPIV3Schema: + description: This is a handy generic resource container for use as ResourceSync sources or targets + properties: + spec: + description: This is an arbitrary object + type: object + x-kubernetes-preserve-unknown-fields: true + required: + - spec + type: object + served: true + storage: true + subresources: {} diff --git a/src/main.rs b/src/main.rs index f4c76a7..7c100ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,7 +45,7 @@ async fn main() -> anyhow::Result<()> { match &command { Some(Commands::Manifests) => { println!( - "{}\n---\n{}", + "{}---\n{}", serde_yaml::to_string(&sinker::resources::ResourceSync::crd()).unwrap(), serde_yaml::to_string(&sinker::resources::SinkerContainer::crd_with_manual_schema()).unwrap() ); From 3363fb9496c4651ef6319c15d84c7a1a9b04a726 Mon Sep 17 00:00:00 2001 From: Luke Bond Date: Thu, 6 Jul 2023 09:32:18 +0100 Subject: [PATCH 3/3] chore: cargo fmt --- src/resources.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/resources.rs b/src/resources.rs index 77e25c6..6e39720 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -111,8 +111,7 @@ pub struct SecretRef { schema = "disabled" )] #[serde(rename_all = "camelCase")] -pub struct SinkerContainerSpec { -} +pub struct SinkerContainerSpec {} const MANUAL_SCHEMA: &str = r#" description: This is a handy generic resource container for use as ResourceSync sources or targets @@ -127,7 +126,7 @@ required: "#; impl SinkerContainer { - pub fn crd_with_manual_schema() -> CustomResourceDefinition { + pub fn crd_with_manual_schema() -> CustomResourceDefinition { use kube::CustomResourceExt; let schema: JSONSchemaProps = serde_yaml::from_str(MANUAL_SCHEMA).expect("invalid schema");