mirror of
https://github.com/moghtech/komodo.git
synced 2026-03-21 05:41:26 -05:00
* add some network stuff to container summary * improve settings tables UI * periphery build supports additional tags * fix variable container sizing * alert types newline wrap * plumbing for Stack resource * plumbing for Stack resource * mount stack api * stack resource sync * get remote compose file * support image_name and image_tag * add server config placeholders. default server config address * configure image name and image tag * deployment work with build image_name and image_tag * stack UI * fe builds * configure registry provider and account * implement periphery stack api * stack poll interval * add UI provider management * deploy stacks * build push commit hash tag. * Destroy stack * update default core port to 9120 * remove git_account alias * finish stack (and container) api * frontend builds * cant cancel server based builds * fix * use git pull -f * 9120 * start UI updates (#15) * fix From<Stack> for CloneArgs * remove unused imports * UI Updates (#16) * cleanup dashboard charts for resources * bring back solid scrollbars * enable sidebar scrolling * remove alerts from all resources * pass jwt secret * stacks dont delete the target * parse services from yaml * stacks deploy * close * looking good * closer * destroy stack when file missing. onboard stacks * figure out stack container name matching * get stack state correct * work with service views * UI Updates - Sidebar, Topbar Alerts, and All Resources page (#17) * move sidebar to use fixed positioning instead of sticky * add alert details dialog to topbar alerts * cleanup all resources page layout * ensure resource links don't propagate clicks * periphery support passing env with --env-file * StackServicePage * default run_directory to ./ for clarify * add stack webhook listeners * add default compose name of stack name * stacks controlled with project name * migrate to dotenvy * add stack to dashboard * remove deploying / destroying stack services * update config files * fix getting service logs * git / docker provider management api * implement passing git / registry token from db * rename system user Github to Git Webhook * seperate deployed and latest services on stack info * add stack service level operations * UI Updates - Update Shadcn/UI components, prevent navbar menu layout shift (#20) * add dashboard pie for resource syncs * dashboard items same height * update shadcn components * ensure centered following sheet update * cleanup layout, prevent navbar menu layout shifts * add manual filter, fix toast call * guard webhooks * remove deployed_message, latest_message from StackListItemInfo * stop all containers on server correctly * support multiple compose files * cache all containers networks images projects * remove project missing from db cache * work on sync deploy stuff * rework deployment sync deploy to support stacks. they can depend on each other. * UI Updates - Remove topbar transparency, pretty status badges, tidy resource page layout with a 'back' button (#21) * remove topbar transparency * cleanup unused * responsive dashboard * better mobile header * dont need to calc 64px less since header is using position fixed * add status badge component * update status badges * further simplify layout * allow undefined status as prop * use new status badges for alerts * update status badges for all resources * undo layout change * tidy up resource page layout, add back button * no need for button wrapper * remove unused * build cancel log * update ts types * fix fe type changes * fe tweaks * remove on build logs * core refresh cache immediately on startup * jwt_ttl * canonicalize run directory on host * update canonicalize error message * core use docker-compose * fix incorrect project missing, add status string to stack info * remove entries in "after" that aren't deploying * fix dockerfiel * build custom tag postfix * sync fixes * ensure UpdateGitProviderAccount doesn't change id * ensure UpdateDockerRegistryAccount doesn't change id * configure providers in the UI * add // comment support to env, conversions * add updates for provider deletes * improve sync pending deploy log * add more deployment actions * add backward compat with v1.12 for clone repo * stack deploy format * fe * alert menus clone when click resource link * rename stacks * don't close on click * snake case stack state, in line with deployment state * sync redeploy stack if newer hash (optional behind resource field 'latest_hash') * remove nav to tree * RefreshStack/Sync debug instruments * improve inline UI docs * implement resource base_permission backend * plumbing for Repo build * build repos * write env file repos * add latest hash / message to build info * add optional hash to update * keep built_hash updated * add backend for build / repo latest hash management * remove unused resources * clean up repo dirs after cache update * fix repo info deser error * add build / repo git status * fix page layouts * improve layout responsive * most config incline docs * add descriptions for all resource types * default local auth false * fix omnibar arrow keys issue * add compose file to example config * image registry * dashboard display no resources messge * update deps. * show when no config * resource sync use config git_provider * fix networks * fix deploy error due to after * update lots of docs * fix server stat charts not working * update screenshots * update changelog * add a disclaimer * remove file paths docs stuff * build repo * v1.13 - Komodo * update docs for cli * fill out the compose example more --------- Co-authored-by: Karamvir Singh <67458484+karamvirsingh98@users.noreply.github.com>
323 lines
8.2 KiB
Rust
323 lines
8.2 KiB
Rust
use std::collections::HashMap;
|
|
|
|
use anyhow::{anyhow, Context};
|
|
use monitor_client::{
|
|
api::read::{GetUpdate, ListUpdates, ListUpdatesResponse},
|
|
entities::{
|
|
alerter::Alerter,
|
|
build::Build,
|
|
builder::Builder,
|
|
deployment::Deployment,
|
|
permission::PermissionLevel,
|
|
procedure::Procedure,
|
|
repo::Repo,
|
|
server::Server,
|
|
server_template::ServerTemplate,
|
|
stack::Stack,
|
|
sync::ResourceSync,
|
|
update::{ResourceTarget, Update, UpdateListItem},
|
|
user::User,
|
|
},
|
|
};
|
|
use mungos::{
|
|
by_id::find_one_by_id,
|
|
find::find_collect,
|
|
mongodb::{bson::doc, options::FindOptions},
|
|
};
|
|
use resolver_api::Resolve;
|
|
|
|
use crate::{
|
|
config::core_config,
|
|
resource,
|
|
state::{db_client, State},
|
|
};
|
|
|
|
const UPDATES_PER_PAGE: i64 = 100;
|
|
|
|
impl Resolve<ListUpdates, User> for State {
|
|
async fn resolve(
|
|
&self,
|
|
ListUpdates { query, page }: ListUpdates,
|
|
user: User,
|
|
) -> anyhow::Result<ListUpdatesResponse> {
|
|
let query = if user.admin || core_config().transparent_mode {
|
|
query
|
|
} else {
|
|
let server_query =
|
|
resource::get_resource_ids_for_user::<Server>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Server", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Server" });
|
|
|
|
let deployment_query =
|
|
resource::get_resource_ids_for_user::<Deployment>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Deployment", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Deployment" });
|
|
|
|
let stack_query =
|
|
resource::get_resource_ids_for_user::<Stack>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Stack", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Stack" });
|
|
|
|
let build_query =
|
|
resource::get_resource_ids_for_user::<Build>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Build", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Build" });
|
|
|
|
let repo_query =
|
|
resource::get_resource_ids_for_user::<Repo>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Repo", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Repo" });
|
|
|
|
let procedure_query =
|
|
resource::get_resource_ids_for_user::<Procedure>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Procedure", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Procedure" });
|
|
|
|
let builder_query =
|
|
resource::get_resource_ids_for_user::<Builder>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Builder", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Builder" });
|
|
|
|
let alerter_query =
|
|
resource::get_resource_ids_for_user::<Alerter>(&user)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "Alerter", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "Alerter" });
|
|
|
|
let server_template_query = resource::get_resource_ids_for_user::<ServerTemplate>(
|
|
&user,
|
|
)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "ServerTemplate", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "ServerTemplate" });
|
|
|
|
let resource_sync_query = resource::get_resource_ids_for_user::<ResourceSync>(
|
|
&user,
|
|
)
|
|
.await?
|
|
.map(|ids| {
|
|
doc! {
|
|
"target.type": "ResourceSync", "target.id": { "$in": ids }
|
|
}
|
|
})
|
|
.unwrap_or_else(|| doc! { "target.type": "ResourceSync" });
|
|
|
|
let mut query = query.unwrap_or_default();
|
|
query.extend(doc! {
|
|
"$or": [
|
|
server_query,
|
|
deployment_query,
|
|
stack_query,
|
|
build_query,
|
|
repo_query,
|
|
procedure_query,
|
|
alerter_query,
|
|
builder_query,
|
|
server_template_query,
|
|
resource_sync_query,
|
|
]
|
|
});
|
|
query.into()
|
|
};
|
|
|
|
let usernames =
|
|
find_collect(&db_client().await.users, None, None)
|
|
.await
|
|
.context("failed to pull users from db")?
|
|
.into_iter()
|
|
.map(|u| (u.id, u.username))
|
|
.collect::<HashMap<_, _>>();
|
|
|
|
let updates = find_collect(
|
|
&db_client().await.updates,
|
|
query,
|
|
FindOptions::builder()
|
|
.sort(doc! { "start_ts": -1 })
|
|
.skip(page as u64 * UPDATES_PER_PAGE as u64)
|
|
.limit(UPDATES_PER_PAGE)
|
|
.build(),
|
|
)
|
|
.await
|
|
.context("failed to pull updates from db")?
|
|
.into_iter()
|
|
.map(|u| {
|
|
let username = if User::is_service_user(&u.operator) {
|
|
u.operator.clone()
|
|
} else {
|
|
usernames
|
|
.get(&u.operator)
|
|
.cloned()
|
|
.unwrap_or("unknown".to_string())
|
|
};
|
|
UpdateListItem {
|
|
username,
|
|
id: u.id,
|
|
operation: u.operation,
|
|
start_ts: u.start_ts,
|
|
success: u.success,
|
|
operator: u.operator,
|
|
target: u.target,
|
|
status: u.status,
|
|
version: u.version,
|
|
other_data: u.other_data,
|
|
}
|
|
})
|
|
.collect::<Vec<_>>();
|
|
|
|
let next_page = if updates.len() == UPDATES_PER_PAGE as usize {
|
|
Some(page + 1)
|
|
} else {
|
|
None
|
|
};
|
|
|
|
Ok(ListUpdatesResponse { updates, next_page })
|
|
}
|
|
}
|
|
|
|
impl Resolve<GetUpdate, User> for State {
|
|
async fn resolve(
|
|
&self,
|
|
GetUpdate { id }: GetUpdate,
|
|
user: User,
|
|
) -> anyhow::Result<Update> {
|
|
let update = find_one_by_id(&db_client().await.updates, &id)
|
|
.await
|
|
.context("failed to query to db")?
|
|
.context("no update exists with given id")?;
|
|
if user.admin || core_config().transparent_mode {
|
|
return Ok(update);
|
|
}
|
|
match &update.target {
|
|
ResourceTarget::System(_) => {
|
|
return Err(anyhow!(
|
|
"user must be admin to view system updates"
|
|
))
|
|
}
|
|
ResourceTarget::Server(id) => {
|
|
resource::get_check_permissions::<Server>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::Deployment(id) => {
|
|
resource::get_check_permissions::<Deployment>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::Build(id) => {
|
|
resource::get_check_permissions::<Build>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::Repo(id) => {
|
|
resource::get_check_permissions::<Repo>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::Builder(id) => {
|
|
resource::get_check_permissions::<Builder>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::Alerter(id) => {
|
|
resource::get_check_permissions::<Alerter>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::Procedure(id) => {
|
|
resource::get_check_permissions::<Procedure>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::ServerTemplate(id) => {
|
|
resource::get_check_permissions::<ServerTemplate>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::ResourceSync(id) => {
|
|
resource::get_check_permissions::<ResourceSync>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
ResourceTarget::Stack(id) => {
|
|
resource::get_check_permissions::<Stack>(
|
|
id,
|
|
&user,
|
|
PermissionLevel::Read,
|
|
)
|
|
.await?;
|
|
}
|
|
}
|
|
Ok(update)
|
|
}
|
|
}
|