1- use kube:: CustomResource ;
1+ use std:: { fs:: File , path:: Path } ;
2+
3+ use kube:: { CustomResource , core:: conversion:: ConversionReview } ;
24use schemars:: JsonSchema ;
35use serde:: { Deserialize , Serialize } ;
46use stackable_versioned:: versioned;
57
8+ // Fixes an error with this function being marked as unused. See
9+ // - https://stackoverflow.com/a/67902444
10+ // - https://github.com/rust-lang/rust/issues/46379
11+ #[ allow( dead_code) ]
12+ pub fn convert_via_file ( path : & Path ) -> ( ConversionReview , ConversionReview ) {
13+ let request: ConversionReview =
14+ serde_json:: from_reader ( File :: open ( path) . expect ( "failed to open test file" ) )
15+ . expect ( "failed to parse ConversionReview from test file" ) ;
16+ let response = Person :: try_convert ( request. clone ( ) ) ;
17+
18+ ( request, response)
19+ }
20+
621#[ versioned(
7- k8s( group = "test.stackable.tech" , ) ,
822 version( name = "v1alpha1" ) ,
923 version( name = "v1alpha2" ) ,
1024 version( name = "v1beta1" ) ,
1125 version( name = "v2" ) ,
12- version( name = "v3" )
13- ) ]
14- #[ derive(
15- Clone ,
16- Debug ,
17- Eq ,
18- Hash ,
19- Ord ,
20- PartialEq ,
21- PartialOrd ,
22- CustomResource ,
23- Deserialize ,
24- JsonSchema ,
25- Serialize ,
26+ version( name = "v3" ) ,
27+ options( k8s( experimental_conversion_tracking) )
2628) ]
27- #[ serde( rename_all = "camelCase" ) ]
28- pub struct PersonSpec {
29- username : String ,
29+ pub mod versioned {
30+ #[ versioned( crd( group = "test.stackable.tech" ) ) ]
31+ #[ derive(
32+ Clone ,
33+ Debug ,
34+ Eq ,
35+ Hash ,
36+ Ord ,
37+ PartialEq ,
38+ PartialOrd ,
39+ CustomResource ,
40+ Deserialize ,
41+ JsonSchema ,
42+ Serialize ,
43+ ) ]
44+ #[ serde( rename_all = "camelCase" ) ]
45+ pub struct PersonSpec {
46+ username : String ,
47+
48+ // In v1alpha2 first and last name have been added
49+ #[ versioned( added( since = "v1alpha2" ) ) ]
50+ first_name : String ,
3051
31- // In v1alpha2 first and last name have been added
32- #[ versioned( added( since = "v1alpha2" ) ) ]
33- first_name : String ,
34- #[ versioned( added( since = "v1alpha2" ) ) ]
35- last_name : String ,
52+ #[ versioned( added( since = "v1alpha2" ) ) ]
53+ last_name : String ,
3654
37- // We started out with a enum. As we *need* to provide a default, we have a Unknown variant.
38- // Afterwards we figured let's be more flexible and accept any arbitrary String.
39- #[ versioned(
40- added( since = "v2" , default = "default_gender" ) ,
41- changed( since = "v3" , from_type = "Gender" )
55+ // We started out with a enum. As we *need* to provide a default, we have a Unknown variant.
56+ // Afterwards we figured let's be more flexible and accept any arbitrary String.
57+ #[ versioned(
58+ added( since = "v2" , default = "default_gender" ) ,
59+ changed( since = "v3" , from_type = "Gender" )
60+ ) ]
61+ gender : String ,
62+
63+ #[ versioned( nested) ]
64+ socials : Socials ,
65+ }
66+
67+ #[ derive(
68+ Clone , Debug , Eq , PartialEq , Hash , PartialOrd , Ord , Deserialize , Serialize , JsonSchema ,
4269 ) ]
43- gender : String ,
44- }
70+ pub struct Socials {
71+ email : String ,
4572
46- fn default_gender ( ) -> Gender {
47- Gender :: Unknown
73+ #[ versioned( added( since = "v1beta1" ) ) ]
74+ mastodon : String ,
75+ }
4876}
4977
5078#[ derive(
@@ -57,6 +85,10 @@ pub enum Gender {
5785 Female ,
5886}
5987
88+ fn default_gender ( ) -> Gender {
89+ Gender :: Unknown
90+ }
91+
6092impl From < Gender > for String {
6193 fn from ( value : Gender ) -> Self {
6294 match value {
0 commit comments