ListCommonExtraArgs

This commit is contained in:
mbecker20
2024-05-02 00:02:59 -07:00
parent 7b778631f3
commit 3d73f325fe
15 changed files with 174 additions and 75 deletions

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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())
}
}

View File

@@ -85,6 +85,7 @@ enum ReadRequest {
GetDeploymentStats(GetDeploymentStats),
GetLog(GetLog),
SearchLog(SearchLog),
ListCommonExtraArgs(ListCommonExtraArgs),
// ==== BUILD ====
GetBuildsSummary(GetBuildsSummary),

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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,
)

View File

@@ -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
}
}

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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,

View File

@@ -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>;

View File

@@ -58,6 +58,7 @@ export type ReadResponses = {
GetDeploymentStats: Types.GetDeploymentStatsResponse;
GetLog: Types.GetLogResponse;
SearchLog: Types.SearchLogResponse;
ListCommonExtraArgs: Types.ListCommonExtraArgsResponse;
// ==== BUILD ====
GetBuildsSummary: Types.GetBuildsSummaryResponse;

View File

@@ -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 }