import {z} from 'zod' export type GetApiEdgesArgs = {s3_edge_enabled?: (boolean | null) | undefined, file_iq_enabled?: (boolean | null) | undefined, synced?: (boolean | null) | undefined, detailed?: boolean | undefined}; export type GetApiEdgesOptions = {baseUrl?: string | undefined, HTTPBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const edgeType = z.enum(["Edge", "Strider"]); export const edgeServicesDto = z.object({s3_edge: z.boolean().nullable().optional(), file_iq: z.boolean().nullable().optional()}); export const nfsStackType = z.enum(["nfs-server", "nfs-ganesha"]); export const simpleEdgeDto = z.object({id: z.string(), description: z.string(), type: edgeType.optional(), services: edgeServicesDto.optional(), serial: z.string(), instance_id: z.string().nullable().optional(), synced: z.boolean().optional(), is_reachable: z.boolean().optional(), last_seen_at: z.string().nullable().optional(), build: z.string(), ds_type: z.string().nullable().optional(), product: z.string().nullable().optional(), allow_ntfs_multiprotocol: z.boolean().nullable().optional(), nfs_stack_type: nfsStackType.nullable().optional(), max_volumes: z.number().int().nullable().optional(), owned_volumes: z.number().int().nullable().optional(), ad_unix_extensions: z.boolean().nullable().optional()}); export const edgesDto = z.object({items: z.array(simpleEdgeDto).optional()}); export const edgeVolumes = z.object({owned: z.number().int().nullable().optional(), remotely_connected: z.number().int().nullable().optional()}); export const edgeBuild = z.object({current: z.string(), available: z.string().nullable().optional(), platform: z.string().nullable().optional()}); export const edgeMachine = z.object({cpu: z.string().nullable().optional(), ram: z.string().nullable().optional(), cache_disk: z.string().nullable().optional(), os_disk: z.string().nullable().optional(), fiq_disk: z.string().nullable().optional(), cow_disk: z.string().nullable().optional(), cpu_cores: z.number().int().nullable().optional(), vm_instance_type: z.string().nullable().optional(), vm_region: z.string().nullable().optional()}); export const edgeAutomaticUpdates = z.object({enabled: z.boolean().nullable().optional(), schedule: z.string().nullable().optional()}); export const edgeStriderSystem = z.object({vm_management: z.string().nullable().optional(), scale_factor: z.number().int().nullable().optional(), fault_tolerance: z.string().nullable().optional()}); export const edgeAccessPoints = z.object({web_access_enabled: z.boolean().nullable().optional(), web_access_share_count: z.number().int().nullable().optional(), smb_share_count: z.number().int().nullable().optional(), smb_client_count: z.number().int().nullable().optional(), smb_lock_count: z.number().int().nullable().optional(), nfs_export_count: z.number().int().nullable().optional(), ftp_directory_count: z.number().int().nullable().optional()}); export const edgeSystem = z.object({automatic_updates: edgeAutomaticUpdates.nullable().optional(), remote_support: z.string().nullable().optional(), time_configuration: z.string().nullable().optional(), cache_eviction_settings: z.string().nullable().optional(), ip_source: z.string().nullable().optional(), default_gateway: z.string().nullable().optional(), dns_servers: z.string().nullable().optional(), search_domains: z.string().nullable().optional(), snmp_enabled: z.boolean().nullable().optional(), qos_rule_count: z.number().int().nullable().optional(), syslog_enabled: z.boolean().nullable().optional(), disk_encryption: z.string().nullable().optional(), encryption_key_count: z.number().int().nullable().optional(), escrow_passphrase_enabled: z.boolean().nullable().optional(), ssl_certificate_name: z.string().nullable().optional(), ssl_certificate_count: z.number().int().nullable().optional(), strider: edgeStriderSystem.nullable().optional(), access_points: edgeAccessPoints.nullable().optional()}); export const taskState = z.enum(["in_progress", "completed", "failed"]); export const taskStateSummaryDto = z.object({id: z.string(), created_at: z.string(), resource: z.string(), resource_id: z.union([z.string(), z.string()]).nullable().optional(), action: z.string(), executor_id: z.string().nullable().optional(), state: taskState}); export const edgeDto = z.object({id: z.string(), description: z.string(), type: edgeType.optional(), services: edgeServicesDto.optional(), serial: z.string(), instance_id: z.string().nullable().optional(), synced: z.boolean().optional(), is_reachable: z.boolean().optional(), last_seen_at: z.string().nullable().optional(), owned_volumes: z.number().int().nullable().optional(), remotely_connected_volumes: z.number().int().nullable().optional(), volumes: edgeVolumes, build: edgeBuild, machine: edgeMachine, ipaddress: z.string().nullable().optional(), hostname: z.string().nullable().optional(), uptime_seconds: z.number().int().nullable().optional(), health_status: z.record(z.string(), z.unknown()).nullable().optional(), location: z.string().nullable().optional(), last_config_backup_date: z.string().nullable().optional(), reported_account_max_now_storage: z.number().int().nullable().optional(), reported_account_current_now_storage: z.number().int().nullable().optional(), ds_type: z.string().nullable().optional(), system: edgeSystem.nullable().optional(), tasks: z.array(taskStateSummaryDto).nullable().optional()}); export const edgeDetailsDto = z.object({items: z.array(edgeDto).optional()}); export const getApiEdgesResponse = z.union([edgesDto, edgeDetailsDto, edgesDto, edgeDetailsDto]); 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 Edges * * GET /edges */ export const getApiEdges = async (args: GetApiEdgesArgs, options?: GetApiEdgesOptions) => { const {baseUrl = "https://am1.portal.api.nasuni.com", fetch: fetchFn = fetch, HTTPBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.s3_edge_enabled != null) query.append("s3_edge_enabled", String(args.s3_edge_enabled)) if (args.file_iq_enabled != null) query.append("file_iq_enabled", String(args.file_iq_enabled)) if (args.synced != null) query.append("synced", String(args.synced)) if (args.detailed != null) query.append("detailed", String(args.detailed)) if (HTTPBearer !== undefined) headers.set('authorization', `Bearer ${HTTPBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/edges${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(getApiEdgesResponse, await res.json()) };