Skip to content

Commit 59abe39

Browse files
committed
feat: add Start/Stop workspaces command
1 parent 6e4f74a commit 59abe39

4 files changed

Lines changed: 184 additions & 7 deletions

File tree

apps/dev_cli/src/workspace/mod.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ use helper::Helper;
44
pub mod get;
55
pub mod get_container;
66
pub mod list;
7+
pub mod restart;
8+
pub mod start;
9+
pub mod stop;
710

811
#[derive(Debug, Clone, ValueEnum)]
912
pub enum Format {
@@ -37,9 +40,17 @@ pub enum Workspace {
3740
format: Option<Format>,
3841
},
3942
/// Start a workspace by name
40-
Start {},
43+
Start {
44+
/// Wait for the workspace to be started
45+
#[arg(long)]
46+
wait: bool,
47+
},
4148
/// Stop a workspace by name
42-
Stop {},
49+
Stop {
50+
/// Wait for the workspace to be stopped
51+
#[arg(long)]
52+
wait: bool,
53+
},
4354
/// Restart a workspace by name
4455
Restart {
4556
/// Wait for the workspace to be started
@@ -67,14 +78,14 @@ impl Workspace {
6778
Workspace::List { format } => {
6879
self::Workspace::list(info, format.clone()).await;
6980
}
70-
Workspace::Start {} => {
71-
println!("Start workspace");
81+
Workspace::Start { wait } => {
82+
self::Workspace::start(info, *wait).await;
7283
}
73-
Workspace::Stop {} => {
74-
println!("Stop workspace");
84+
Workspace::Stop { wait } => {
85+
self::Workspace::stop(info, *wait).await;
7586
}
7687
Workspace::Restart { wait } => {
77-
println!("Restart workspace");
88+
self::Workspace::restart(*wait, info).await;
7889
}
7990
}
8091
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use crd::dev_work_space::DevWorkspace;
2+
use devfile::lifecycle::{start_stop::start_stop_devworkspace, wait_for_status::wait_for_status};
3+
use helper::{base_info::BaseInfo, Helper};
4+
5+
use super::Workspace;
6+
impl Workspace {
7+
#[tracing::instrument(level = "trace")]
8+
pub async fn restart(wait: bool, base_info: BaseInfo) {
9+
tracing::info!("Restarting workspace");
10+
let client = match Helper::get_client().await {
11+
Some(iencli) => iencli,
12+
None => return,
13+
};
14+
if start_stop_devworkspace(
15+
client.clone(),
16+
base_info.workspace_name.clone().unwrap(),
17+
base_info.namespace.clone(),
18+
false,
19+
)
20+
.await
21+
.is_none()
22+
{
23+
tracing::error!("Could not restart workspace");
24+
return;
25+
}
26+
tracing::info!("Waiting for workspace to stop");
27+
let devworkspace_api =
28+
Helper::get_api::<DevWorkspace>(client.clone(), base_info.namespace.clone());
29+
if wait_for_status(
30+
devworkspace_api.clone(),
31+
base_info.workspace_name.clone().unwrap(),
32+
"Stopped".to_string(),
33+
2000,
34+
150, // Fail after 5 minutes
35+
)
36+
.await
37+
.is_none()
38+
{
39+
return;
40+
}
41+
if start_stop_devworkspace(
42+
client.clone(),
43+
base_info.workspace_name.clone().unwrap(),
44+
base_info.namespace.clone(),
45+
true,
46+
)
47+
.await
48+
.is_some()
49+
{
50+
tracing::info!("Workspace restarting");
51+
} else {
52+
return;
53+
}
54+
if wait
55+
&& wait_for_status(
56+
devworkspace_api.clone(),
57+
base_info.workspace_name.clone().unwrap(),
58+
"Running".to_string(),
59+
2000,
60+
150, // Fail after 5 minutes
61+
)
62+
.await
63+
.is_some()
64+
{
65+
tracing::info!("Workspace restarted");
66+
} else if !wait {
67+
tracing::info!("Not Waiting for restart");
68+
}
69+
}
70+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use crd::dev_work_space::DevWorkspace;
2+
use devfile::lifecycle::{start_stop::start_stop_devworkspace, wait_for_status::wait_for_status};
3+
use helper::{base_info::BaseInfo, Helper};
4+
5+
use super::Workspace;
6+
7+
impl Workspace {
8+
#[tracing::instrument(level = "trace")]
9+
pub async fn start(base_info: BaseInfo, wait: bool) {
10+
tracing::info!("Starting workspace");
11+
let client = match Helper::get_client().await {
12+
Some(iencli) => iencli,
13+
None => return,
14+
};
15+
if start_stop_devworkspace(
16+
client.clone(),
17+
base_info.workspace_name.clone().unwrap(),
18+
base_info.namespace.clone(),
19+
true,
20+
)
21+
.await
22+
.is_some()
23+
{
24+
tracing::info!("Workspace starting");
25+
} else {
26+
return;
27+
}
28+
let devworkspace_api =
29+
Helper::get_api::<DevWorkspace>(client.clone(), base_info.namespace.clone());
30+
if wait
31+
&& wait_for_status(
32+
devworkspace_api.clone(),
33+
base_info.workspace_name.clone().unwrap(),
34+
"Running".to_string(),
35+
2000,
36+
150, // Fail after 5 minutes
37+
)
38+
.await
39+
.is_some()
40+
{
41+
tracing::info!("Workspace started");
42+
} else if wait {
43+
tracing::error!("Workspace did not start");
44+
} else {
45+
tracing::info!("Not waiting for workspace to start");
46+
}
47+
}
48+
}

apps/dev_cli/src/workspace/stop.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use crd::dev_work_space::DevWorkspace;
2+
use devfile::lifecycle::{start_stop::start_stop_devworkspace, wait_for_status::wait_for_status};
3+
use helper::{base_info::BaseInfo, Helper};
4+
5+
use super::Workspace;
6+
7+
impl Workspace {
8+
#[tracing::instrument(level = "trace")]
9+
pub async fn stop(base_info: BaseInfo, wait: bool) {
10+
tracing::info!("Stopping workspace");
11+
let client = match Helper::get_client().await {
12+
Some(iencli) => iencli,
13+
None => return,
14+
};
15+
if start_stop_devworkspace(
16+
client.clone(),
17+
base_info.workspace_name.clone().unwrap(),
18+
base_info.namespace.clone(),
19+
false,
20+
)
21+
.await
22+
.is_some()
23+
{
24+
tracing::info!("Workspace stopping");
25+
} else {
26+
return;
27+
}
28+
let devworkspace_api =
29+
Helper::get_api::<DevWorkspace>(client.clone(), base_info.namespace.clone());
30+
if wait
31+
&& wait_for_status(
32+
devworkspace_api.clone(),
33+
base_info.workspace_name.clone().unwrap(),
34+
"Stopped".to_string(),
35+
2000,
36+
150, // Fail after 5 minutes
37+
)
38+
.await
39+
.is_some()
40+
{
41+
tracing::info!("Workspace stopped");
42+
} else if wait {
43+
tracing::error!("Workspace did not stop");
44+
} else {
45+
tracing::info!("Not waiting for workspace to stop");
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)