import {z} from 'zod' export type GetApiClustersClusterNameArgs = {ClusterName: string}; export type GetApiClustersClusterNameOptions = {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 protocolVersionV2 = z.object({ProductName: z.enum(["cvm", "fen", "fs", "gab", "odm", "vcs"]), Version: z.string().optional(), SupportedVersions: z.array(z.object({NodeName: z.string().optional(), Versions: z.array(z.string()).optional()})).optional()}); export const clusterV2v0 = z.object({AdministratorGroups: attribute.optional(), Administrators: attribute.optional(), AutoClearQ: attribute.optional(), AutoStartTimeout: attribute.optional(), AutoAddSystemToCSG: attribute.optional(), BackupInterval: attribute.optional(), CID: attribute.optional(), ClusState: attribute.optional(), ClusterAddress: attribute.optional(), ClusterLocation: attribute.optional(), ClusterName: attribute.optional(), ClusterOwner: attribute.optional(), ClusterRecipients: attribute.optional(), ClusterTime: attribute.optional(), ClusterUUID: attribute.optional(), CompareRSM: attribute.optional(), ConfigState: z.enum(["DUMP", "MAKERO_DUMP", "MAKERW"]).optional(), Protocols: z.array(protocolVersionV2).optional(), ConnectorState: attribute.optional(), CounterInterval: attribute.optional(), CounterMissAction: attribute.optional(), CounterMissTolerance: attribute.optional(), CredRenewFrequency: attribute.optional(), CVMNodeStates: z.array(z.object({system: z.string().optional(), role: z.string().optional(), state: z.string().optional(), errDetails: z.string().optional()})).optional(), DeleteOnlineResource: attribute.optional(), DumpingMembership: attribute.optional(), EngineClass: attribute.optional(), EngineVersion: attribute.optional(), EnableFFDC: attribute.optional(), EnableVMAutoDiscovery: attribute.optional(), EnablePBF: attribute.optional(), EnginePriority: attribute.optional(), EngineShutdown: attribute.optional(), FipsMode: attribute.optional(), GlobalCounter: attribute.optional(), Guests: attribute.optional(), GuestGroups: attribute.optional(), DefaultGuestAccess: attribute.optional(), GroupLimit: attribute.optional(), HacliUserLevel: attribute.optional(), HostAvailableMeters: attribute.optional(), HostMeters: attribute.optional(), IV256List: attribute.optional(), LockMemory: attribute.optional(), LogClusterUUID: attribute.optional(), LogSize: attribute.optional(), MeterControl: attribute.optional(), MeterUnit: attribute.optional(), MeterWeight: attribute.optional(), MixedVersion: attribute.optional(), Notifier: attribute.optional(), OpenVCSCommunicationPort: attribute.optional(), OperatorGroups: attribute.optional(), Operators: attribute.optional(), PanicOnNoMem: attribute.optional(), PreferredFencingPolicy: attribute.optional(), PrintMsg: attribute.optional(), ProcessClass: attribute.optional(), ProcessPriority: attribute.optional(), ProtocolNumber: attribute.optional(), ReadOnly: attribute.optional(), ResourceLimit: attribute.optional(), SecInfo: attribute.optional(), SecInfo256: attribute.optional(), IV256: attribute.optional(), SecInfoLevel: attribute.optional(), SecureClus: attribute.optional(), SiteAware: attribute.optional(), SourceFile: attribute.optional(), Statistics: attribute.optional(), Stewards: attribute.optional(), SystemRebootAction: attribute.optional(), TypeLimit: attribute.optional(), UseFence: attribute.optional(), UserNames: attribute.optional(), VCSFeatures: attribute.optional(), VCSMode: attribute.optional(), WACPort: 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 info * * GET /clusters/{ClusterName} */ export const getApiClustersClusterName = async (args: GetApiClustersClusterNameArgs, options: GetApiClustersClusterNameOptions) => { 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))}${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(clusterV2v0, await res.json()) };