From 121a3495d86fa23e76d773a7a4fd8458175f369d Mon Sep 17 00:00:00 2001 From: Techassi Date: Mon, 23 Sep 2024 16:40:09 +0200 Subject: [PATCH 1/4] feat(stackable-versioned): Forward selected kube args --- .../src/attrs/common/container.rs | 3 +++ .../src/codegen/common/container.rs | 6 ++++++ .../src/codegen/vstruct/mod.rs | 16 +++++++++++++++- crates/stackable-versioned-macros/src/lib.rs | 9 +++++++++ .../tests/k8s/pass/crd.rs | 7 ++++++- 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/crates/stackable-versioned-macros/src/attrs/common/container.rs b/crates/stackable-versioned-macros/src/attrs/common/container.rs index d5a3ccb0a..434c9e1ab 100644 --- a/crates/stackable-versioned-macros/src/attrs/common/container.rs +++ b/crates/stackable-versioned-macros/src/attrs/common/container.rs @@ -141,7 +141,10 @@ pub(crate) struct OptionAttributes { #[derive(Clone, Debug, FromMeta)] pub(crate) struct KubernetesAttributes { pub(crate) skip: Option, + pub(crate) singular: Option, + pub(crate) plural: Option, pub(crate) kind: Option, + pub(crate) namespaced: Flag, pub(crate) group: String, } diff --git a/crates/stackable-versioned-macros/src/codegen/common/container.rs b/crates/stackable-versioned-macros/src/codegen/common/container.rs index 26011259b..cb4aa4210 100644 --- a/crates/stackable-versioned-macros/src/codegen/common/container.rs +++ b/crates/stackable-versioned-macros/src/codegen/common/container.rs @@ -118,6 +118,9 @@ impl VersionedContainer { let kubernetes_options = attributes.kubernetes_attrs.map(|a| KubernetesOptions { skip_merged_crd: a.skip.map_or(false, |s| s.merged_crd.is_present()), + namespaced: a.namespaced.is_present(), + singular: a.singular, + plural: a.plural, group: a.group, kind: a.kind, }); @@ -166,7 +169,10 @@ pub(crate) struct VersionedContainerOptions { #[derive(Debug)] pub(crate) struct KubernetesOptions { + pub(crate) singular: Option, + pub(crate) plural: Option, pub(crate) skip_merged_crd: bool, pub(crate) kind: Option, + pub(crate) namespaced: bool, pub(crate) group: String, } diff --git a/crates/stackable-versioned-macros/src/codegen/vstruct/mod.rs b/crates/stackable-versioned-macros/src/codegen/vstruct/mod.rs index 6dd493906..f370b7ba8 100644 --- a/crates/stackable-versioned-macros/src/codegen/vstruct/mod.rs +++ b/crates/stackable-versioned-macros/src/codegen/vstruct/mod.rs @@ -253,6 +253,7 @@ impl VersionedStruct { /// attributes. fn generate_kubernetes_cr_derive(&self, version: &ContainerVersion) -> Option { if let Some(kubernetes_options) = &self.options.kubernetes_options { + // Required arguments let group = &kubernetes_options.group; let version = version.inner.to_string(); let kind = kubernetes_options @@ -260,9 +261,22 @@ impl VersionedStruct { .as_ref() .map_or(self.idents.kubernetes.to_string(), |kind| kind.clone()); + // Optional arguments + let namespaced = kubernetes_options + .namespaced + .then_some(quote! { , namespaced }); + let singular = kubernetes_options + .singular + .as_ref() + .map(|s| quote! { , singular = #s }); + let plural = kubernetes_options + .plural + .as_ref() + .map(|p| quote! { , plural = #p }); + return Some(quote! { #[derive(::kube::CustomResource)] - #[kube(group = #group, version = #version, kind = #kind)] + #[kube(group = #group, version = #version, kind = #kind #singular #plural #namespaced)] }); } diff --git a/crates/stackable-versioned-macros/src/lib.rs b/crates/stackable-versioned-macros/src/lib.rs index 9aa688f3f..90fc09d05 100644 --- a/crates/stackable-versioned-macros/src/lib.rs +++ b/crates/stackable-versioned-macros/src/lib.rs @@ -462,6 +462,15 @@ println!("{}", serde_yaml::to_string(&merged_crd).unwrap()); ``` "# )] +/// Currently, the following arguments are supported: +/// +/// - `group`: Sets the CRD group, usually the domain of the company. +/// - `kind`: Allows overwriting the kind field of the CRD. This defaults +/// to the struct name (without the 'Spec' suffix). +/// - `singular`: Sets the singular name. +/// - `plural`: Sets the plural name. +/// - `namespaced`: Specify that this is a namespaced resource rather than +/// cluster level. #[proc_macro_attribute] pub fn versioned(attrs: TokenStream, input: TokenStream) -> TokenStream { let attrs = match NestedMeta::parse_meta_list(attrs.into()) { diff --git a/crates/stackable-versioned-macros/tests/k8s/pass/crd.rs b/crates/stackable-versioned-macros/tests/k8s/pass/crd.rs index 0defd8252..fad51a1da 100644 --- a/crates/stackable-versioned-macros/tests/k8s/pass/crd.rs +++ b/crates/stackable-versioned-macros/tests/k8s/pass/crd.rs @@ -9,7 +9,12 @@ fn main() { version(name = "v1alpha1"), version(name = "v1beta1"), version(name = "v1"), - k8s(group = "stackable.tech") + k8s( + group = "stackable.tech", + singular = "foo", + plural = "foos", + namespaced, + ) )] #[derive(Clone, Debug, Deserialize, Serialize, JsonSchema)] pub struct FooSpec { From df53a4f5addbea70502e99c1f0111be570d02546 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 24 Sep 2024 09:34:51 +0200 Subject: [PATCH 2/4] chore: Apply suggestion Co-authored-by: Sebastian Bernauer --- crates/stackable-versioned-macros/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/stackable-versioned-macros/src/lib.rs b/crates/stackable-versioned-macros/src/lib.rs index 90fc09d05..2be434850 100644 --- a/crates/stackable-versioned-macros/src/lib.rs +++ b/crates/stackable-versioned-macros/src/lib.rs @@ -470,7 +470,7 @@ println!("{}", serde_yaml::to_string(&merged_crd).unwrap()); /// - `singular`: Sets the singular name. /// - `plural`: Sets the plural name. /// - `namespaced`: Specify that this is a namespaced resource rather than -/// cluster level. +/// a cluster scoped. #[proc_macro_attribute] pub fn versioned(attrs: TokenStream, input: TokenStream) -> TokenStream { let attrs = match NestedMeta::parse_meta_list(attrs.into()) { From 8f64e189bb1d0e2656043cfcc452c7f39f5b7981 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 24 Sep 2024 09:41:44 +0200 Subject: [PATCH 3/4] chore: Reword doc comment --- crates/stackable-versioned-macros/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/stackable-versioned-macros/src/lib.rs b/crates/stackable-versioned-macros/src/lib.rs index 2be434850..814b1c62b 100644 --- a/crates/stackable-versioned-macros/src/lib.rs +++ b/crates/stackable-versioned-macros/src/lib.rs @@ -469,7 +469,7 @@ println!("{}", serde_yaml::to_string(&merged_crd).unwrap()); /// to the struct name (without the 'Spec' suffix). /// - `singular`: Sets the singular name. /// - `plural`: Sets the plural name. -/// - `namespaced`: Specify that this is a namespaced resource rather than +/// - `namespaced`: Specifies that this is a namespaced resource rather than /// a cluster scoped. #[proc_macro_attribute] pub fn versioned(attrs: TokenStream, input: TokenStream) -> TokenStream { From a8a982d2a25aa28f53b65ac459284badc7461d37 Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 24 Sep 2024 09:44:50 +0200 Subject: [PATCH 4/4] chore: Add changelog entry --- crates/stackable-versioned/CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/stackable-versioned/CHANGELOG.md b/crates/stackable-versioned/CHANGELOG.md index 053abf133..b658a4c50 100644 --- a/crates/stackable-versioned/CHANGELOG.md +++ b/crates/stackable-versioned/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Add forwarding of `singular`, `plural`, and `namespaced` arguments in `k8s()` + ([#873]). + +[#873]: https://github.com/stackabletech/operator-rs/pull/873 + ## [0.2.0] - 2024-09-19 ### Added