import {z} from 'zod' export type GetApiClustersClusterNameSystemsSystemNameArgs = {ClusterName: string, SystemName: string}; export type GetApiClustersClusterNameSystemsSystemNameOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const attribute = z.object({Value: z.unknown(), Type: z.enum(["scalar", "vector", "keylist", "associate"]).optional(), KeyAttribute: z.boolean().optional()}); export const link = z.object({rel: z.string().optional(), href: z.string().optional()}); export const operation = z.object({Name: z.string().optional(), href: z.string().optional()}); export const excludedDisk = z.object({DiskId: z.string().max(240).optional(), Name: z.string().optional(), Links: z.array(link).optional(), Operations: z.array(operation).optional()}); export const systemfreeze = z.object({Evacuate: z.boolean().optional(), Frozen: z.boolean().optional(), Persistent: z.boolean().optional()}); export const systemV2v0 = z.object({AgentsStopped: attribute.optional(), AvailableCapacity: attribute.optional(), Capacity: attribute.optional(), ConfigBlockCount: attribute.optional(), ConfigCheckSum: attribute.optional(), ConfigDiskState: attribute.optional(), ConfigFile: attribute.optional(), ConfigInfoCnt: attribute.optional(), ConfigModDate: attribute.optional(), CPUThresholdLevel: attribute.optional(), CPUUsage: attribute.optional(), CPUUsageMonitoring: attribute.optional(), ConnectorState: attribute.optional(), CurrentLimits: attribute.optional(), DiskHbStatus: attribute.optional(), DynamicLoad: attribute.optional(), EngineRestarted: attribute.optional(), EngineVersion: attribute.optional(), ExcludedDisks: z.array(excludedDisk).optional(), FencingWeight: attribute.optional(), Frozen: attribute.optional(), FrozenState: systemfreeze.optional(), GUIIPAddr: attribute.optional(), HostAvailableForecast: attribute.optional(), HostMonitor: attribute.optional(), HostUtilization: attribute.optional(), LicenseType: attribute.optional(), Limits: attribute.optional(), LinkHbStatus: attribute.optional(), LLTNodeId: attribute.optional(), LoadTimeCounter: attribute.optional(), LoadTimeThreshold: attribute.optional(), LoadWarningLevel: attribute.optional(), MemThresholdLevel: attribute.optional(), MeterRecord: attribute.optional(), NoAutoDisable: attribute.optional(), NodeId: attribute.optional(), OnGrpCnt: attribute.optional(), ReservedCapacity: attribute.optional(), ShutdownTimeout: attribute.optional(), Site: attribute.optional(), SourceFile: attribute.optional(), SupportedProtocol: attribute.optional(), SwapThresholdLevel: attribute.optional(), SysInfo: attribute.optional(), SysName: attribute.optional(), SysState: attribute.optional(), SystemLocation: attribute.optional(), SystemOwner: attribute.optional(), SystemRecipients: attribute.optional(), TFrozen: attribute.optional(), TRSE: attribute.optional(), UpDownState: attribute.optional(), UserInt: attribute.optional(), UserStr: attribute.optional(), VCSFeatures: attribute.optional(), VCSMode: attribute.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get cluster system info * * GET /clusters/{ClusterName}/systems/{SystemName} */ export const getApiClustersClusterNameSystemsSystemName = async (args: GetApiClustersClusterNameSystemsSystemNameArgs, options: GetApiClustersClusterNameSystemsSystemNameOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/clusters/${encodeURIComponent(String(args.ClusterName))}/systems/${encodeURIComponent(String(args.SystemName))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(systemV2v0, await res.json()) };