import {z} from 'zod' export type ClientAuth = {status: string, ca_chain?: string | undefined, name?: string | undefined}; export type PublicKey = {name: string, key: string}; export type SoftwareType = string; export type ClusterSoftware = {status?: string | undefined, version: string, software_type: SoftwareType}; export type EncryptionStatus = string; export type CertificationSigningInfo = {city?: string | undefined, state?: string | undefined, country_code?: string | undefined, common_name?: string | undefined, organization?: string | undefined, email_address?: string | undefined, common_name_suffix?: string | undefined}; export type VmReference = {kind: string, name?: string | undefined, uuid: unknown}; export type CitrixResourceLocationSpec = {id?: string | undefined, name?: string | undefined}; export type CitrixConnectorConfigDetailsSpec = {citrix_vm_reference_list?: Array | undefined, client_secret?: string | undefined, customer_id?: string | undefined, client_id?: string | undefined, resource_location?: CitrixResourceLocationSpec | undefined}; export type ExternalConfigurationsSpec = {citrix_connector_config?: CitrixConnectorConfigDetailsSpec | undefined}; export type ClusterOperationMode = string; export type ClusterConfigSpec = {gpu_driver_version?: string | undefined, client_auth?: ClientAuth | undefined, authorized_public_key_list?: Array | undefined, software_map?: {[key: string]: ClusterSoftware} | undefined, encryption_status?: EncryptionStatus | undefined, supported_information_verbosity?: string | undefined, certification_signing_info?: CertificationSigningInfo | undefined, redundancy_factor?: number | undefined, external_configurations?: ExternalConfigurationsSpec | undefined, domain_awareness_level?: string | undefined, enabled_feature_list?: Array | undefined, timezone?: string | undefined, operation_mode?: ClusterOperationMode | undefined}; export type HttpProxyWhitelist = {target: string, target_type: string}; export type Credentials = {username: string, password?: string | undefined}; export type Address = {ip?: string | undefined, ipv6?: string | undefined, port?: number | undefined, fqdn?: string | undefined}; export type ClusterNetworkEntity = {credentials?: Credentials | undefined, address: Address, proxy_type_list?: Array | undefined}; export type SmtpServer = {email_address: string, type?: string | undefined, server: ClusterNetworkEntity}; export type ClusterDomainServer = {nameserver?: string | undefined, name: string, domain_credentials?: Credentials | undefined}; export type VswitchConfig = {nic_teaming_policy: string, uplink_grouping: string}; export type ClusterNetwork = {http_proxy_whitelist?: Array | undefined, masquerading_port?: number | undefined, masquerading_ip?: string | undefined, external_ip?: string | undefined, http_proxy_list?: Array | undefined, smtp_server?: SmtpServer | undefined, ntp_server_ip_list?: Array | undefined, external_subnet?: string | undefined, external_data_services_ip?: string | undefined, domain_server?: ClusterDomainServer | undefined, name_server_ip_list?: Array | undefined, nfs_subnet_whitelist?: Array | undefined, internal_subnet?: string | undefined, default_vswitch_config?: VswitchConfig | undefined}; export type Cluster = {name?: string | undefined, resources?: ({config?: ClusterConfigSpec | undefined, network?: ClusterNetwork | undefined, runtime_status_list?: Array | undefined}) | undefined}; export type UserReference = {kind: string, name?: string | undefined, uuid: unknown}; export type ClusterMetadata = {last_update_time?: string | undefined, kind: string, uuid?: unknown | undefined, spec_version?: number | undefined, creation_time?: string | undefined, spec_hash?: string | undefined, should_force_translate?: boolean | undefined, owner_reference?: UserReference | undefined, categories?: {[key: string]: string} | undefined, name?: string | undefined}; export type ClusterIntentInput = {spec: Cluster, api_version?: string | undefined, metadata: ClusterMetadata}; export type UpdateApiClustersUuidArgs = {uuid: unknown, body: ClusterIntentInput}; export type UpdateApiClustersUuidOptions = {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 clusterIntentResponse = z.object({status: clusterDefStatus.optional(), spec: cluster.optional(), api_version: z.string(), metadata: clusterMetadata}); 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 }; /** * Update a cluster * * PUT /clusters/{uuid} */ export const updateApiClustersUuid = async (args: UpdateApiClustersUuidArgs, options: UpdateApiClustersUuidOptions) => { 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/${encodeURIComponent(String(args.uuid))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", 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(clusterIntentResponse, await res.json()) };