import {z} from 'zod' export type SortOrder = string; export type ClusterListMetadata = {filter?: string | undefined, kind?: string | undefined, sort_order?: SortOrder | undefined, offset?: number | undefined, length?: number | undefined, sort_attribute?: string | undefined}; export type CreateApiClustersListArgs = {body: ClusterListMetadata}; export type CreateApiClustersListOptions = {baseUrl: string, basicAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const messageResource = z.object({message: z.string(), reason: z.string(), details: z.record(z.string(), z.string()).optional()}); export const hypervisorServer = z.object({ip: z.string(), version: z.string().optional(), type: z.string().optional()}); export const clusterNodes = z.object({hypervisor_server_list: z.array(hypervisorServer).optional()}); export const clientAuth = z.object({status: z.string(), ca_chain: z.string().optional(), name: z.string().max(64).optional()}); export const softwareType = z.string(); export const clusterSoftware = z.object({status: z.string().optional(), version: z.string(), software_type: softwareType}); export const encryptionStatus = z.string(); export const sslKeyType = z.string(); export const certificationSigningInfo = z.object({city: z.string().optional(), state: z.string().optional(), country_code: z.string().optional(), common_name: z.string().optional(), organization: z.string().optional(), email_address: z.string().optional(), common_name_suffix: z.string().optional()}); export const sslKey = z.object({key_type: sslKeyType, key_name: z.string().optional(), signing_info: certificationSigningInfo.optional(), expire_datetime: z.string().optional()}); export const clusterServiceList = z.array(z.string()); export const vmReference = z.object({kind: z.string(), name: z.string().optional(), uuid: z.string()}); export const citrixResourceLocation = z.object({id: z.string().optional(), name: z.string().optional()}); export const citrixConnectorConfigDetails = z.object({citrix_vm_reference_list: z.array(vmReference).optional(), client_secret: z.string().optional(), customer_id: z.string().optional(), client_id: z.string().optional(), resource_location: citrixResourceLocation.optional()}); export const externalConfigurations = z.object({citrix_connector_config: citrixConnectorConfigDetails.optional()}); export const caCert = z.object({ca_name: z.string(), certificate: z.string()}); export const clusterManagementServer = z.object({drs_enabled: z.boolean().optional(), ip: z.string(), type: z.string(), status_list: z.array(z.string()).optional()}); export const publicKey = z.object({name: z.string().max(64), key: z.string()}); export const buildInfo = z.object({commit_id: z.string(), version: z.string(), short_commit_id: z.string(), full_version: z.string().optional(), commit_date: z.string().optional(), build_type: z.string()}); export const clusterOperationMode = z.string(); export const clusterConfig = z.object({gpu_driver_version: z.string().optional(), client_auth: clientAuth.optional(), software_map: z.record(z.string(), clusterSoftware).optional(), encryption_status: encryptionStatus.optional(), ssl_key: sslKey.optional(), service_list: clusterServiceList.optional(), certification_signing_info: certificationSigningInfo.optional(), redundancy_factor: z.number().int().optional(), external_configurations: externalConfigurations.optional(), ca_certificate_list: z.array(caCert).optional(), enabled_feature_list: z.array(z.string()).optional(), is_available: z.boolean().optional(), timezone: z.string().optional(), cluster_arch: z.string().optional(), management_server_list: z.array(clusterManagementServer).optional(), authorized_public_key_list: z.array(publicKey).optional(), supported_information_verbosity: z.string().optional(), domain_awareness_level: z.string().optional(), build: buildInfo.optional(), operation_mode: clusterOperationMode.optional()}); export const httpProxyWhitelist = z.object({target: z.string(), target_type: z.string()}); export const credentials = z.object({username: z.string(), password: z.string().optional()}); export const address = z.object({ip: z.string().optional(), ipv6: z.string().optional(), port: z.number().int().optional(), fqdn: z.string().optional()}); export const clusterNetworkEntity = z.object({credentials: credentials.optional(), address: address, proxy_type_list: z.array(z.string()).optional()}); export const smtpServer = z.object({email_address: z.string(), type: z.string().optional(), server: clusterNetworkEntity}); export const clusterDomainServer = z.object({nameserver: z.string().optional(), name: z.string(), domain_credentials: credentials.optional()}); export const vswitchConfig = z.object({nic_teaming_policy: z.string(), uplink_grouping: z.string()}); export const clusterNetwork = z.object({http_proxy_whitelist: z.array(httpProxyWhitelist).optional(), masquerading_port: z.number().int().optional(), masquerading_ip: z.string().optional(), external_ip: z.string().optional(), http_proxy_list: z.array(clusterNetworkEntity).optional(), smtp_server: smtpServer.optional(), ntp_server_ip_list: z.array(z.string()).optional(), external_subnet: z.string().optional(), external_data_services_ip: z.string().optional(), domain_server: clusterDomainServer.optional(), name_server_ip_list: z.array(z.string()).optional(), nfs_subnet_whitelist: z.array(z.string()).optional(), internal_subnet: z.string().optional(), default_vswitch_config: vswitchConfig.optional()}); export const clusterDefStatus = z.object({state: z.string().optional(), message_list: z.array(messageResource).optional(), name: z.string().optional(), resources: z.object({nodes: clusterNodes.optional(), config: clusterConfig, network: clusterNetwork, runtime_status_list: z.array(z.string()).optional()})}); export const citrixResourceLocationSpec = z.object({id: z.string().max(200).optional(), name: z.string().max(200).optional()}); export const citrixConnectorConfigDetailsSpec = z.object({citrix_vm_reference_list: z.array(vmReference).optional(), client_secret: z.string().optional(), customer_id: z.string().max(200).optional(), client_id: z.string().max(200).optional(), resource_location: citrixResourceLocationSpec.optional()}); export const externalConfigurationsSpec = z.object({citrix_connector_config: citrixConnectorConfigDetailsSpec.optional()}); export const clusterConfigSpec = z.object({gpu_driver_version: z.string().optional(), client_auth: clientAuth.optional(), authorized_public_key_list: z.array(publicKey).optional(), software_map: z.record(z.string(), clusterSoftware).optional(), encryption_status: encryptionStatus.optional(), supported_information_verbosity: z.string().optional(), certification_signing_info: certificationSigningInfo.optional(), redundancy_factor: z.number().int().optional(), external_configurations: externalConfigurationsSpec.optional(), domain_awareness_level: z.string().optional(), enabled_feature_list: z.array(z.string()).optional(), timezone: z.string().optional(), operation_mode: clusterOperationMode.optional()}); export const cluster = z.object({name: z.string().optional(), resources: z.object({config: clusterConfigSpec.optional(), network: clusterNetwork.optional(), runtime_status_list: z.array(z.string()).optional()}).optional()}); export const userReference = z.object({kind: z.string(), name: z.string().optional(), uuid: z.string()}); export const clusterMetadata = z.object({last_update_time: z.string().optional(), kind: z.string(), uuid: z.string().optional(), spec_version: z.number().int().optional(), creation_time: z.string().optional(), spec_hash: z.string().optional(), should_force_translate: z.boolean().optional(), owner_reference: userReference.optional(), categories: z.record(z.string(), z.string()).optional(), name: z.string().max(64).optional()}); export const clusterIntentResource = z.object({status: clusterDefStatus.optional(), spec: cluster.optional(), api_version: z.string().optional(), metadata: clusterMetadata}); export const sortOrder = z.string(); export const clusterListMetadataOutput = z.object({filter: z.string().optional(), kind: z.string().optional(), sort_order: sortOrder.optional(), offset: z.number().int().optional(), total_matches: z.number().int().optional(), length: z.number().int().optional(), sort_attribute: z.string().optional()}); export const clusterListIntentResponse = z.object({entities: z.array(clusterIntentResource).optional(), api_version: z.string(), metadata: clusterListMetadataOutput}); 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 a list of clusters * * POST /clusters/list */ export const createApiClustersList = async (args: CreateApiClustersListArgs, options: CreateApiClustersListOptions) => { const {baseUrl, fetch: fetchFn = fetch, basicAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (basicAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${basicAuth.username}:${basicAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/clusters/list${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(clusterListIntentResponse, await res.json()) };