diff --git a/ts/data/baseos.ts b/ts/data/baseos.ts new file mode 100644 index 0000000..8cdc021 --- /dev/null +++ b/ts/data/baseos.ts @@ -0,0 +1,75 @@ +export type TBaseOsRuntimeLevel = 'app-layer' | 'host-os' | 'target-state'; + +export type TBaseOsCloudlyConnectionStatus = + | 'not-configured' + | 'connecting' + | 'connected' + | 'failed'; + +export interface IBalenaDeviceState { + api_port?: number; + ip_address?: string; + mac_address?: string; + commit?: string; + status?: string; + os_version?: string; + supervisor_version?: string; + update_pending?: boolean; + update_downloaded?: boolean; + update_failed?: boolean; + download_progress?: number | null; + [key: string]: unknown; +} + +export interface IBalenaStateStatus { + status?: string; + appState?: string; + overallDownloadProgress?: number | null; + release?: string; + containers?: Array>; + images?: Array>; + [key: string]: unknown; +} + +export interface IBaseOsRuntimeInfo { + runtime: 'baseos'; + runtimeLevel: TBaseOsRuntimeLevel; + nodeId: string; + cloudlyUrl?: string; + cloudlyConnectionStatus: TBaseOsCloudlyConnectionStatus; + supervisorAvailable: boolean; + supervisorAddress?: string; + deviceState?: IBalenaDeviceState; + stateStatus?: IBalenaStateStatus; + checkedAt: number; +} + +export interface IBaseOsDesiredState { + release?: string; + targetState?: Record; + updatedAt?: number; +} + +export interface IBaseOsNode { + id: string; + data: { + runtimeInfo: IBaseOsRuntimeInfo; + desiredState?: IBaseOsDesiredState; + createdAt: number; + updatedAt: number; + lastHeartbeatAt?: number; + }; +} + +export interface IBaseOsRegisterResult { + nodeId?: string; + nodeToken?: string; + accepted: boolean; + message?: string; +} + +export interface IBaseOsHeartbeatResult { + accepted: boolean; + message?: string; + desiredState?: IBaseOsDesiredState; +} diff --git a/ts/data/index.ts b/ts/data/index.ts index 439d0c8..36d7890 100644 --- a/ts/data/index.ts +++ b/ts/data/index.ts @@ -12,6 +12,7 @@ export * from './registry.js'; export * from './secretbundle.js'; export * from './secretgroup.js'; export * from './baremetal.js'; +export * from './baseos.js'; export * from './backup.js'; export * from './clusternode.js'; export * from './settings.js'; diff --git a/ts/data/settings.ts b/ts/data/settings.ts index f551b9f..b69c353 100644 --- a/ts/data/settings.ts +++ b/ts/data/settings.ts @@ -8,6 +8,9 @@ export interface ICloudlySettings { // Cloud Provider Tokens hetznerToken?: string; cloudflareToken?: string; + + // BaseOS enrollment + baseosJoinToken?: string; // AWS Credentials awsAccessKey?: string; @@ -53,4 +56,4 @@ export interface ICloudlySettings { */ export type ICloudlySettingsMasked = { [K in keyof ICloudlySettings]: string | undefined; -}; \ No newline at end of file +}; diff --git a/ts/requests/baseos.ts b/ts/requests/baseos.ts new file mode 100644 index 0000000..2397c7c --- /dev/null +++ b/ts/requests/baseos.ts @@ -0,0 +1,36 @@ +import type { + IBaseOsHeartbeatResult, + IBaseOsNode, + IBaseOsRegisterResult, + IBaseOsRuntimeInfo, +} from '../data/baseos.js'; +import type { IIdentity } from '../data/user.js'; + +export interface IRequest_BaseOs_Cloudly_RegisterNode { + method: 'baseOsRegisterNode'; + request: { + joinToken?: string; + nodeToken?: string; + status: IBaseOsRuntimeInfo; + }; + response: IBaseOsRegisterResult; +} + +export interface IRequest_BaseOs_Cloudly_SendHeartbeat { + method: 'baseOsSendHeartbeat'; + request: { + nodeToken: string; + status: IBaseOsRuntimeInfo; + }; + response: IBaseOsHeartbeatResult; +} + +export interface IRequest_Any_Cloudly_GetBaseOsNodes { + method: 'getBaseOsNodes'; + request: { + identity: IIdentity; + }; + response: { + nodes: IBaseOsNode[]; + }; +} diff --git a/ts/requests/index.ts b/ts/requests/index.ts index e333527..246449c 100644 --- a/ts/requests/index.ts +++ b/ts/requests/index.ts @@ -2,6 +2,7 @@ import * as plugins from '../plugins.js'; import * as adminRequests from './admin.js'; import * as baremetalRequests from './baremetal.js'; +import * as baseOsRequests from './baseos.js'; import * as backupRequests from './backup.js'; import * as certificateRequests from './certificate.js'; import * as clusterRequests from './cluster.js'; @@ -30,6 +31,7 @@ import * as versionRequests from './version.js'; export { adminRequests as admin, baremetalRequests as baremetal, + baseOsRequests as baseos, backupRequests as backup, certificateRequests as certificate, clusterRequests as cluster,