forked from github-starred/komodo
ListCommonExtraArgs
This commit is contained in:
@@ -44,7 +44,7 @@ impl Resolve<ListAlerters, User> for State {
|
||||
ListAlerters { query }: ListAlerters,
|
||||
user: User,
|
||||
) -> anyhow::Result<Vec<AlerterListItem>> {
|
||||
Alerter::list_resources_for_user(query, &user).await
|
||||
Alerter::list_resource_list_items_for_user(query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ impl Resolve<ListBuilds, User> for State {
|
||||
ListBuilds { query }: ListBuilds,
|
||||
user: User,
|
||||
) -> anyhow::Result<Vec<BuildListItem>> {
|
||||
Build::list_resources_for_user(query, &user).await
|
||||
Build::list_resource_list_items_for_user(query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ impl Resolve<ListBuilders, User> for State {
|
||||
ListBuilders { query }: ListBuilders,
|
||||
user: User,
|
||||
) -> anyhow::Result<Vec<BuilderListItem>> {
|
||||
Builder::list_resources_for_user(query, &user).await
|
||||
Builder::list_resource_list_items_for_user(query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use std::{cmp, str::FromStr};
|
||||
use std::{cmp, collections::HashSet, str::FromStr};
|
||||
|
||||
use anyhow::{anyhow, Context};
|
||||
use async_trait::async_trait;
|
||||
@@ -53,7 +53,7 @@ impl Resolve<ListDeployments, User> for State {
|
||||
ListDeployments { query }: ListDeployments,
|
||||
user: User,
|
||||
) -> anyhow::Result<Vec<DeploymentListItem>> {
|
||||
Deployment::list_resources_for_user(query, &user).await
|
||||
Deployment::list_resource_list_items_for_user(query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,3 +254,28 @@ impl Resolve<GetDeploymentsSummary, User> for State {
|
||||
Ok(res)
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Resolve<ListCommonExtraArgs, User> for State {
|
||||
async fn resolve(
|
||||
&self,
|
||||
ListCommonExtraArgs { query }: ListCommonExtraArgs,
|
||||
user: User,
|
||||
) -> anyhow::Result<ListCommonExtraArgsResponse> {
|
||||
let deployments =
|
||||
Deployment::list_resources_for_user(query, &user)
|
||||
.await
|
||||
.context("failed to get resources matching query")?;
|
||||
|
||||
// first collect with guaranteed uniqueness
|
||||
let mut res = HashSet::<String>::new();
|
||||
|
||||
for deployment in deployments {
|
||||
for extra_arg in deployment.config.extra_args {
|
||||
res.insert(extra_arg);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(res.into_iter().collect())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,7 @@ enum ReadRequest {
|
||||
GetDeploymentStats(GetDeploymentStats),
|
||||
GetLog(GetLog),
|
||||
SearchLog(SearchLog),
|
||||
ListCommonExtraArgs(ListCommonExtraArgs),
|
||||
|
||||
// ==== BUILD ====
|
||||
GetBuildsSummary(GetBuildsSummary),
|
||||
|
||||
@@ -47,7 +47,7 @@ impl Resolve<ListProcedures, User> for State {
|
||||
ListProcedures { query }: ListProcedures,
|
||||
user: User,
|
||||
) -> anyhow::Result<ListProceduresResponse> {
|
||||
Procedure::list_resources_for_user(query, &user).await
|
||||
Procedure::list_resource_list_items_for_user(query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ impl Resolve<ListRepos, User> for State {
|
||||
ListRepos { query }: ListRepos,
|
||||
user: User,
|
||||
) -> anyhow::Result<Vec<RepoListItem>> {
|
||||
Repo::list_resources_for_user(query, &user).await
|
||||
Repo::list_resource_list_items_for_user(query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,29 +33,31 @@ impl Resolve<FindResources, User> for State {
|
||||
for resource_type in resource_types {
|
||||
match resource_type {
|
||||
Server => {
|
||||
res.servers = server::Server::query_resources_for_user(
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
res.servers =
|
||||
server::Server::query_resource_list_items_for_user(
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
Deployment => {
|
||||
res.deployments =
|
||||
deployment::Deployment::query_resources_for_user(
|
||||
deployment::Deployment::query_resource_list_items_for_user(
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
Build => {
|
||||
res.builds = build::Build::query_resources_for_user(
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
res.builds =
|
||||
build::Build::query_resource_list_items_for_user(
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
Repo => {
|
||||
res.repos = repo::Repo::query_resources_for_user(
|
||||
res.repos = repo::Repo::query_resource_list_items_for_user(
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
@@ -63,7 +65,7 @@ impl Resolve<FindResources, User> for State {
|
||||
}
|
||||
Procedure => {
|
||||
res.procedures =
|
||||
procedure::Procedure::query_resources_for_user(
|
||||
procedure::Procedure::query_resource_list_items_for_user(
|
||||
query.clone(),
|
||||
&user,
|
||||
)
|
||||
|
||||
@@ -40,9 +40,11 @@ impl Resolve<GetServersSummary, User> for State {
|
||||
GetServersSummary {}: GetServersSummary,
|
||||
user: User,
|
||||
) -> anyhow::Result<GetServersSummaryResponse> {
|
||||
let servers =
|
||||
Server::list_resources_for_user(Default::default(), &user)
|
||||
.await?;
|
||||
let servers = Server::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?;
|
||||
let mut res = GetServersSummaryResponse::default();
|
||||
for server in servers {
|
||||
res.total += 1;
|
||||
@@ -107,7 +109,7 @@ impl Resolve<ListServers, User> for State {
|
||||
ListServers { query }: ListServers,
|
||||
user: User,
|
||||
) -> anyhow::Result<Vec<ServerListItem>> {
|
||||
Server::list_resources_for_user(query, &user).await
|
||||
Server::list_resource_list_items_for_user(query, &user).await
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -48,46 +48,67 @@ impl Resolve<ExportAllResourcesToToml, User> for State {
|
||||
let mut targets = Vec::<ResourceTarget>::new();
|
||||
|
||||
targets.extend(
|
||||
Alerter::list_resources_for_user(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Alerter(resource.id)),
|
||||
Alerter::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Alerter(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
Builder::list_resources_for_user(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Builder(resource.id)),
|
||||
Builder::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Builder(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
Server::list_resources_for_user(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Server(resource.id)),
|
||||
Server::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Server(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
Deployment::list_resources_for_user(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Deployment(resource.id)),
|
||||
Deployment::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Deployment(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
Build::list_resources_for_user(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Build(resource.id)),
|
||||
Build::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Build(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
Repo::list_resources_for_user(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Repo(resource.id)),
|
||||
Repo::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Repo(resource.id)),
|
||||
);
|
||||
targets.extend(
|
||||
Procedure::list_resources_for_user(Default::default(), &user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Procedure(resource.id)),
|
||||
Procedure::list_resource_list_items_for_user(
|
||||
Default::default(),
|
||||
&user,
|
||||
)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| ResourceTarget::Procedure(resource.id)),
|
||||
);
|
||||
|
||||
let user_groups = if user.admin {
|
||||
|
||||
@@ -150,33 +150,22 @@ pub trait StateResource {
|
||||
.await
|
||||
}
|
||||
|
||||
async fn list_resources_for_user(
|
||||
async fn list_resource_list_items_for_user(
|
||||
mut query: ResourceQuery<Self::QuerySpecifics>,
|
||||
user: &User,
|
||||
) -> anyhow::Result<Vec<Self::ListItem>> {
|
||||
validate_resource_query_tags(&mut query).await;
|
||||
let mut filters = Document::new();
|
||||
query.add_filters(&mut filters);
|
||||
Self::query_resources_for_user(filters, user).await
|
||||
Self::query_resource_list_items_for_user(filters, user).await
|
||||
}
|
||||
|
||||
async fn query_resources_for_user(
|
||||
mut filters: Document,
|
||||
async fn query_resource_list_items_for_user(
|
||||
filters: Document,
|
||||
user: &User,
|
||||
) -> anyhow::Result<Vec<Self::ListItem>> {
|
||||
if !user.admin {
|
||||
let ids = Self::get_resource_ids_for_non_admin(&user.id)
|
||||
.await?
|
||||
.into_iter()
|
||||
.flat_map(|id| ObjectId::from_str(&id))
|
||||
.collect::<Vec<_>>();
|
||||
filters.insert("_id", doc! { "$in": ids });
|
||||
}
|
||||
let list = find_collect(Self::coll().await, filters, None)
|
||||
.await
|
||||
.with_context(|| {
|
||||
format!("failed to pull {}s from mongo", Self::name())
|
||||
})?
|
||||
let list = Self::query_resources_for_user(filters, user)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|resource| Self::to_list_item(resource));
|
||||
|
||||
@@ -192,6 +181,35 @@ pub trait StateResource {
|
||||
Ok(list)
|
||||
}
|
||||
|
||||
async fn list_resources_for_user(
|
||||
mut query: ResourceQuery<Self::QuerySpecifics>,
|
||||
user: &User,
|
||||
) -> anyhow::Result<Vec<Resource<Self::Config, Self::Info>>> {
|
||||
validate_resource_query_tags(&mut query).await;
|
||||
let mut filters = Document::new();
|
||||
query.add_filters(&mut filters);
|
||||
Self::query_resources_for_user(filters, user).await
|
||||
}
|
||||
|
||||
async fn query_resources_for_user(
|
||||
mut filters: Document,
|
||||
user: &User,
|
||||
) -> anyhow::Result<Vec<Resource<Self::Config, Self::Info>>> {
|
||||
if !user.admin {
|
||||
let ids = Self::get_resource_ids_for_non_admin(&user.id)
|
||||
.await?
|
||||
.into_iter()
|
||||
.flat_map(|id| ObjectId::from_str(&id))
|
||||
.collect::<Vec<_>>();
|
||||
filters.insert("_id", doc! { "$in": ids });
|
||||
}
|
||||
find_collect(Self::coll().await, filters, None)
|
||||
.await
|
||||
.with_context(|| {
|
||||
format!("failed to pull {}s from mongo", Self::name())
|
||||
})
|
||||
}
|
||||
|
||||
async fn update_description(
|
||||
id_or_name: &str,
|
||||
description: &str,
|
||||
|
||||
@@ -35,7 +35,7 @@ async fn get_all_servers_map() -> anyhow::Result<(
|
||||
HashMap<String, ServerListItem>,
|
||||
HashMap<String, String>,
|
||||
)> {
|
||||
let servers = Server::list_resources_for_user(
|
||||
let servers = Server::list_resource_list_items_for_user(
|
||||
ResourceQuery::default(),
|
||||
&User {
|
||||
admin: true,
|
||||
|
||||
@@ -201,3 +201,22 @@ pub struct GetDeploymentsSummaryResponse {
|
||||
pub not_deployed: I64,
|
||||
pub unknown: I64,
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
/// Gets a list of existing values used as extra args across other deployments.
|
||||
/// Useful to offer suggestions. Response: [ListCommonExtraArgsResponse]
|
||||
#[typeshare]
|
||||
#[derive(
|
||||
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
|
||||
)]
|
||||
#[empty_traits(MonitorReadRequest)]
|
||||
#[response(ListCommonExtraArgsResponse)]
|
||||
pub struct ListCommonExtraArgs {
|
||||
/// optional structured query to filter deployments.
|
||||
#[serde(default)]
|
||||
pub query: DeploymentQuery,
|
||||
}
|
||||
|
||||
#[typeshare]
|
||||
pub type ListCommonExtraArgsResponse = Vec<String>;
|
||||
|
||||
@@ -58,6 +58,7 @@ export type ReadResponses = {
|
||||
GetDeploymentStats: Types.GetDeploymentStatsResponse;
|
||||
GetLog: Types.GetLogResponse;
|
||||
SearchLog: Types.SearchLogResponse;
|
||||
ListCommonExtraArgs: Types.ListCommonExtraArgsResponse;
|
||||
|
||||
// ==== BUILD ====
|
||||
GetBuildsSummary: Types.GetBuildsSummaryResponse;
|
||||
|
||||
@@ -460,8 +460,6 @@ export interface DeploymentConfig {
|
||||
* Empty is no process args.
|
||||
*/
|
||||
process_args?: string;
|
||||
/** The user of the container, or empty string to use the default image user. */
|
||||
container_user?: string;
|
||||
/**
|
||||
* Extra args which are interpolated into the `docker run` command,
|
||||
* and affect the container configuration.
|
||||
@@ -545,6 +543,8 @@ export interface DeploymentActionState {
|
||||
|
||||
export type GetDeploymentActionStateResponse = DeploymentActionState;
|
||||
|
||||
export type ListCommonExtraArgsResponse = string[];
|
||||
|
||||
export type UserTarget =
|
||||
/** User Id */
|
||||
| { type: "User", id: string }
|
||||
@@ -1698,7 +1698,7 @@ export interface GetDeploymentContainer {
|
||||
deployment: string;
|
||||
}
|
||||
|
||||
/** Response for [GetDeploymentStatus]. */
|
||||
/** Response for [GetDeploymentContainer]. */
|
||||
export interface GetDeploymentContainerResponse {
|
||||
state: DockerContainerState;
|
||||
container?: ContainerSummary;
|
||||
@@ -1782,6 +1782,15 @@ export interface GetDeploymentsSummaryResponse {
|
||||
unknown: I64;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a list of existing values used as extra args across other deployments.
|
||||
* Useful to offer suggestions. Response: [ListCommonExtraArgsResponse]
|
||||
*/
|
||||
export interface ListCommonExtraArgs {
|
||||
/** optional structured query to filter deployments. */
|
||||
query?: DeploymentQuery;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the version of the core api.
|
||||
* Response: [GetVersionResponse].
|
||||
@@ -1887,8 +1896,8 @@ export interface GetRepoActionState {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a summary of data relating to all builds.
|
||||
* Response: [GetBuildsSummaryResponse].
|
||||
* Gets a summary of data relating to all repos.
|
||||
* Response: [GetReposSummaryResponse].
|
||||
*/
|
||||
export interface GetReposSummary {
|
||||
}
|
||||
@@ -3014,6 +3023,7 @@ export type ReadRequest =
|
||||
| { type: "GetDeploymentStats", params: GetDeploymentStats }
|
||||
| { type: "GetLog", params: GetLog }
|
||||
| { type: "SearchLog", params: SearchLog }
|
||||
| { type: "ListCommonExtraArgs", params: ListCommonExtraArgs }
|
||||
| { type: "GetBuildsSummary", params: GetBuildsSummary }
|
||||
| { type: "GetBuild", params: GetBuild }
|
||||
| { type: "ListBuilds", params: ListBuilds }
|
||||
|
||||
Reference in New Issue
Block a user