@@ -17,36 +17,59 @@ use crate::{Result, Error};
17
17
/// CustomResource purposefully ignored from this list.
18
18
#[ derive( Debug , Clone ) ]
19
19
pub enum ResourceType {
20
- Nodes ,
21
- Deploys ( Option < String > ) ,
22
- Pods ( Option < String > ) ,
20
+ V1Node ,
21
+ V1Deployment ( Option < String > ) ,
22
+ V1Pod ( Option < String > ) ,
23
+ V1DaemonSet ( Option < String > ) ,
24
+ V1ReplicaSet ( Option < String > ) ,
25
+ V1StatefulSet ( Option < String > ) ,
23
26
}
24
27
impl Into < ApiResource > for ResourceType {
25
28
fn into ( self ) -> ApiResource {
26
29
match self {
27
- ResourceType :: Nodes => ApiResource {
30
+ ResourceType :: V1Node => ApiResource {
28
31
group : "" . into ( ) ,
29
32
resource : "nodes" . into ( ) ,
30
33
version : "v1" . into ( ) ,
31
34
namespace : None ,
32
35
prefix : "api" . into ( )
33
36
} ,
34
- ResourceType :: Deploys ( ns) => ApiResource {
37
+ ResourceType :: V1Deployment ( ns) => ApiResource {
35
38
group : "apps" . into ( ) ,
36
39
resource : "deployments" . into ( ) ,
37
40
version : "v1" . into ( ) ,
38
41
namespace : ns,
39
42
prefix : "apis" . into ( ) ,
40
43
} ,
41
- ResourceType :: Pods ( ns) => ApiResource {
44
+ ResourceType :: V1Pod ( ns) => ApiResource {
42
45
group : "" . into ( ) ,
43
46
resource : "pods" . into ( ) ,
44
47
version : "v1" . into ( ) ,
45
48
namespace : ns,
46
49
prefix : "api" . into ( ) ,
47
50
} ,
51
+ ResourceType :: V1DaemonSet ( ns) => ApiResource {
52
+ group : "apps" . into ( ) ,
53
+ resource : "daemonsets" . into ( ) ,
54
+ version : "v1" . into ( ) ,
55
+ namespace : ns,
56
+ prefix : "apis" . into ( ) ,
57
+ } ,
58
+ ResourceType :: V1ReplicaSet ( ns) => ApiResource {
59
+ group : "apps" . into ( ) ,
60
+ resource : "replicasets" . into ( ) ,
61
+ version : "v1" . into ( ) ,
62
+ namespace : ns,
63
+ prefix : "apis" . into ( ) ,
64
+ } ,
65
+ ResourceType :: V1StatefulSet ( ns) => ApiResource {
66
+ group : "apps" . into ( ) ,
67
+ resource : "statefulsets" . into ( ) ,
68
+ version : "v1" . into ( ) ,
69
+ namespace : ns,
70
+ prefix : "apis" . into ( ) ,
71
+ } ,
48
72
}
49
-
50
73
}
51
74
}
52
75
@@ -86,7 +109,7 @@ impl ToString for ApiResource {
86
109
let g = if self . group == "" { "" . into ( ) } else { format ! ( "{}/" , self . group) } ;
87
110
let v = if self . version == "" { "" . into ( ) } else { format ! ( "{}/" , self . version) } ;
88
111
let n = if let Some ( ns) = & self . namespace { format ! ( "namespaces/{}/" , ns) } else { "" . into ( ) } ;
89
- format ! ( "/{prefix}{group}{version}{namespaces}{resource}? " ,
112
+ format ! ( "/{prefix}{group}{version}{namespaces}{resource}" ,
90
113
prefix = pref,
91
114
group = g,
92
115
version = v,
@@ -101,7 +124,7 @@ impl ToString for ApiResource {
101
124
/// Constructed internally with a builder on Informer and Reflector,
102
125
/// but can be passed to the helper function of ApiResource.
103
126
#[ derive( Default , Clone ) ]
104
- pub struct QueryParams {
127
+ pub struct GetParams {
105
128
pub field_selector : Option < String > ,
106
129
pub include_uninitialized : bool ,
107
130
pub label_selector : Option < String > ,
@@ -110,8 +133,8 @@ pub struct QueryParams {
110
133
111
134
impl ApiResource {
112
135
/// Create a list request to fully re-fetch the state
113
- pub fn list_all_resource_entries ( & self , par : & QueryParams ) -> Result < http:: Request < Vec < u8 > > > {
114
- let mut qp = url:: form_urlencoded:: Serializer :: new ( self . to_string ( ) ) ;
136
+ pub fn list_all_resource_entries ( & self , par : & GetParams ) -> Result < http:: Request < Vec < u8 > > > {
137
+ let mut qp = url:: form_urlencoded:: Serializer :: new ( self . to_string ( ) + "?" ) ;
115
138
116
139
if let Some ( fields) = & par. field_selector {
117
140
qp. append_pair ( "fieldSelector" , & fields) ;
@@ -129,8 +152,8 @@ impl ApiResource {
129
152
}
130
153
131
154
/// Create a minimial list request to seed an initial resourceVersion
132
- pub fn list_zero_resource_entries ( & self , par : & QueryParams ) -> Result < http:: Request < Vec < u8 > > > {
133
- let mut qp = url:: form_urlencoded:: Serializer :: new ( self . to_string ( ) ) ;
155
+ pub fn list_zero_resource_entries ( & self , par : & GetParams ) -> Result < http:: Request < Vec < u8 > > > {
156
+ let mut qp = url:: form_urlencoded:: Serializer :: new ( self . to_string ( ) + "?" ) ;
134
157
qp. append_pair ( "limit" , "1" ) ; // can't have 0..
135
158
if par. include_uninitialized {
136
159
qp. append_pair ( "includeUninitialized" , "true" ) ;
@@ -142,8 +165,8 @@ impl ApiResource {
142
165
}
143
166
144
167
/// Create watch request for a ApiResource at a given version
145
- pub fn watch_resource_entries_after ( & self , par : & QueryParams , ver : & str ) -> Result < http:: Request < Vec < u8 > > > {
146
- let mut qp = url:: form_urlencoded:: Serializer :: new ( self . to_string ( ) ) ;
168
+ pub fn watch_resource_entries_after ( & self , par : & GetParams , ver : & str ) -> Result < http:: Request < Vec < u8 > > > {
169
+ let mut qp = url:: form_urlencoded:: Serializer :: new ( self . to_string ( ) + "?" ) ;
147
170
148
171
qp. append_pair ( "watch" , "true" ) ;
149
172
qp. append_pair ( "resourceVersion" , ver) ;
@@ -163,9 +186,34 @@ impl ApiResource {
163
186
let mut req = http:: Request :: get ( urlstr) ;
164
187
req. body ( vec ! [ ] ) . map_err ( Error :: from)
165
188
}
189
+
190
+ pub fn replace_named_status ( & self , name : & str ) -> Result < http:: Request < Vec < u8 > > > {
191
+ let base_url = format ! ( "{base}/{name}/status" , base = self . to_string( ) , name = name) ;
192
+ let mut qp = url:: form_urlencoded:: Serializer :: new ( base_url) ;
193
+ let urlstr = qp. finish ( ) ;
194
+ let mut req = http:: Request :: patch ( urlstr) ;
195
+ req. body ( vec ! [ ] ) . map_err ( Error :: from)
196
+ }
166
197
}
167
198
199
+ #[ test]
200
+ fn get_paths ( ) {
201
+ let r : ApiResource = ResourceType :: V1Deployment ( Some ( "ns" . into ( ) ) ) . into ( ) ;
202
+ let gp = GetParams :: default ( ) ;
203
+ let req = r. list_all_resource_entries ( & gp) . unwrap ( ) ;
204
+ assert_eq ! ( req. uri( ) , "/apis/apps/v1/namespaces/ns/deployments" ) ;
168
205
206
+ let r2 : ApiResource = ResourceType :: V1Pod ( Some ( "ns" . into ( ) ) ) . into ( ) ;
207
+ let req2 = r2. watch_resource_entries_after ( & gp, "0" ) . unwrap ( ) ;
208
+ assert_eq ! ( req2. uri( ) , "/api/v1/namespaces/ns/pods?&watch=true&resourceVersion=0&timeoutSeconds=10" ) ;
209
+ }
210
+
211
+ #[ test]
212
+ fn replace_paths ( ) {
213
+ let r : ApiResource = ResourceType :: V1Node . into ( ) ;
214
+ let req = r. replace_named_status ( "mynode" ) . unwrap ( ) ;
215
+ assert_eq ! ( req. uri( ) , "/api/v1/nodes/mynode/status" ) ;
216
+ }
169
217
170
218
// -------------------------------------------------------
171
219
0 commit comments