Skip to content

Commit 0dfd756

Browse files
committed
Code cleanup, features and optimization
1 parent f7715ab commit 0dfd756

25 files changed

+151
-406
lines changed

src/config.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
use serde::{Deserialize, Serialize};
21
use std::fs;
32
use std::sync::Arc;
43

4+
use serde::{Deserialize, Serialize};
5+
56
#[derive(Serialize, Deserialize)]
67
pub struct EpsilonConfig {
78
pub proxy: ProxyConfig,

src/context.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use crate::{EpsilonApi, InstanceProvider, QueueProvider, TemplateProvider};
21
use std::sync::Arc;
32

3+
use crate::{EpsilonApi, InstanceProvider, QueueProvider, TemplateProvider};
4+
45
pub struct Context {
56
epsilon_api: EpsilonApi,
67
template_provider: Arc<TemplateProvider>,

src/controller/context.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
use crate::controller::definitions::epsilon_instance::EpsilonInstance;
2-
use crate::TemplateProvider;
1+
use std::sync::Arc;
2+
33
use k8s_openapi::api::core::v1::Pod;
44
use kube::Api;
5-
use std::sync::Arc;
5+
6+
use crate::controller::definitions::epsilon_instance::EpsilonInstance;
7+
use crate::TemplateProvider;
68

79
pub struct Context {
810
pub pod_api: Api<Pod>,

src/controller/definitions/epsilon_instance.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::sync::Arc;
44
use crate::epsilon::server::instances::common::instance_type::InstanceType;
55
use crate::epsilon::server::instances::common::state::EpsilonState;
66
use crate::EResult;
7-
use anyhow::format_err;
7+
88
use async_minecraft_ping::{ConnectionConfig, StatusResponse};
99
use kube::CustomResource;
1010
use schemars::JsonSchema;

src/controller/epsilon_controller.rs

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,22 @@ use crate::controller::definitions::epsilon_instance::{
55
use crate::controller::definitions::epsilon_queue::EpsilonQueue;
66
use crate::epsilon::server::instances::common::state::EpsilonState;
77
use crate::{EResult, TemplateProvider};
8+
use anyhow::format_err;
89
use futures::stream::StreamExt;
910
use k8s_openapi::api::core::v1::{
1011
ConfigMapEnvSource, Container, EnvFromSource, ExecAction, Pod, PodSpec, Probe,
11-
ResourceRequirements,
1212
};
13-
use k8s_openapi::apimachinery::pkg::apis::meta::v1::{ObjectMeta, OwnerReference};
13+
use k8s_openapi::apimachinery::pkg::apis::meta::v1::ObjectMeta;
1414
use kube::api::{DeleteParams, ListParams, Patch, PatchParams, PostParams};
1515
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;
2118
use kube::{Api, Client, Config};
2219
use kube::{Error, Resource};
2320
use serde_json::json;
24-
use std::collections::{BTreeMap, HashMap};
21+
use std::collections::BTreeMap;
2522
use std::env;
2623
use std::sync::Arc;
27-
use std::time::Duration;
2824

2925
pub struct EpsilonController {
3026
context: Arc<Context>,
@@ -36,7 +32,7 @@ impl EpsilonController {
3632
namespace: &str,
3733
instance_provider: &Arc<TemplateProvider>,
3834
) -> 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");
4036
let client = Client::try_from(config).expect("Failed to create kube client");
4137

4238
let pod_api: Api<Pod> = Api::namespaced(client.clone(), namespace);
@@ -61,7 +57,7 @@ impl EpsilonController {
6157
.run(Self::reconcile, Self::on_error, clone_context)
6258
.for_each(|res| async move {
6359
match res {
64-
Ok(o) => {}
60+
Ok(_) => {}
6561
Err(e) => debug!("Reconcile failed: {:?}", e),
6662
}
6763
})
@@ -88,10 +84,9 @@ impl EpsilonController {
8884

8985
let instance_metadata = &epsilon_instance.metadata;
9086
let instance_spec = &epsilon_instance.spec;
91-
let instance_status = &epsilon_instance.status;
87+
let instance_status = epsilon_instance.status.clone();
9288

9389
let instance_name = instance_metadata.name.as_ref().unwrap();
94-
9590
let template_name = &instance_spec.template;
9691

9792
if let Ok(pod_option) = pod_api.get_opt(instance_name).await {
@@ -103,7 +98,6 @@ impl EpsilonController {
10398
let instance_resource = &template.resources;
10499

105100
let mut labels = BTreeMap::new();
106-
labels.insert(String::from("epsilon.fr/template"), template_name.clone());
107101
labels.insert(
108102
String::from("epsilon.fr/instance"),
109103
instance_type.to_string(),
@@ -167,9 +161,6 @@ impl EpsilonController {
167161
pod_api.create(&PostParams::default(), &pod).await?;
168162
}
169163
Some(pod) => {
170-
let pod_metadata = &pod.metadata;
171-
172-
let pod_spec = pod.spec.as_ref().unwrap();
173164
let pod_status = pod.status.as_ref().unwrap();
174165

175166
let pod_ip = pod_status.pod_ip.as_ref();
@@ -194,13 +185,12 @@ impl EpsilonController {
194185
EpsilonState::Stopping
195186
};
196187

197-
let new_status = match instance_status {
188+
let mut new_status = match instance_status {
198189
None => {
199190
let template =
200191
template_provider.get_template(template_name).await.unwrap();
201192

202193
let instance_type = &template.t;
203-
let instance_resource = &template.resources;
204194

205195
EpsilonInstanceStatus {
206196
ip: pod_ip.cloned(),
@@ -219,13 +209,11 @@ impl EpsilonController {
219209
state,
220210
}
221211
}
222-
Some(status) => {
223-
let mut new_status = status.clone();
212+
Some(mut status) => {
213+
status.ip = pod_ip.cloned();
214+
status.state = state;
224215

225-
new_status.ip = pod_ip.cloned();
226-
new_status.state = state;
227-
228-
new_status
216+
status
229217
}
230218
};
231219

@@ -237,17 +225,17 @@ impl EpsilonController {
237225
)
238226
.await?;
239227

240-
let state = new_status.state;
241-
let close = new_status.close;
228+
let state = &new_status.state;
229+
let close = &new_status.close;
242230

243-
if state == EpsilonState::Stopping && !close {
244-
debug!("DELETE {}", instance_name);
231+
if *state == EpsilonState::Stopping && !*close {
232+
new_status.close = true;
245233

246234
epsilon_instance_api
247235
.patch_status(
248236
instance_name,
249237
&PatchParams::default(),
250-
&Patch::Merge(json!({ "status": { "close": true } })),
238+
&Patch::Merge(json!({ "status": new_status })),
251239
)
252240
.await?;
253241

@@ -278,12 +266,6 @@ impl EpsilonController {
278266

279267
pub async fn create_epsilon_instance(&self, template_name: &str) -> EResult<EpsilonInstance> {
280268
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);
287269

288270
let epsilon_instance = EpsilonInstance {
289271
metadata: ObjectMeta {
@@ -301,6 +283,28 @@ impl EpsilonController {
301283
.await?)
302284
}
303285

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+
304308
pub fn get_epsilon_instance_api(&self) -> &Api<EpsilonInstance> {
305309
&self.context.epsilon_instance_api
306310
}

src/epsilon/api/epsilon_api.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use crate::epsilon::api::common::epsilon_events::EpsilonEvent;
21
use tokio::sync::broadcast::{channel, Receiver, Sender};
32

3+
use crate::epsilon::api::common::epsilon_events::EpsilonEvent;
4+
45
pub struct EpsilonApi {
56
channel: Sender<EpsilonEvent>,
67
}

src/epsilon/api/routes.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
use crate::epsilon::api::common::epsilon_events::EpsilonEvent;
2-
use crate::Context;
3-
use rocket::response::stream::{Event, EventStream};
1+
use std::sync::Arc;
2+
43
use rocket::{Shutdown, State};
4+
use rocket::response::stream::{Event, EventStream};
55
use serde_json::json;
6-
use std::sync::Arc;
76
use tokio::select;
87
use tokio::sync::broadcast::error::RecvError;
98

9+
use crate::Context;
10+
use crate::epsilon::api::common::epsilon_events::EpsilonEvent;
11+
1012
#[rocket::get("/ping")]
1113
pub async fn ping() -> &'static str {
1214
"Pong"

src/epsilon/queue/common/epsilon_queue.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
use crate::epsilon::queue::common::group::Group;
21
use std::collections::{HashSet, VecDeque};
32

3+
use crate::epsilon::queue::common::group::Group;
4+
45
pub struct Queue {
56
queue: VecDeque<Group>,
67
in_queue: HashSet<String>,

src/epsilon/queue/queue_provider.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
use crate::epsilon::queue::common::epsilon_queue::Queue;
2-
use crate::{EResult, InstanceProvider, TemplateProvider};
31
use std::collections::HashMap;
42
use std::sync::Arc;
3+
54
use tokio::sync::RwLock;
65

6+
use crate::epsilon::queue::common::epsilon_queue::Queue;
7+
use crate::{EResult, InstanceProvider, TemplateProvider};
8+
79
pub struct QueueProvider {
810
queue_map: HashMap<String, RwLock<Queue>>,
911
}
1012

1113
impl QueueProvider {
1214
pub async fn new(
13-
instance_provider: &InstanceProvider,
15+
_instance_provider: &InstanceProvider,
1416
template_provider: &Arc<TemplateProvider>,
1517
) -> EResult<QueueProvider> {
1618
let mut map = HashMap::new();

src/epsilon/queue/routes.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
use crate::epsilon::queue::common::group::Group;
2-
use crate::Context;
1+
use std::sync::Arc;
2+
33
use rocket::serde::json::Json;
44
use rocket::State;
5-
use std::sync::Arc;
5+
6+
use crate::Context;
7+
use crate::epsilon::queue::common::group::Group;
68

79
#[rocket::post("/push", data = "<body>")]
810
pub async fn push(body: Json<Group>, context: &State<Arc<Context>>) {

0 commit comments

Comments
 (0)