import * as plugins from '../plugins.js'; import type { IArchivePruneResult, IArchiveRetentionPolicy, IBackupArchiveManifest, IBackupArchiveObject, IBackupRecord, IBackupReplicationResult, IIsolatedRestoreNodeState, IIsolatedRestoreRecord, TBackupSnapshot, TIsolatedRestoreResourceMapping } from '../data/backup.js'; import type { IService } from '../data/service.js'; import type { IIdentity, IIdentityCredential } from '../data/user.js'; export interface IReq_Any_Cloudly_CreateServiceBackup extends plugins.typedrequestInterfaces.implementsTR { method: 'createServiceBackup'; request: { identity: IIdentity; serviceId: string; clusterId?: string; tags?: Record; replicate?: boolean; }; response: { backup: IBackupRecord; }; } export interface IReq_Any_Cloudly_GetServiceBackups extends plugins.typedrequestInterfaces.implementsTR { method: 'getServiceBackups'; request: { identity: IIdentity; serviceId?: string; status?: IBackupRecord['status']; }; response: { backups: IBackupRecord[]; }; } export interface IReq_Any_Cloudly_GetBackupById extends plugins.typedrequestInterfaces.implementsTR { method: 'getBackupById'; request: { identity: IIdentity; backupId: string; }; response: { backup: IBackupRecord; }; } export interface IReq_Any_Cloudly_RestoreServiceBackup extends plugins.typedrequestInterfaces.implementsTR { method: 'restoreServiceBackup'; request: { identity: IIdentity; backupId: string; clear?: boolean; resourceTypes?: Array; }; response: { backup: IBackupRecord; }; } export interface IReq_Cloudly_Coreflow_ExecuteServiceBackup extends plugins.typedrequestInterfaces.implementsTR { method: 'executeServiceBackup'; request: { backupId: string; service: IService; tags?: Record; replication?: { enabled: boolean; }; }; response: { snapshots: TBackupSnapshot[]; replication?: IBackupReplicationResult; }; } export interface IReq_Cloudly_Coreflow_ExecuteServiceRestore extends plugins.typedrequestInterfaces.implementsTR { method: 'executeServiceRestore'; request: { backupId: string; service: IService; snapshots: TBackupSnapshot[]; clear?: boolean; resourceTypes?: Array; replication?: { enabled: boolean; }; }; response: { restored: TBackupSnapshot[]; }; } export interface IReq_Coreflow_Cloudly_PrepareBackupReplication extends plugins.typedrequestInterfaces.implementsTR { method: 'prepareBackupReplication'; request: { identity: IIdentity; backupId: string; manifest: IBackupArchiveManifest; }; response: { missingObjects: IBackupArchiveObject[]; }; } export interface IReq_Coreflow_Cloudly_UploadBackupArchiveObject extends plugins.typedrequestInterfaces.implementsTR { method: 'uploadBackupArchiveObject'; request: { identity: IIdentity; backupId: string; object: IBackupArchiveObject; contentsBase64: string; }; response: { accepted: boolean; }; } export interface IReq_Coreflow_Cloudly_CompleteBackupReplication extends plugins.typedrequestInterfaces.implementsTR { method: 'completeBackupReplication'; request: { identity: IIdentity; backupId: string; manifest: IBackupArchiveManifest; }; response: { replication: IBackupReplicationResult; }; } export interface IReq_Coreflow_Cloudly_GetBackupArchiveManifest extends plugins.typedrequestInterfaces.implementsTR { method: 'getBackupArchiveManifest'; request: { identity: IIdentity; backupId: string; }; response: { manifest: IBackupArchiveManifest; }; } export interface IReq_Coreflow_Cloudly_DownloadBackupArchiveObject extends plugins.typedrequestInterfaces.implementsTR { method: 'downloadBackupArchiveObject'; request: { identity: IIdentity; backupId: string; object: IBackupArchiveObject; }; response: { object: IBackupArchiveObject; contentsBase64: string; }; } export interface IReq_Cloudly_Coreflow_PruneNodeArchive extends plugins.typedrequestInterfaces.implementsTR { method: 'coreflowPruneNodeArchive'; request: { retention: IArchiveRetentionPolicy; dryRun?: boolean; }; response: { found: boolean; result?: IArchivePruneResult; }; } /** * Creates a restore in a new non-runnable data-plane scratch namespace. * Cloudly derives clusterId and sourceServiceId from the authoritative backup, * atomically acquires its retention hold, and owns every generated target id. */ export interface IReq_Any_Cloudly_CreateIsolatedRestore extends plugins.typedrequestInterfaces.implementsTR { method: 'createIsolatedRestore'; request: { /** Cloudly verifies this credential and derives all actor claims server-side. */ identity: IIdentityCredential; sourceBackupId: string; targetNodeName: string; purpose: string; /** Caller-generated key; retries return the original restore. */ idempotencyKey: string; /** Requested lifetime; Cloudly applies its configured maximum. */ ttlMs?: number; /** Derived from the authoritative backup. */ clusterId?: never; /** Derived from the authoritative backup. */ sourceServiceId?: never; /** Generated by Cloudly. Explicitly forbidden as caller input. */ id?: never; /** Alias-like caller input is forbidden as well. */ restoreId?: never; /** Legacy runnable-service targeting is forbidden. */ targetServiceId?: never; /** Generated by Cloudly. Explicitly forbidden as caller input. */ scratchNamespaceId?: never; /** Generated by Cloudly. Explicitly forbidden as caller input. */ stagingArchiveId?: never; /** Generated after validating every snapshot in the source backup. */ resourceMappings?: never; }; response: { restore: IIsolatedRestoreRecord; }; } export interface IReq_Any_Cloudly_GetIsolatedRestores extends plugins.typedrequestInterfaces.implementsTR { method: 'getIsolatedRestores'; request: { /** Cloudly verifies this credential and derives all actor claims server-side. */ identity: IIdentityCredential; sourceBackupId?: string; sourceServiceId?: string; clusterId?: string; targetNodeName?: string; scratchNamespaceId?: string; status?: IIsolatedRestoreRecord['status']; includeCleaned?: boolean; /** Opaque cursor returned by the previous page. */ cursor?: string; /** Server-capped page size. */ limit?: number; }; response: { restores: IIsolatedRestoreRecord[]; /** Omitted when this is the final page. */ nextCursor?: string; }; } export interface IReq_Any_Cloudly_GetIsolatedRestoreById extends plugins.typedrequestInterfaces.implementsTR { method: 'getIsolatedRestoreById'; request: { /** Cloudly verifies this credential and derives all actor claims server-side. */ identity: IIdentityCredential; restoreId: string; }; response: { restore: IIsolatedRestoreRecord; }; } /** * Prepares and stages one isolated restore on an exact cluster node. A missing * node state has revision 0; successful mutation returns the next revision. */ export interface IReq_Cloudly_Coreflow_PrepareIsolatedRestore extends plugins.typedrequestInterfaces.implementsTR { method: 'coreflowPrepareIsolatedRestore'; request: { clusterId: string; targetNodeName: string; restoreId: string; expectedRevision: number; sourceBackupId: string; sourceServiceId: string; scratchNamespaceId: string; stagingArchiveId: string; resourceMappings: TIsolatedRestoreResourceMapping[]; archiveManifest: IBackupArchiveManifest; }; response: { state: IIsolatedRestoreNodeState; }; } /** Read-only status for one exact cluster/node/restore routing key. */ export interface IReq_Cloudly_Coreflow_GetIsolatedRestoreStatus extends plugins.typedrequestInterfaces.implementsTR { method: 'coreflowGetIsolatedRestoreStatus'; request: { clusterId: string; targetNodeName: string; restoreId: string; }; response: { found: boolean; state?: IIsolatedRestoreNodeState; }; } export interface IReq_Cloudly_Coreflow_ExecuteIsolatedRestore extends plugins.typedrequestInterfaces.implementsTR { method: 'coreflowExecuteIsolatedRestore'; request: { clusterId: string; targetNodeName: string; restoreId: string; expectedRevision: number; }; response: { state: IIsolatedRestoreNodeState; }; } /** * Idempotent cleanup mutation. A cleanup-failed state remains retryable and * does not authorize release of the source-backup hold. */ export interface IReq_Cloudly_Coreflow_CleanupIsolatedRestore extends plugins.typedrequestInterfaces.implementsTR { method: 'coreflowCleanupIsolatedRestore'; request: { clusterId: string; targetNodeName: string; restoreId: string; expectedRevision: number; }; response: { state: IIsolatedRestoreNodeState; }; } /** * Requests idempotent asynchronous cleanup. The restore record is retained as * audit evidence and transitions through the canonical cleanup statuses. */ export interface IReq_Any_Cloudly_CleanupIsolatedRestore extends plugins.typedrequestInterfaces.implementsTR { method: 'cleanupIsolatedRestore'; request: { /** Cloudly verifies this credential and derives all actor claims server-side. */ identity: IIdentityCredential; restoreId: string; reason: string; }; response: { restore: IIsolatedRestoreRecord; }; }