4
4
use serde_json:: json;
5
5
6
6
use kube:: {
7
- api:: { Api , PostResponse , PostParams , Object } ,
7
+ api:: { Api , PostResponse , PostParams , DeleteParams , Object , PropagationPolicy , Void } ,
8
8
client:: APIClient ,
9
9
config,
10
10
} ;
@@ -23,11 +23,16 @@ pub struct FooSpec {
23
23
info : String ,
24
24
}
25
25
26
- #[ derive( Deserialize , Serialize , Clone , Debug ) ]
26
+ #[ derive( Deserialize , Serialize , Clone , Debug , Default ) ]
27
27
pub struct FooStatus {
28
28
is_bad : bool ,
29
29
}
30
30
31
+ // shorthands
32
+ type Foo = Object < FooSpec , FooStatus > ;
33
+ type FooMeta = Object < Void , Void > ;
34
+ type FullCrd = Object < CrdSpec , CrdStatus > ;
35
+
31
36
fn main ( ) -> Result < ( ) , failure:: Error > {
32
37
std:: env:: set_var ( "RUST_LOG" , "info,kube=trace" ) ;
33
38
env_logger:: init ( ) ;
@@ -37,6 +42,20 @@ fn main() -> Result<(), failure::Error> {
37
42
// Manage the CRD
38
43
let crds = Api :: v1beta1CustomResourceDefinition ( ) ;
39
44
45
+ // Delete any old versions of it first:
46
+ let dp = DeleteParams {
47
+ propagation_policy : Some ( PropagationPolicy :: Foreground ) ,
48
+ ..Default :: default ( )
49
+ } ;
50
+ //let req = crds.delete("foos.clux.dev", &dp)?;
51
+ //if let Ok(res) = client.request::<FullCrd>(req) {
52
+ // info!("Deleted {}: ({:?})", res.metadata.name, res.status.conditions.unwrap().last());
53
+ // use std::{thread, time};
54
+ // let five_secs = time::Duration::from_millis(5000);
55
+ // thread::sleep(five_secs);
56
+ // // even foreground policy doesn't seem to block here..
57
+ //}
58
+
40
59
// Create the CRD so we can create Foos in kube
41
60
let foocrd = json ! ( {
42
61
"metadata" : {
@@ -50,49 +69,68 @@ fn main() -> Result<(), failure::Error> {
50
69
"plural" : "foos" ,
51
70
"singular" : "foo" ,
52
71
"kind" : "Foo" ,
53
- }
54
- }
72
+ } ,
73
+ "subresources" : {
74
+ "status" : { }
75
+ } ,
76
+ } ,
55
77
} ) ;
56
78
79
+ info ! ( "Creating CRD foos.clux.dev" ) ;
57
80
let pp = PostParams :: default ( ) ;
58
81
let req = crds. create ( & pp, serde_json:: to_vec ( & foocrd) ?) ?;
59
- if let Ok ( res) = client. request :: < Object < CrdSpec , CrdStatus > > ( req) {
82
+ if let Ok ( res) = client. request :: < FullCrd > ( req) {
60
83
info ! ( "Created {}" , res. metadata. name) ;
61
84
debug ! ( "Created CRD: {:?}" , res. spec) ;
62
85
} else {
63
- // TODO: need error code here for ease
86
+ // TODO: need error code here for ease - 409 common
64
87
}
65
88
66
-
67
89
// Manage the Foo CR
68
- let foos = Api :: customResource ( "foos.clux.dev" ) . version ( "v1" ) ;
90
+ let foos = Api :: customResource ( "foos" )
91
+ . version ( "v1" )
92
+ . group ( "clux.dev" )
93
+ . within ( "dev" ) ;
69
94
70
- // Create some Foos
95
+ // Create Foo baz
96
+ info ! ( "Creating Foo instance baz" ) ;
71
97
let f1 = json ! ( {
72
- "metadata" : { "name" : "baz" } ,
73
- "spec" : FooSpec { name: "baz" . into( ) , info: "unpatched baz" . into( ) }
98
+ "apiVersion" : "clux.dev/v1" ,
99
+ "kind" : "Foo" ,
100
+ "metadata" : { "name" : "baz" , "info" : "old" } ,
74
101
} ) ;
75
- foos. create ( & pp, serde_json:: to_vec ( & f1) ?) ?;
102
+ let req = foos. create ( & pp, serde_json:: to_vec ( & f1) ?) ?;
103
+ let o = client. request :: < FooMeta > ( req) ?;
104
+ info ! ( "Created {}" , o. metadata. name) ;
105
+
106
+ // Modify a Foo baz with a Patch
107
+ info ! ( "Patch Foo instance baz" ) ;
108
+ let patch = json ! ( {
109
+ "spec" : { "info" : "patched baz" }
110
+ } ) ;
111
+ let req = foos. patch ( "baz" , & pp, serde_json:: to_vec ( & patch) ?) ?;
112
+ let o = client. request :: < Foo > ( req) ?;
113
+ info ! ( "Patched {} with new name: {}" , o. metadata. name, o. spec. name) ;
76
114
115
+ info ! ( "Create Foo instance qux" ) ;
77
116
let f2 = json ! ( {
117
+ "apiVersion" : "clux.dev/v1" ,
118
+ "kind" : "Foo" ,
78
119
"metadata" : { "name" : "qux" } ,
79
- "spec" : FooSpec { name: "qux" . into( ) , info: "unpatched qux" . into( ) }
120
+ "spec" : FooSpec { name: "qux" . into( ) , info: "unpatched qux" . into( ) } ,
121
+ "status" : FooStatus :: default ( ) ,
80
122
} ) ;
81
- foos. create ( & pp, serde_json:: to_vec ( & f2) ?) ?;
82
-
123
+ let req = foos. create ( & pp, serde_json:: to_vec ( & f2) ?) ?;
124
+ let o = client. request :: < FooMeta > ( req) ?;
125
+ info ! ( "Created {}" , o. metadata. name) ;
83
126
84
- // Modify a Foo with a Patch
85
- //let patch = json!( info => "patched baz" );
86
- //let req = foos.patch("baz", &pp, serde_json::to_vec(&patch)?)?;
87
- //client.request::<PostResponse<Object<FooSpec, FooStatus>>>(req)?;
88
127
89
- // shorthand
90
- type Foo = Object < FooSpec , FooStatus > ;
91
- // TODO: request should return statuscode as a better useability!
92
-
93
- // Set its status:
94
- let fs = FooStatus { is_bad : true } ;
95
- let req = foos. replace_status ( "baz" , & pp, serde_json:: to_vec ( & fs) ?) ?;
128
+ // Update status on -qux
129
+ info ! ( "Replace Status on Foo instance qux" ) ;
130
+ let fs = json ! ( {
131
+ "status" : FooStatus { is_bad: true }
132
+ } ) ;
133
+ let req = foos. replace_status ( "qux" , & pp, serde_json:: to_vec ( & fs) ?) ?;
96
134
let res = client. request :: < Foo > ( req) ?;
97
135
info ! ( "Replaced status {:?} for {}" , res. status, res. metadata. name) ;
98
136
0 commit comments