Files
kuber/shared/api.ts
T

249 lines
5.8 KiB
TypeScript

export type JsonPrimitive = string | number | boolean | null;
export type JsonValue =
| JsonPrimitive
| JsonValue[]
| { [key: string]: JsonValue };
export type ApiProblemDetails = {
type?: string;
title: string;
status: number;
detail?: string;
message?: string;
/** Stable machine-readable identifier, unlike title or detail. */
code: string;
requestId?: string;
operationId?: string;
errors?: Record<string, string[]>;
};
export type Page<T> = {
items: T[];
nextCursor?: string;
};
export const KUBER_API_VERSION = "kuber.astrxl.dev/v2" as const;
export type ObjectMeta = {
name: string;
uid: string;
resourceVersion: string;
creationTimestamp: string;
labels?: Record<string, string>;
annotations?: Record<string, string>;
};
export type WorkspaceSourceReference = {
uri: string;
digest: string;
revision?: string;
};
export type WorkspaceSpec = {
source: WorkspaceSourceReference;
config?: unknown;
};
export type Workspace = {
apiVersion: typeof KUBER_API_VERSION;
kind: "Workspace";
metadata: ObjectMeta;
spec: WorkspaceSpec;
status: { latestRevision: number };
};
export type CreateWorkspaceRequest = {
id: string;
source: WorkspaceSourceReference;
config?: unknown;
labels?: Record<string, string>;
annotations?: Record<string, string>;
};
export type UpdateWorkspaceRequest = Omit<CreateWorkspaceRequest, "id">;
export type CreateWorkspaceResponse = Workspace;
export type ListWorkspacesResponse = Page<Workspace>;
export type GetWorkspaceResponse = Workspace;
export type WorkspaceTrustResponse = {
fingerprints: string[];
};
export type DeleteWorkspaceResponse = OperationAcceptedResponse;
export type AdoptWorkspaceResponse = {
workspaceId: string;
workspaceUid: string;
resourcesAdopted: number;
};
export type AdoptPlatformRequest = { workspaceUid: string };
export type AdoptPlatformResponse = AdoptWorkspaceResponse;
export type WorkspaceState =
| "pending"
| "ready"
| "degraded"
| "stopped"
| "deleting"
| "failed";
export type ServiceStatus = {
name: string;
state: "pending" | "running" | "stopped" | "failed" | "unknown";
readyReplicas: number;
desiredReplicas: number;
image?: string;
message?: string;
};
export type WorkspaceStatusResponse = {
workspaceId: string;
state: WorkspaceState;
services: ServiceStatus[];
observedAt: string;
};
export type LifecycleAction = "start" | "stop" | "restart" | "delete";
export type LifecycleRequest = {
action: LifecycleAction;
services?: string[];
};
export type LifecycleResponse = OperationAcceptedResponse;
export type ResourceObject = {
apiVersion: string;
kind: string;
metadata: {
name: string;
namespace?: string;
labels?: Record<string, string>;
annotations?: Record<string, string>;
};
} & Record<string, unknown>;
export type ResourceChange = {
apiVersion: string;
kind: string;
name: string;
action: "create" | "update" | "delete" | "unchanged";
};
export type ReconcileResourcesRequest = {
resources: ResourceObject[];
prune?: boolean;
dryRun?: boolean;
};
export type ReconcileResourcesResponse = {
operationId?: string;
changes: ResourceChange[];
};
export type DatabaseEngine = "postgres";
export type DatabaseClaim = {
name: string;
engine: DatabaseEngine;
database?: string;
username?: string;
};
export type ReconcileDatabasesRequest = { claims: DatabaseClaim[] };
export type DatabaseBinding = {
claim: string;
service: string;
environment: Record<string, string>;
};
export type ReconcileDatabasesResponse = {
bindings: DatabaseBinding[];
operationId?: string;
};
export type StorageKind = "s3";
export type StorageClaim = {
name: string;
kind: StorageKind;
bucket?: string;
region?: string;
};
export type ReconcileStorageRequest = { claims: StorageClaim[] };
export type StorageBinding = {
claim: string;
service: string;
environment: Record<string, string>;
};
export type ReconcileStorageResponse = {
bindings: StorageBinding[];
operationId?: string;
};
export type OperationState =
| "pending"
| "running"
| "succeeded"
| "failed"
| "cancelled";
export type OperationError = { code: string; message: string };
export type Operation = {
apiVersion: typeof KUBER_API_VERSION;
kind: "Operation";
metadata: ObjectMeta & { workspaceUid?: string };
spec: { workspaceId: string; action: string };
status: {
state: OperationState;
startedAt?: string;
finishedAt?: string;
result?: unknown;
error?: OperationError;
};
};
export type OperationAcceptedResponse = {
operationId: string;
operation?: Operation;
};
export type GetOperationResponse = Operation;
export type CancelOperationResponse = Operation;
export type OperationEvent = {
operationId: string;
sequence: number;
timestamp: string;
type: "status" | "progress" | "log" | "result" | "error";
data: JsonValue;
};
export type UserRole = "admin" | "operator" | "viewer" | (string & {});
export type User = {
username: string;
roles: UserRole[];
disabled: boolean;
createdAt?: string;
updatedAt?: string;
};
export type CreateUserRequest = {
username: string;
password: string;
roles: UserRole[];
};
export type UpdateUserRequest = {
password?: string;
roles?: UserRole[];
disabled?: boolean;
};
export type UserResponse = User;
export type ListUsersResponse = Page<User>;
export type AuditEvent = {
id: string;
timestamp: string;
actor: string;
action: string;
resourceType: string;
resourceId?: string;
workspaceId?: string;
requestId?: string;
operationId?: string;
outcome: "success" | "failure";
metadata?: Record<string, JsonValue>;
};
export type ListAuditEventsRequest = {
cursor?: string;
limit?: number;
actor?: string;
workspaceId?: string;
since?: string;
until?: string;
};
export type ListAuditEventsResponse = Page<AuditEvent>;