fix the ts client

This commit is contained in:
mbecker20
2023-07-22 02:25:02 -04:00
parent 7e66eca6ae
commit 5cc3885e32
17 changed files with 265 additions and 1372 deletions

2
.vscode/tasks.json vendored
View File

@@ -85,7 +85,7 @@
},
{
"type": "shell",
"command": "RUST_BACKTRACE=1 typeshare . --lang=typescript --output-file=./client/ts/src/types.ts",
"command": "node ./client/ts/generate_types.mjs",
"label": "generate typescript types",
"problemMatcher": []
}

View File

@@ -2,7 +2,7 @@ use anyhow::Context;
use async_timing_util::{wait_until_timelength, Timelength};
use futures::future::join_all;
use monitor_types::entities::{
deployment::{BasicContainerInfo, Deployment, DockerContainerState},
deployment::{ContainerSummary, Deployment, DockerContainerState},
server::{
stats::{
AllSystemStats, BasicSystemStats, ServerHealth, SingleDiskUsage, StatsState,
@@ -29,7 +29,7 @@ pub struct CachedServerStatus {
pub struct CachedDeploymentStatus {
pub id: String,
pub state: DockerContainerState,
pub container: Option<BasicContainerInfo>,
pub container: Option<ContainerSummary>,
}
impl State {

View File

@@ -39,19 +39,25 @@ enum ReadRequest {
FindResources(FindResources),
// ==== SERVER ====
GetServer(GetServer),
ListServers(ListServers),
GetServerStatus(GetServerStatus),
GetPeripheryVersion(GetPeripheryVersion),
GetSystemInformation(GetSystemInformation),
GetDockerContainers(GetDockerContainers),
GetDockerImages(GetDockerImages),
GetDockerNetworks(GetDockerNetworks),
GetServer(GetServer),
ListServers(ListServers),
GetServerActionState(GetServerActionState),
// ==== DEPLOYMENT ====
GetDeployment(GetDeployment),
ListDeployments(ListDeployments),
GetDeploymentStatus(GetDeploymentStatus),
GetDeploymentActionState(GetDeploymentActionState),
GetDeployedVersion(GetDeployedVersion),
GetDeploymentStats(GetDeploymentStats),
GetLog(GetLog),
// ==== BUILD ====
GetBuild(GetBuild),

View File

@@ -3,7 +3,7 @@ use async_trait::async_trait;
use futures::future::join_all;
use monitor_types::{
entities::{
deployment::BasicContainerInfo,
deployment::ContainerSummary,
server::{
docker_image::ImageSummary, docker_network::DockerNetwork, stats::SystemInformation,
Server, ServerActionState,
@@ -334,7 +334,7 @@ impl Resolve<GetDockerContainers, RequestUser> for State {
&self,
GetDockerContainers { server_id }: GetDockerContainers,
user: RequestUser,
) -> anyhow::Result<Vec<BasicContainerInfo>> {
) -> anyhow::Result<Vec<ContainerSummary>> {
let server = self
.get_server_check_permissions(&server_id, &user, PermissionLevel::Read)
.await?;

View File

@@ -58,7 +58,7 @@ impl Resolve<DeleteLoginSecret, RequestUser> for State {
&self,
DeleteLoginSecret { name }: DeleteLoginSecret,
user: RequestUser,
) -> anyhow::Result<()> {
) -> anyhow::Result<DeleteLoginSecretResponse> {
self.db
.users
.update_one(
@@ -73,6 +73,6 @@ impl Resolve<DeleteLoginSecret, RequestUser> for State {
)
.await
.context("failed at mongo update query")?;
Ok(())
Ok(DeleteLoginSecretResponse {})
}
}

View File

@@ -1,7 +1,7 @@
use anyhow::{anyhow, Context};
use bollard::{container::ListContainersOptions, Docker};
use monitor_types::entities::{
deployment::BasicContainerInfo,
deployment::ContainerSummary,
server::{docker_image::ImageSummary, docker_network::DockerNetwork},
};
@@ -19,7 +19,7 @@ impl Default for DockerClient {
}
impl DockerClient {
pub async fn list_containers(&self) -> anyhow::Result<Vec<BasicContainerInfo>> {
pub async fn list_containers(&self) -> anyhow::Result<Vec<ContainerSummary>> {
let res = self
.docker
.list_containers(Some(ListContainersOptions::<String> {
@@ -29,7 +29,7 @@ impl DockerClient {
.await?
.into_iter()
.map(|s| {
let info = BasicContainerInfo {
let info = ContainerSummary {
id: s.id.unwrap_or_default(),
name: s
.names
@@ -47,7 +47,7 @@ impl DockerClient {
};
Ok::<_, anyhow::Error>(info)
})
.collect::<anyhow::Result<Vec<BasicContainerInfo>>>()?;
.collect::<anyhow::Result<Vec<ContainerSummary>>>()?;
Ok(res)
}

View File

@@ -1,7 +1,7 @@
use anyhow::{anyhow, Context};
use monitor_types::{
entities::{
deployment::{BasicContainerInfo, Deployment, DockerContainerStats, TerminationSignal},
deployment::{ContainerSummary, Deployment, DockerContainerStats, TerminationSignal},
update::Log,
},
optional_string,
@@ -14,12 +14,12 @@ use crate::{helpers::docker, state::State};
//
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(Vec<BasicContainerInfo>)]
#[response(Vec<ContainerSummary>)]
pub struct GetContainerList {}
#[async_trait::async_trait]
impl Resolve<GetContainerList> for State {
async fn resolve(&self, _: GetContainerList, _: ()) -> anyhow::Result<Vec<BasicContainerInfo>> {
async fn resolve(&self, _: GetContainerList, _: ()) -> anyhow::Result<Vec<ContainerSummary>> {
self.docker.list_containers().await
}
}

View File

@@ -0,0 +1,30 @@
import { exec } from "child_process";
import { readFileSync, writeFileSync } from "fs";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
console.log("generating typescript types...");
const gen_command =
"RUST_BACKTRACE=1 typeshare . --lang=typescript --output-file=./client/ts/src/types.ts";
exec(gen_command, (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log("generated types using typeshare");
fix_types();
console.log("finished.");
});
function fix_types() {
const types_path = __dirname + "/src/types.ts";
const contents = readFileSync(types_path);
const fixed = contents
.toString()
.replaceAll("ResourceTargetVariant", 'ResourceTarget["type"]');
writeFileSync(types_path, fixed);
}

View File

@@ -20,7 +20,7 @@ export type LoginOptions = {
};
export function MonitorClient(base_url: string, token?: string) {
let jwt = token ?? "";
const state = { jwt: token ?? "" };
const auth = async <R extends AuthRequest>(
request: R
@@ -39,56 +39,49 @@ export function MonitorClient(base_url: string, token?: string) {
type: "LoginLocalUser",
params: { username: options.username, password: options.password },
});
jwt = res.jwt;
state.jwt = res.jwt;
return res.jwt;
} else if (options.secret) {
const res = await auth({
const { jwt } = await auth({
type: "LoginWithSecret",
params: { username: options.username, secret: options.secret },
});
jwt = res.jwt;
return res.jwt;
state.jwt = jwt;
return jwt;
}
}
};
const read = async <R extends ReadRequest>(
request: R
): Promise<ReadResponses[R["type"]]> => {
const request = async <Req, Res>(
path: string,
request: Req
): Promise<Res> => {
return await axios({
method: "post",
url: base_url + "/read",
url: base_url + path,
headers: {
Authorization: `Bearer ${jwt}`,
Authorization: `Bearer ${state.jwt}`,
},
data: request,
}).then(({ data }) => data);
};
const read = async <R extends ReadRequest>(
req: R
): Promise<ReadResponses[R["type"]]> => {
return await request("/read", req);
};
const write = async <R extends WriteRequest>(
request: R
req: R
): Promise<WriteResponses[R["type"]]> => {
return await axios({
method: "post",
url: base_url + "/write",
headers: {
Authorization: `Bearer ${jwt}`,
},
data: request,
}).then(({ data }) => data);
return await request("/write", req);
};
const execute = async <R extends ExecuteRequest>(
request: R
req: R
): Promise<ExecuteResponses[R["type"]]> => {
return await axios({
method: "post",
url: base_url + "/execute",
headers: {
Authorization: `Bearer ${jwt}`,
},
data: request,
}).then(({ data }) => data);
return await request("/execute", req);
};
return {

View File

@@ -1,131 +1,136 @@
import * as Res from "./types";
import * as Types from "./types";
export type AuthResponses = {
GetLoginOptions: Res.GetLoginOptionsResponse;
CreateLocalUser: Res.CreateLocalUserResponse;
LoginLocalUser: Res.LoginLocalUserResponse;
ExchangeForJwt: Res.ExchangeForJwtResponse;
LoginWithSecret: Res.LoginWithSecretResponse;
GetLoginOptions: Types.GetLoginOptionsResponse;
CreateLocalUser: Types.CreateLocalUserResponse;
LoginLocalUser: Types.LoginLocalUserResponse;
ExchangeForJwt: Types.ExchangeForJwtResponse;
LoginWithSecret: Types.LoginWithSecretResponse;
};
export type ReadResponses = {
GetVersion: Res.GetVersion;
GetUser: Res.GetUser;
GetVersion: Types.GetVersionResponse;
GetUser: Types.User;
// ==== SEARCH ====
FindResources: Res.FindResources;
FindResources: Types.FindResourcesResponse;
// ==== SERVER ====
GetPeripheryVersion: Res.GetPeripheryVersion;
GetSystemInformation: Res.GetSystemInformation;
GetDockerContainers: Res.GetDockerContainers;
GetDockerImages: Res.GetDockerImages;
GetDockerNetworks: Res.GetDockerNetworks;
GetServer: Res.GetServer;
ListServers: Res.ListServers;
GetServerActionState: Res.GetServerActionState;
GetServer: Types.GetServer;
ListServers: Types.ListServers;
GetServerStatus: Types.GetServerStatusResponse;
GetPeripheryVersion: Types.GetPeripheryVersionResponse;
GetSystemInformation: Types.SystemInformation;
GetDockerContainers: Types.ContainerSummary[];
GetDockerImages: Types.ImageSummary[];
GetDockerNetworks: Types.DockerNetwork[];
GetServerActionState: Types.ServerActionState;
// ==== DEPLOYMENT ====
GetDeployment: Res.GetDeployment;
ListDeployments: Res.ListDeployments;
GetDeploymentActionState: Res.GetDeploymentActionState;
GetDeployment: Types.Deployment;
ListDeployments: Types.DeploymentListItem[];
GetDeploymentStatus: Types.GetDeploymentStatusResponse;
GetDeploymentActionState: Types.DeploymentActionState;
GetDeployedVersion: Types.GetDeployedVersionResponse;
GetDeploymentStats: Types.GetDeploymentStatusResponse;
GetLog: Types.Log;
// ==== BUILD ====
GetBuild: Res.GetBuild;
ListBuilds: Res.ListBuilds;
GetBuildActionState: Res.GetBuildActionState;
GetBuild: Types.Build;
ListBuilds: Types.BuildListItem;
GetBuildActionState: Types.BuildActionState;
// ==== BUILDER ====
GetBuilder: Res.GetBuilder;
ListBuilders: Res.ListBuilders;
GetBuilder: Types.Builder;
ListBuilders: Types.Builder[];
// ==== REPO ====
GetRepo: Res.GetRepo;
ListRepos: Res.ListRepos;
GetRepoActionState: Res.GetRepoActionState;
GetRepo: Types.Repo;
ListRepos: Types.RepoListItem[];
GetRepoActionState: Types.RepoActionState;
// ==== TAG ====
GetTag: Res.GetTag;
ListTags: Res.ListTags;
GetTag: Types.CustomTag;
ListTags: Types.CustomTag[];
// ==== SERVER STATS ====
GetAllSystemStats: Res.GetAllSystemStats;
GetBasicSystemStats: Res.GetBasicSystemStats;
GetCpuUsage: Res.GetCpuUsage;
GetDiskUsage: Res.GetDiskUsage;
GetNetworkUsage: Res.GetNetworkUsage;
GetSystemProcesses: Res.GetSystemProcesses;
GetSystemComponents: Res.GetSystemComponents;
GetAllSystemStats: Types.AllSystemStats;
GetBasicSystemStats: Types.BasicSystemStats;
GetCpuUsage: Types.CpuUsage;
GetDiskUsage: Types.DiskUsage;
GetNetworkUsage: Types.NetworkUsage;
GetSystemProcesses: Types.SystemProcess[];
GetSystemComponents: Types.SystemComponent[];
};
export type WriteResponses = {
// ==== SECRET ====
CreateLoginSecret: Res.CreateLoginSecret;
DeleteLoginSecret: Res.DeleteLoginSecret;
CreateLoginSecret: Types.CreateLoginSecretResponse;
DeleteLoginSecret: Types.DeleteLoginSecretResponse;
// ==== PERMISSIONS ====
UpdateUserPerimissions: Res.UpdateUserPermissions;
UpdateUserPermissionsOnTarget: Res.UpdateUserPermissionsOnTarget;
UpdateUserPerimissions: Types.Update;
UpdateUserPermissionsOnTarget: Types.Update;
// ==== SERVER ====
CreateServer: Res.CreateServer;
DeleteServer: Res.DeleteServer;
UpdateServer: Res.UpdateServer;
RenameServer: Res.RenameServer;
CreateServer: Types.Server;
DeleteServer: Types.Server;
UpdateServer: Types.Server;
RenameServer: Types.Update;
// ==== DEPLOYMENT ====
CreateDeployment: Res.CreateDeployment;
CopyDeployment: Res.CopyDeployment;
DeleteDeployment: Res.DeleteDeployment;
UpdateDeployment: Res.UpdateDeployment;
RenameDeployment: Res.RenameDeployment;
CreateDeployment: Types.Deployment;
CopyDeployment: Types.Deployment;
DeleteDeployment: Types.Deployment;
UpdateDeployment: Types.Deployment;
RenameDeployment: Types.Update;
// ==== BUILD ====
CreateBuild: Res.CreateBuild;
CopyBuild: Res.CopyBuild;
DeleteBuild: Res.DeleteBuild;
UpdateBuild: Res.UpdateBuild;
CreateBuild: Types.Build;
CopyBuild: Types.Build;
DeleteBuild: Types.Build;
UpdateBuild: Types.Build;
// ==== BUILDER ====
CreateBuilder: Res.CreateBuilder;
CopyBuilder: Res.CopyBuilder;
DeleteBuilder: Res.DeleteBuilder;
UpdateBuilder: Res.UpdateBuilder;
CreateBuilder: Types.Builder;
CopyBuilder: Types.Builder;
DeleteBuilder: Types.Builder;
UpdateBuilder: Types.Builder;
// ==== REPO ====
CreateRepo: Res.CreateRepo;
CopyRepo: Res.CopyRepo;
DeleteRepo: Res.DeleteRepo;
UpdateRepo: Res.UpdateRepo;
CreateRepo: Types.Repo;
CopyRepo: Types.Repo;
DeleteRepo: Types.Repo;
UpdateRepo: Types.Repo;
// ==== ALERTER ====
CreateAlerter: Res.CreateAlerter;
CopyAlerter: Res.CopyAlerter;
DeleteAlerter: Res.DeleteAlerter;
UpdateAlerter: Res.UpdateAlerter;
CreateAlerter: Types.Alerter;
CopyAlerter: Types.Alerter;
DeleteAlerter: Types.Alerter;
UpdateAlerter: Types.Alerter;
// ==== TAG ====
CreateTag: Res.CreateTag;
DeleteTag: Res.DeleteTag;
UpdateTag: Res.UpdateTag;
CreateTag: Types.CustomTag;
DeleteTag: Types.CustomTag;
UpdateTag: Types.CustomTag;
};
export type ExecuteResponses = {
// ==== SERVER ====
PruneContainers: Res.PruneDockerContainers;
PruneImages: Res.PruneDockerImages;
PruneNetworks: Res.PruneDockerNetworks;
PruneContainers: Types.Update;
PruneImages: Types.Update;
PruneNetworks: Types.Update;
// ==== DEPLOYMENT ====
Deploy: Res.Deploy;
StartContainer: Res.StartContainer;
StopContainer: Res.StopContainer;
RemoveContainer: Res.RemoveContainer;
Deploy: Types.Update;
StartContainer: Types.Update;
StopContainer: Types.Update;
RemoveContainer: Types.Update;
// ==== BUILD ====
RunBuild: Res.RunBuild;
RunBuild: Types.Update;
// ==== REPO ====
CloneRepo: Res.CloneRepo;
PullRepo: Res.PullRepo;
CloneRepo: Types.Update;
PullRepo: Types.Update;
};

View File

@@ -19,8 +19,6 @@ export enum PermissionLevel {
export type PermissionsMap = Record<string, PermissionLevel>;
export type _ResourceTargetVariant = ResourceTarget["type"];
export type I64 = number;
export type U64 = number;
@@ -221,7 +219,7 @@ export enum DockerContainerState {
Dead = "dead",
}
export interface BasicContainerInfo {
export interface ContainerSummary {
name: string;
id: string;
image: string;
@@ -378,15 +376,6 @@ export interface ServerActionState {
pruning_images: boolean;
}
export interface SystemInformation {
name?: string;
os?: string;
kernel?: string;
core_count?: number;
host_name?: string;
cpu_brand: string;
}
export interface BasicSystemStats {
system_load: number;
cpu_perc: number;
@@ -431,7 +420,7 @@ export interface SystemNetwork {
export interface NetworkUsage {
recieved_kb: number;
transmitted_kb: number;
networks: SystemNetwork[];
networks?: SystemNetwork[];
}
export interface SystemProcess {
@@ -453,6 +442,26 @@ export interface SystemComponent {
critical?: number;
}
export interface SystemStatsRecord {
ts: I64;
server_id: string;
basic: BasicSystemStats;
cpu: CpuUsage;
disk: DiskUsage;
network: NetworkUsage;
processes?: SystemProcess[];
components?: SystemComponent[];
}
export interface SystemInformation {
name?: string;
os?: string;
kernel?: string;
core_count?: number;
host_name?: string;
cpu_brand: string;
}
export enum Timelength {
OneSecond = "1-sec",
FiveSeconds = "5-sec",
@@ -490,9 +499,9 @@ export interface AllSystemStats {
}
export enum StatsState {
Ok = "Ok",
Warning = "Warning",
Critical = "Critical",
Ok = "OK",
Warning = "WARNING",
Critical = "CRITICAL",
}
export interface ServerHealth {
@@ -521,15 +530,6 @@ export interface CustomTag {
color?: TagColor;
}
export type ResourceTarget =
| { type: "System", id?: undefined }
| { type: "Build", id: string }
| { type: "Builder", id: string }
| { type: "Deployment", id: string }
| { type: "Server", id: string }
| { type: "Repo", id: string }
| { type: "Alerter", id: string };
export enum Operation {
None = "None",
CreateServer = "CreateServer",
@@ -568,6 +568,15 @@ export enum Operation {
AutoPull = "AutoPull",
}
export type ResourceTarget =
| { type: "System", id?: undefined }
| { type: "Build", id: string }
| { type: "Builder", id: string }
| { type: "Deployment", id: string }
| { type: "Server", id: string }
| { type: "Repo", id: string }
| { type: "Alerter", id: string };
export interface Log {
stage: string;
command: string;
@@ -586,14 +595,14 @@ export enum UpdateStatus {
export interface Update {
_id?: MongoId;
target: ResourceTarget;
operation: Operation;
logs: Log[];
start_ts: I64;
end_ts?: I64;
status: UpdateStatus;
success: boolean;
operator: string;
target: ResourceTarget;
logs: Log[];
end_ts?: I64;
status: UpdateStatus;
version: Version;
}
@@ -768,8 +777,8 @@ export interface GetDeploymentStatus {
}
export interface GetDeploymentStatusResponse {
status?: string;
state: DockerContainerState;
status?: string;
}
export interface GetLog {
@@ -824,7 +833,7 @@ export interface GetRepoActionState {
export type Tag =
| { type: "ResourceType", params: {
resource: _ResourceTargetVariant;
resource: ResourceTarget["type"];
}}
| { type: "Server", params: {
server_id: string;
@@ -1074,6 +1083,9 @@ export interface DeleteLoginSecret {
name: string;
}
export interface DeleteLoginSecretResponse {
}
export interface CreateServer {
name: string;
config: _PartialServerConfig;
@@ -1141,17 +1153,22 @@ export type ReadRequest =
| { type: "GetVersion", params: GetVersion }
| { type: "GetUser", params: GetUser }
| { type: "FindResources", params: FindResources }
| { type: "GetServer", params: GetServer }
| { type: "ListServers", params: ListServers }
| { type: "GetServerStatus", params: GetServerStatus }
| { type: "GetPeripheryVersion", params: GetPeripheryVersion }
| { type: "GetSystemInformation", params: GetSystemInformation }
| { type: "GetDockerContainers", params: GetDockerContainers }
| { type: "GetDockerImages", params: GetDockerImages }
| { type: "GetDockerNetworks", params: GetDockerNetworks }
| { type: "GetServer", params: GetServer }
| { type: "ListServers", params: ListServers }
| { type: "GetServerActionState", params: GetServerActionState }
| { type: "GetDeployment", params: GetDeployment }
| { type: "ListDeployments", params: ListDeployments }
| { type: "GetDeploymentStatus", params: GetDeploymentStatus }
| { type: "GetDeploymentActionState", params: GetDeploymentActionState }
| { type: "GetDeployedVersion", params: GetDeployedVersion }
| { type: "GetDeploymentStats", params: GetDeploymentStats }
| { type: "GetLog", params: GetLog }
| { type: "GetBuild", params: GetBuild }
| { type: "ListBuilds", params: ListBuilds }
| { type: "GetBuildActionState", params: GetBuildActionState }
@@ -1204,3 +1221,51 @@ export type WriteRequest =
| { type: "DeleteTag", params: DeleteTag }
| { type: "UpdateTag", params: UpdateTag };
export type Alert =
| { type: "ServerUnreachable", data: {
id: string;
name: string;
region?: string;
}}
| { type: "ServerCpu", data: {
id: string;
name: string;
region?: string;
state: StatsState;
percentage: number;
top_procs: SystemProcess[];
}}
| { type: "ServerMem", data: {
id: string;
name: string;
region?: string;
state: StatsState;
used_gb: number;
total_gb: number;
top_procs: SystemProcess[];
}}
| { type: "ServerDisk", data: {
id: string;
name: string;
region?: string;
state: StatsState;
path: string;
used_gb: number;
total_gb: number;
}}
| { type: "ServerTemp", data: {
id: string;
name: string;
region?: string;
state: StatsState;
temp: number;
max: number;
}}
| { type: "ContainerStateChange", data: {
id: string;
name: string;
server: string;
from: DockerContainerState;
to: DockerContainerState;
}};

File diff suppressed because it is too large Load Diff

View File

@@ -162,7 +162,7 @@ pub struct Conversion {
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct BasicContainerInfo {
pub struct ContainerSummary {
pub name: String,
pub id: String,
pub image: String,

View File

@@ -13,15 +13,12 @@ use crate::MongoId;
use super::update::ResourceTargetVariant;
#[typeshare(serialized_as = "ResourceTarget["type"]")]
type _ResourceTargetVariant = ResourceTargetVariant;
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, EnumVariants)]
#[variant_derive(Serialize, Deserialize, Debug, Clone, Copy, Display, EnumString)]
#[serde(tag = "type", content = "params")]
pub enum Tag {
ResourceType { resource: _ResourceTargetVariant }, // filter by resource type
ResourceType { resource: ResourceTargetVariant }, // filter by resource type
Server { server_id: String }, // filter by server, eg deployments, builds, repos
Custom { tag_id: String }, // filter by presence of custom tag on resource
}

View File

@@ -54,8 +54,8 @@ pub struct GetDeploymentStatus {
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GetDeploymentStatusResponse {
pub status: Option<String>,
pub state: DockerContainerState,
pub status: Option<String>,
}
//

View File

@@ -4,7 +4,7 @@ use typeshare::typeshare;
use crate::{
entities::{
deployment::BasicContainerInfo,
deployment::ContainerSummary,
server::{
docker_image::ImageSummary,
docker_network::DockerNetwork,
@@ -178,7 +178,7 @@ pub struct GetDockerImages {
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(Vec<BasicContainerInfo>)]
#[response(Vec<ContainerSummary>)]
pub struct GetDockerContainers {
pub server_id: String,
}

View File

@@ -24,7 +24,11 @@ pub struct CreateLoginSecretResponse {
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Request)]
#[response(())]
#[response(DeleteLoginSecretResponse)]
pub struct DeleteLoginSecret {
pub name: String,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct DeleteLoginSecretResponse {}