@@ -5,26 +5,22 @@ use crate::controller::definitions::epsilon_instance::{
5
5
use crate :: controller:: definitions:: epsilon_queue:: EpsilonQueue ;
6
6
use crate :: epsilon:: server:: instances:: common:: state:: EpsilonState ;
7
7
use crate :: { EResult , TemplateProvider } ;
8
+ use anyhow:: format_err;
8
9
use futures:: stream:: StreamExt ;
9
10
use k8s_openapi:: api:: core:: v1:: {
10
11
ConfigMapEnvSource , Container , EnvFromSource , ExecAction , Pod , PodSpec , Probe ,
11
- ResourceRequirements ,
12
12
} ;
13
- use k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: { ObjectMeta , OwnerReference } ;
13
+ use k8s_openapi:: apimachinery:: pkg:: apis:: meta:: v1:: ObjectMeta ;
14
14
use kube:: api:: { DeleteParams , ListParams , Patch , PatchParams , PostParams } ;
15
15
use kube:: runtime:: controller:: Action ;
16
- use kube:: runtime:: controller:: Error :: ObjectNotFound ;
17
- use kube:: runtime:: finalizer:: Event ;
18
- use kube:: runtime:: reflector:: Store ;
19
- use kube:: runtime:: { finalizer, reflector, watcher, Controller } ;
20
- use kube:: ResourceExt ;
16
+ use kube:: runtime:: reflector:: { ObjectRef , Store } ;
17
+ use kube:: runtime:: Controller ;
21
18
use kube:: { Api , Client , Config } ;
22
19
use kube:: { Error , Resource } ;
23
20
use serde_json:: json;
24
- use std:: collections:: { BTreeMap , HashMap } ;
21
+ use std:: collections:: BTreeMap ;
25
22
use std:: env;
26
23
use std:: sync:: Arc ;
27
- use std:: time:: Duration ;
28
24
29
25
pub struct EpsilonController {
30
26
context : Arc < Context > ,
@@ -36,7 +32,7 @@ impl EpsilonController {
36
32
namespace : & str ,
37
33
instance_provider : & Arc < TemplateProvider > ,
38
34
) -> Arc < EpsilonController > {
39
- let mut config = Config :: infer ( ) . await . expect ( "Failed to load kube config" ) ;
35
+ let config = Config :: infer ( ) . await . expect ( "Failed to load kube config" ) ;
40
36
let client = Client :: try_from ( config) . expect ( "Failed to create kube client" ) ;
41
37
42
38
let pod_api: Api < Pod > = Api :: namespaced ( client. clone ( ) , namespace) ;
@@ -61,7 +57,7 @@ impl EpsilonController {
61
57
. run ( Self :: reconcile, Self :: on_error, clone_context)
62
58
. for_each ( |res| async move {
63
59
match res {
64
- Ok ( o ) => { }
60
+ Ok ( _ ) => { }
65
61
Err ( e) => debug ! ( "Reconcile failed: {:?}" , e) ,
66
62
}
67
63
} )
@@ -88,10 +84,9 @@ impl EpsilonController {
88
84
89
85
let instance_metadata = & epsilon_instance. metadata ;
90
86
let instance_spec = & epsilon_instance. spec ;
91
- let instance_status = & epsilon_instance. status ;
87
+ let instance_status = epsilon_instance. status . clone ( ) ;
92
88
93
89
let instance_name = instance_metadata. name . as_ref ( ) . unwrap ( ) ;
94
-
95
90
let template_name = & instance_spec. template ;
96
91
97
92
if let Ok ( pod_option) = pod_api. get_opt ( instance_name) . await {
@@ -103,7 +98,6 @@ impl EpsilonController {
103
98
let instance_resource = & template. resources ;
104
99
105
100
let mut labels = BTreeMap :: new ( ) ;
106
- labels. insert ( String :: from ( "epsilon.fr/template" ) , template_name. clone ( ) ) ;
107
101
labels. insert (
108
102
String :: from ( "epsilon.fr/instance" ) ,
109
103
instance_type. to_string ( ) ,
@@ -167,9 +161,6 @@ impl EpsilonController {
167
161
pod_api. create ( & PostParams :: default ( ) , & pod) . await ?;
168
162
}
169
163
Some ( pod) => {
170
- let pod_metadata = & pod. metadata ;
171
-
172
- let pod_spec = pod. spec . as_ref ( ) . unwrap ( ) ;
173
164
let pod_status = pod. status . as_ref ( ) . unwrap ( ) ;
174
165
175
166
let pod_ip = pod_status. pod_ip . as_ref ( ) ;
@@ -194,13 +185,12 @@ impl EpsilonController {
194
185
EpsilonState :: Stopping
195
186
} ;
196
187
197
- let new_status = match instance_status {
188
+ let mut new_status = match instance_status {
198
189
None => {
199
190
let template =
200
191
template_provider. get_template ( template_name) . await . unwrap ( ) ;
201
192
202
193
let instance_type = & template. t ;
203
- let instance_resource = & template. resources ;
204
194
205
195
EpsilonInstanceStatus {
206
196
ip : pod_ip. cloned ( ) ,
@@ -219,13 +209,11 @@ impl EpsilonController {
219
209
state,
220
210
}
221
211
}
222
- Some ( status) => {
223
- let mut new_status = status. clone ( ) ;
212
+ Some ( mut status) => {
213
+ status. ip = pod_ip. cloned ( ) ;
214
+ status. state = state;
224
215
225
- new_status. ip = pod_ip. cloned ( ) ;
226
- new_status. state = state;
227
-
228
- new_status
216
+ status
229
217
}
230
218
} ;
231
219
@@ -237,17 +225,17 @@ impl EpsilonController {
237
225
)
238
226
. await ?;
239
227
240
- let state = new_status. state ;
241
- let close = new_status. close ;
228
+ let state = & new_status. state ;
229
+ let close = & new_status. close ;
242
230
243
- if state == EpsilonState :: Stopping && !close {
244
- debug ! ( "DELETE {}" , instance_name ) ;
231
+ if * state == EpsilonState :: Stopping && !* close {
232
+ new_status . close = true ;
245
233
246
234
epsilon_instance_api
247
235
. patch_status (
248
236
instance_name,
249
237
& PatchParams :: default ( ) ,
250
- & Patch :: Merge ( json ! ( { "status" : { "close" : true } } ) ) ,
238
+ & Patch :: Merge ( json ! ( { "status" : new_status } ) ) ,
251
239
)
252
240
. await ?;
253
241
@@ -278,12 +266,6 @@ impl EpsilonController {
278
266
279
267
pub async fn create_epsilon_instance ( & self , template_name : & str ) -> EResult < EpsilonInstance > {
280
268
let epsilon_instance_api = & self . context . epsilon_instance_api ;
281
- let template_provider = & self . context . template_provider ;
282
-
283
- let template = template_provider. get_template ( template_name) . await ?;
284
- let instance_type = & template. t ;
285
-
286
- let is_hub = template_provider. is_hub ( & template) ;
287
269
288
270
let epsilon_instance = EpsilonInstance {
289
271
metadata : ObjectMeta {
@@ -301,6 +283,28 @@ impl EpsilonController {
301
283
. await ?)
302
284
}
303
285
286
+ pub async fn in_game_epsilon_instance ( & self , instance_name : & str ) -> EResult < ( ) > {
287
+ let epsilon_instance_api = & self . context . epsilon_instance_api ;
288
+ let store = & self . store ;
289
+
290
+ if let Some ( epsilon_instance) = store. get ( & ObjectRef :: new ( instance_name) ) {
291
+ let mut instance_status = epsilon_instance. status . as_ref ( ) . unwrap ( ) . clone ( ) ;
292
+ instance_status. state = EpsilonState :: InGame ;
293
+
294
+ epsilon_instance_api
295
+ . patch_status (
296
+ instance_name,
297
+ & PatchParams :: default ( ) ,
298
+ & Patch :: Merge ( json ! ( { "status" : instance_status } ) ) ,
299
+ )
300
+ . await ?;
301
+
302
+ Ok ( ( ) )
303
+ } else {
304
+ Err ( format_err ! ( "Instance not found: {}" , instance_name) )
305
+ }
306
+ }
307
+
304
308
pub fn get_epsilon_instance_api ( & self ) -> & Api < EpsilonInstance > {
305
309
& self . context . epsilon_instance_api
306
310
}
0 commit comments