Skip to content

Commit 429791d

Browse files
committed
Content when create instance supported now !
1 parent 7b361da commit 429791d

File tree

9 files changed

+51
-24
lines changed

9 files changed

+51
-24
lines changed

resources/epsilon_instance-definition.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,19 @@ spec:
3333
properties:
3434
spec:
3535
properties:
36+
content: {}
3637
template:
3738
type: string
3839
required:
40+
- content
3941
- template
4042
type: object
4143
status:
4244
nullable: true
4345
properties:
4446
close:
4547
type: boolean
46-
content:
47-
type: string
48+
content: {}
4849
hub:
4950
type: boolean
5051
ip:

src/controller/definitions/epsilon_instance.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use async_minecraft_ping::{ConnectionConfig, StatusResponse};
99
use kube::CustomResource;
1010
use schemars::JsonSchema;
1111
use serde::{Deserialize, Serialize};
12+
use serde_json::Value;
1213
use std::time::Duration;
1314
use tokio::time::timeout;
1415

@@ -25,6 +26,7 @@ use tokio::time::timeout;
2526
)]
2627
pub struct EpsilonInstanceSpec {
2728
pub template: String,
29+
pub content: Value,
2830
}
2931

3032
#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)]
@@ -36,7 +38,7 @@ pub struct EpsilonInstanceStatus {
3638

3739
pub hub: bool,
3840

39-
pub content: String,
41+
pub content: Value,
4042

4143
pub state: EpsilonState,
4244

@@ -157,7 +159,7 @@ pub struct InstanceJson {
157159
pub name: String,
158160
pub template: String,
159161

160-
pub content: String,
162+
pub content: Value,
161163

162164
pub hub: bool,
163165

src/controller/epsilon_controller.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use kube::runtime::reflector::{ObjectRef, Store};
1818
use kube::runtime::Controller;
1919
use kube::{Api, Client, Config};
2020
use kube::{Error, Resource};
21-
use serde_json::json;
21+
use serde_json::{json, Value};
2222
use std::collections::BTreeMap;
2323
use std::env;
2424
use std::sync::Arc;
@@ -90,7 +90,10 @@ impl EpsilonController {
9090
let instance_status = epsilon_instance.status.clone();
9191

9292
let instance_name = epsilon_instance.get_name();
93-
let template_name = &instance_spec.template;
93+
94+
let instance_content = instance_spec.content.clone();
95+
96+
let instance_template_name = &instance_spec.template;
9497

9598
if let Ok(pod_option) = pod_api.get_opt(&instance_name).await {
9699
match pod_option {
@@ -99,7 +102,10 @@ impl EpsilonController {
99102
epsilon_instance.controller_owner_ref(&()).unwrap();
100103
instance_owner_reference.block_owner_deletion = Some(true);
101104

102-
let template = template_provider.get_template(template_name).await.unwrap();
105+
let template = template_provider
106+
.get_template(instance_template_name)
107+
.await
108+
.unwrap();
103109

104110
let instance_type = &template.t;
105111
let instance_resource = &template.resources;
@@ -121,7 +127,7 @@ impl EpsilonController {
121127
restart_policy: Some(String::from("Never")),
122128
containers: vec![Container {
123129
name: String::from("main"),
124-
image: Some(Self::get_image(&template_name)),
130+
image: Some(Self::get_image(&instance_template_name)),
125131
image_pull_policy: Some(String::from("Always")),
126132
env_from: Some(vec![
127133
EnvFromSource {
@@ -196,20 +202,22 @@ impl EpsilonController {
196202

197203
let mut new_status = match instance_status {
198204
None => {
199-
let template =
200-
template_provider.get_template(template_name).await.unwrap();
205+
let template = template_provider
206+
.get_template(instance_template_name)
207+
.await
208+
.unwrap();
201209

202210
let template_type = template.t.clone();
203211

204212
EpsilonInstanceStatus {
205213
ip: pod_ip,
206214

207-
template: template_name.to_owned(),
215+
template: instance_template_name.to_owned(),
208216
t: template_type,
209217

210218
hub: template_provider.is_hub(&template),
211219

212-
content: String::from(""),
220+
content: instance_content,
213221

214222
slots: template.slots,
215223
online: 0,
@@ -221,6 +229,7 @@ impl EpsilonController {
221229
}
222230
Some(mut status) => {
223231
status.ip = pod_ip;
232+
status.content = instance_content;
224233
status.state = state;
225234

226235
if state == EpsilonState::Running {
@@ -282,6 +291,7 @@ impl EpsilonController {
282291
pub async fn create_epsilon_instance(
283292
&self,
284293
template_name: &str,
294+
content: Value,
285295
) -> Result<EpsilonInstance, EpsilonError> {
286296
let epsilon_instance_api = &self.context.epsilon_instance_api;
287297

@@ -292,6 +302,7 @@ impl EpsilonController {
292302
},
293303
spec: EpsilonInstanceSpec {
294304
template: template_name.to_owned(),
305+
content,
295306
},
296307
status: None,
297308
};

src/epsilon/server/instances/common/instance_type.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
use std::io;
2-
use std::str::FromStr;
3-
41
use k8s_openapi::api::core::v1::ContainerPort;
52
use schemars::JsonSchema;
63
use serde::{Deserialize, Serialize};

src/epsilon/server/instances/instance_provider.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::sync::Arc;
22

33
use kube::api::DeleteParams;
4-
use kube::runtime::wait::await_condition;
4+
use serde_json::Value;
55

66
use crate::controller::definitions::epsilon_instance::EpsilonInstance;
77
use crate::epsilon::epsilon_error::EpsilonError;
@@ -23,10 +23,11 @@ impl InstanceProvider {
2323
pub async fn start_instance(
2424
&self,
2525
template_name: &str,
26+
content: Option<Value>,
2627
) -> Result<EpsilonInstance, EpsilonError> {
2728
Ok(self
2829
.epsilon_controller
29-
.create_epsilon_instance(template_name)
30+
.create_epsilon_instance(template_name, content.unwrap_or_default())
3031
.await?)
3132
}
3233

src/epsilon/server/instances/routes.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,25 @@ use std::sync::Arc;
22

33
use rocket::State;
44
use serde_json::json;
5+
use serde_json::Value;
56

67
use crate::controller::definitions::epsilon_instance::InstanceJson;
78
use crate::epsilon::epsilon_error::EpsilonError;
89
use crate::epsilon::server::instances::common::instance_type::InstanceType;
910
use crate::Context;
1011

11-
#[rocket::post("/create/<template>")]
12-
pub async fn create(template: &str, context: &State<Arc<Context>>) -> Result<(), EpsilonError> {
12+
use rocket::serde::json::Json;
13+
14+
#[rocket::post("/create/<template>", format = "json", data = "<content>")]
15+
pub async fn create(
16+
template: &str,
17+
content: Json<Value>,
18+
context: &State<Arc<Context>>,
19+
) -> Result<(), EpsilonError> {
1320
let instance_provider = context.get_instance_provider();
1421

1522
instance_provider
16-
.start_instance(template)
23+
.start_instance(template, Some(content.0))
1724
.await
1825
.map_err(|_| {
1926
EpsilonError::ApiServerError(format!(

src/tasks/hub_task.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ impl Task for HubTask {
6666
+ 1.0) as u32;
6767

6868
if hub_number < hub_necessary {
69-
instance_provider.start_instance(template_name).await?;
69+
instance_provider
70+
.start_instance(template_name, None)
71+
.await?;
7072
}
7173

7274
if hub_number > hub_necessary {

src/tasks/proxy_task.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ impl Task for ProxyTask {
3232
.await?;
3333

3434
if proxies.is_empty() {
35-
instance_provider.start_instance(template_name).await?;
35+
instance_provider
36+
.start_instance(template_name, None)
37+
.await?;
3638
}
3739

3840
Ok(())

src/tasks/queue_task.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,19 @@ impl Task for QueueTask {
4343
.await?;
4444

4545
if instances_starting.is_empty() && instances_ready.is_empty() {
46-
instance_provider.start_instance(template_name).await?;
46+
instance_provider
47+
.start_instance(template_name, None)
48+
.await?;
4749
return Ok(());
4850
}
4951

5052
let ready_available_slots_result = instances_ready.get_available_slots().await;
5153

5254
if let Ok(ready_available_slots) = ready_available_slots_result {
5355
if instances_starting.is_empty() && ready_available_slots < 1 {
54-
instance_provider.start_instance(template_name).await?;
56+
instance_provider
57+
.start_instance(template_name, None)
58+
.await?;
5559
}
5660
}
5761

0 commit comments

Comments
 (0)