forked from github-starred/komodo
implement a lot of run procedure
This commit is contained in:
@@ -163,17 +163,105 @@ impl State {
|
||||
} in procedure.stages
|
||||
{
|
||||
match operation {
|
||||
StartContainer => {}
|
||||
StopContainer => {}
|
||||
RemoveContainer => {}
|
||||
DeployContainer => {}
|
||||
RecloneDeployment => {}
|
||||
|
||||
BuildBuild => {}
|
||||
RecloneBuild => {}
|
||||
|
||||
PruneImagesServer => {}
|
||||
_ => {}
|
||||
None => {},
|
||||
// deployment
|
||||
StartContainer => {
|
||||
let update = self
|
||||
.start_container(&target_id, user)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed at start container for deployment (id: {target_id})"
|
||||
))?;
|
||||
updates.push(update);
|
||||
}
|
||||
StopContainer => {
|
||||
let update = self
|
||||
.stop_container(&target_id, user)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed at stop container for deployment (id: {target_id})"
|
||||
))?;
|
||||
updates.push(update);
|
||||
}
|
||||
RemoveContainer => {
|
||||
let update = self
|
||||
.remove_container(&target_id, user)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed at remove container for deployment (id: {target_id})"
|
||||
))?;
|
||||
updates.push(update);
|
||||
}
|
||||
DeployContainer => {
|
||||
let update = self
|
||||
.deploy_container(&target_id, user)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed at deploy container for deployment (id: {target_id})"
|
||||
))?;
|
||||
updates.push(update);
|
||||
}
|
||||
RecloneDeployment => {
|
||||
let update = self
|
||||
.reclone_deployment(&target_id, user)
|
||||
.await
|
||||
.context(format!("failed at reclone deployment (id: {target_id})"))?;
|
||||
updates.push(update);
|
||||
}
|
||||
PullDeployment => {
|
||||
// implement this one
|
||||
// let update = self.pull
|
||||
}
|
||||
// build
|
||||
BuildBuild => {
|
||||
let update = self
|
||||
.build(&target_id, user)
|
||||
.await
|
||||
.context(format!("failed at build (id: {target_id})"))?;
|
||||
updates.push(update);
|
||||
}
|
||||
RecloneBuild => {
|
||||
let update = self
|
||||
.reclone_build(&target_id, user)
|
||||
.await
|
||||
.context(format!("failed at reclone build (id: {target_id})"))?;
|
||||
updates.push(update);
|
||||
}
|
||||
// server
|
||||
PruneImagesServer => {
|
||||
let update = self.prune_images(&target_id, user).await.context(format!(
|
||||
"failed at prune images on server (id: {target_id})"
|
||||
))?;
|
||||
updates.push(update);
|
||||
}
|
||||
PruneContainersServer => {
|
||||
let update = self
|
||||
.prune_containers(&target_id, user)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed at prune containers on server (id: {target_id})"
|
||||
))?;
|
||||
updates.push(update);
|
||||
}
|
||||
PruneNetworksServer => {
|
||||
let update = self
|
||||
.prune_networks(&target_id, user)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed at prune networks on servers (id: {target_id})"
|
||||
))?;
|
||||
updates.push(update);
|
||||
}
|
||||
// procedure
|
||||
RunProcedure => {
|
||||
// need to figure out async recursion
|
||||
// need to guard against infinite procedure loops when they are updated
|
||||
// let proc_updates = self
|
||||
// .run_procedure(&target_id, user)
|
||||
// .await
|
||||
// .context(format!("failed to run nested procedure (id: {target_id})"))?;
|
||||
// updates.extend(proc_updates);
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(updates)
|
||||
|
||||
@@ -7,8 +7,8 @@ use axum::{
|
||||
use helpers::handle_anyhow_error;
|
||||
use mungos::{Deserialize, Document, Serialize};
|
||||
use types::{
|
||||
traits::Permissioned, BasicContainerInfo, ImageSummary, Log, Network, PermissionLevel, Server,
|
||||
SystemStats,
|
||||
monitor_timestamp, traits::Permissioned, BasicContainerInfo, ImageSummary, Log, Network,
|
||||
Operation, PermissionLevel, Server, SystemStats, Update, UpdateStatus, UpdateTarget,
|
||||
};
|
||||
use typeshare::typeshare;
|
||||
|
||||
@@ -124,7 +124,7 @@ pub fn router() -> Router {
|
||||
Extension(user): RequestUserExtension,
|
||||
Path(ServerId { id }): Path<ServerId>| async move {
|
||||
let stats = state
|
||||
.get_server_stats(&user, &id)
|
||||
.get_server_stats(&id, &user)
|
||||
.await
|
||||
.map_err(handle_anyhow_error)?;
|
||||
response!(Json(stats))
|
||||
@@ -138,7 +138,7 @@ pub fn router() -> Router {
|
||||
Extension(user): RequestUserExtension,
|
||||
Path(ServerId { id }): Path<ServerId>| async move {
|
||||
let stats = state
|
||||
.get_networks(&user, &id)
|
||||
.get_networks(&id, &user)
|
||||
.await
|
||||
.map_err(handle_anyhow_error)?;
|
||||
response!(Json(stats))
|
||||
@@ -152,7 +152,7 @@ pub fn router() -> Router {
|
||||
Extension(user): RequestUserExtension,
|
||||
Path(ServerId { id }): Path<ServerId>| async move {
|
||||
let stats = state
|
||||
.prune_networks(&user, &id)
|
||||
.prune_networks(&id, &user)
|
||||
.await
|
||||
.map_err(handle_anyhow_error)?;
|
||||
response!(Json(stats))
|
||||
@@ -166,7 +166,7 @@ pub fn router() -> Router {
|
||||
Extension(user): RequestUserExtension,
|
||||
Path(ServerId { id }): Path<ServerId>| async move {
|
||||
let stats = state
|
||||
.get_images(&user, &id)
|
||||
.get_images(&id, &user)
|
||||
.await
|
||||
.map_err(handle_anyhow_error)?;
|
||||
response!(Json(stats))
|
||||
@@ -180,7 +180,7 @@ pub fn router() -> Router {
|
||||
Extension(user): RequestUserExtension,
|
||||
Path(ServerId { id }): Path<ServerId>| async move {
|
||||
let stats = state
|
||||
.prune_images(&user, &id)
|
||||
.prune_images(&id, &user)
|
||||
.await
|
||||
.map_err(handle_anyhow_error)?;
|
||||
response!(Json(stats))
|
||||
@@ -194,7 +194,7 @@ pub fn router() -> Router {
|
||||
Extension(user): RequestUserExtension,
|
||||
Path(ServerId { id }): Path<ServerId>| async move {
|
||||
let stats = state
|
||||
.get_containers(&user, &id)
|
||||
.get_containers(&id, &user)
|
||||
.await
|
||||
.map_err(handle_anyhow_error)?;
|
||||
response!(Json(stats))
|
||||
@@ -208,7 +208,7 @@ pub fn router() -> Router {
|
||||
Extension(user): RequestUserExtension,
|
||||
Path(ServerId { id }): Path<ServerId>| async move {
|
||||
let stats = state
|
||||
.prune_containers(&user, &id)
|
||||
.prune_containers(&id, &user)
|
||||
.await
|
||||
.map_err(handle_anyhow_error)?;
|
||||
response!(Json(stats))
|
||||
@@ -245,8 +245,8 @@ impl State {
|
||||
|
||||
async fn get_server_stats(
|
||||
&self,
|
||||
user: &RequestUser,
|
||||
server_id: &str,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<SystemStats> {
|
||||
let server = self
|
||||
.get_server_check_permissions(server_id, user, PermissionLevel::Read)
|
||||
@@ -261,8 +261,8 @@ impl State {
|
||||
|
||||
async fn get_networks(
|
||||
&self,
|
||||
user: &RequestUser,
|
||||
server_id: &str,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<Vec<Network>> {
|
||||
let server = self
|
||||
.get_server_check_permissions(server_id, user, PermissionLevel::Read)
|
||||
@@ -274,25 +274,49 @@ impl State {
|
||||
Ok(stats)
|
||||
}
|
||||
|
||||
async fn prune_networks(&self, user: &RequestUser, server_id: &str) -> anyhow::Result<Log> {
|
||||
pub async fn prune_networks(
|
||||
&self,
|
||||
server_id: &str,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<Update> {
|
||||
let server = self
|
||||
.get_server_check_permissions(server_id, user, PermissionLevel::Write)
|
||||
.await?;
|
||||
let log = self
|
||||
.periphery
|
||||
.network_prune(&server)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed to prune networks on server {}",
|
||||
server.name
|
||||
))?;
|
||||
Ok(log)
|
||||
|
||||
let start_ts = monitor_timestamp();
|
||||
let mut update = Update {
|
||||
target: UpdateTarget::Server(server_id.to_owned()),
|
||||
operation: Operation::PruneNetworksServer,
|
||||
start_ts,
|
||||
status: UpdateStatus::InProgress,
|
||||
success: true,
|
||||
operator: user.id.clone(),
|
||||
..Default::default()
|
||||
};
|
||||
update.id = self.add_update(update.clone()).await?;
|
||||
|
||||
let log = match self.periphery.network_prune(&server).await.context(format!(
|
||||
"failed to prune networks on server {}",
|
||||
server.name
|
||||
)) {
|
||||
Ok(log) => log,
|
||||
Err(e) => Log::error("prune networks", format!("{e:#?}")),
|
||||
};
|
||||
|
||||
update.success = log.success;
|
||||
update.status = UpdateStatus::Complete;
|
||||
update.end_ts = Some(monitor_timestamp());
|
||||
update.logs.push(log);
|
||||
|
||||
self.update_update(update.clone()).await?;
|
||||
|
||||
Ok(update)
|
||||
}
|
||||
|
||||
async fn get_images(
|
||||
&self,
|
||||
user: &RequestUser,
|
||||
server_id: &str,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<Vec<ImageSummary>> {
|
||||
let server = self
|
||||
.get_server_check_permissions(server_id, user, PermissionLevel::Read)
|
||||
@@ -305,27 +329,55 @@ impl State {
|
||||
Ok(images)
|
||||
}
|
||||
|
||||
async fn prune_images(&self, user: &RequestUser, server_id: &str) -> anyhow::Result<Log> {
|
||||
pub async fn prune_images(
|
||||
&self,
|
||||
server_id: &str,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<Update> {
|
||||
let server = self
|
||||
.get_server_check_permissions(server_id, user, PermissionLevel::Write)
|
||||
.await?;
|
||||
let stats = self
|
||||
let start_ts = monitor_timestamp();
|
||||
let mut update = Update {
|
||||
target: UpdateTarget::Server(server_id.to_owned()),
|
||||
operation: Operation::PruneImagesServer,
|
||||
start_ts,
|
||||
status: UpdateStatus::InProgress,
|
||||
success: true,
|
||||
operator: user.id.clone(),
|
||||
..Default::default()
|
||||
};
|
||||
update.id = self.add_update(update.clone()).await?;
|
||||
|
||||
let log = match self
|
||||
.periphery
|
||||
.image_prune(&server)
|
||||
.await
|
||||
.context(format!("failed to prune images on server {}", server.name))?;
|
||||
Ok(stats)
|
||||
.context(format!("failed to prune images on server {}", server.name))
|
||||
{
|
||||
Ok(log) => log,
|
||||
Err(e) => Log::error("prune images", format!("{e:#?}")),
|
||||
};
|
||||
|
||||
update.success = log.success;
|
||||
update.status = UpdateStatus::Complete;
|
||||
update.end_ts = Some(monitor_timestamp());
|
||||
update.logs.push(log);
|
||||
|
||||
self.update_update(update.clone()).await?;
|
||||
|
||||
Ok(update)
|
||||
}
|
||||
|
||||
async fn get_containers(
|
||||
&self,
|
||||
user: &RequestUser,
|
||||
server_id: &str,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<Vec<BasicContainerInfo>> {
|
||||
let server = self
|
||||
.get_server_check_permissions(server_id, user, PermissionLevel::Read)
|
||||
.await?;
|
||||
let images = self
|
||||
let containers = self
|
||||
.periphery
|
||||
.container_list(&server)
|
||||
.await
|
||||
@@ -333,21 +385,49 @@ impl State {
|
||||
"failed to get containers from server {}",
|
||||
server.name
|
||||
))?;
|
||||
Ok(images)
|
||||
Ok(containers)
|
||||
}
|
||||
|
||||
async fn prune_containers(&self, user: &RequestUser, server_id: &str) -> anyhow::Result<Log> {
|
||||
pub async fn prune_containers(
|
||||
&self,
|
||||
server_id: &str,
|
||||
user: &RequestUser,
|
||||
) -> anyhow::Result<Update> {
|
||||
let server = self
|
||||
.get_server_check_permissions(server_id, user, PermissionLevel::Write)
|
||||
.await?;
|
||||
let log = self
|
||||
|
||||
let start_ts = monitor_timestamp();
|
||||
let mut update = Update {
|
||||
target: UpdateTarget::Server(server_id.to_owned()),
|
||||
operation: Operation::PruneContainersServer,
|
||||
start_ts,
|
||||
status: UpdateStatus::InProgress,
|
||||
success: true,
|
||||
operator: user.id.clone(),
|
||||
..Default::default()
|
||||
};
|
||||
update.id = self.add_update(update.clone()).await?;
|
||||
|
||||
let log = match self
|
||||
.periphery
|
||||
.container_prune(&server)
|
||||
.await
|
||||
.context(format!(
|
||||
"failed to prune containers on server {}",
|
||||
server.name
|
||||
))?;
|
||||
Ok(log)
|
||||
)) {
|
||||
Ok(log) => log,
|
||||
Err(e) => Log::error("prune containers", format!("{e:#?}")),
|
||||
};
|
||||
|
||||
update.success = log.success;
|
||||
update.status = UpdateStatus::Complete;
|
||||
update.end_ts = Some(monitor_timestamp());
|
||||
update.logs.push(log);
|
||||
|
||||
self.update_update(update.clone()).await?;
|
||||
|
||||
Ok(update)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,8 +87,7 @@ impl MonitorClient {
|
||||
}
|
||||
|
||||
pub async fn get_user(&self) -> anyhow::Result<String> {
|
||||
self.get_string("/api/user", Option::<String>::None)
|
||||
.await
|
||||
self.get_string("/api/user", Option::<String>::None).await
|
||||
}
|
||||
|
||||
async fn get<R: DeserializeOwned>(
|
||||
|
||||
Reference in New Issue
Block a user