import {z} from 'zod' export type GetApiBareMetalArgs = {limit?: (number | 'none') | undefined, offset?: number | undefined}; export type GetApiBareMetalOptions = {baseUrl: string, apiTokenAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const bareMetalSpecs = z.object({gpu_model: z.enum(["h100-sxm5-80gb", "v100-sxm2-16gb", "v100-sxm2-32gb", "v100-sxm3-32gb", "a100-sxm4-80gb", "a100-pcie-80gb", "a100-pcie-40gb", "a40-pcie-48gb", "a2-pcie-16gb", "l40s-pcie-48gb", "l40-pcie-48gb", "l4-pcie-24gb", "rtx6000ada-pcie-48gb", "rtx5000ada-pcie-32gb", "rtx4500ada-pcie-24gb", "rtx4000ada-pcie-20gb", "rtx4000sffada-pcie-20gb", "rtxa6000-pcie-48gb", "rtxa5500-pcie-24gb", "rtxa5000-pcie-24gb", "rtxa4500-pcie-20gb", "rtxa4000-pcie-16gb", "quadrortx8000-pcie-48gb", "quadrortx6000-pcie-48gb", "teslap4-pcie-8gb", "teslap100-sxm2-16gb", "teslap100-pcie-16gb", "teslam40-pcie-24gb", "geforcertx4090-pcie-24gb", "geforcertx4080super-pcie-16gb", "geforcertx4080-pcie-16gb", "geforcertx4070tisuper-pcie-16gb", "geforcertx3090ti-pcie-24gb", "geforcertx3090-pcie-24gb", "geforcertx3080ti-pcie-12gb", "geforcertx3080-pcie-10gb", "geforcertx3080lhr-pcie-10gb", "geforcertx3070ti-pcie-8gb", "geforcertx3070-pcie-8gb", "geforcertx3060ti-pcie-8gb", "geforcertx3060tilhr-pcie-8gb", "geforcertx3060lhr-pcie-12gb", "geforcertx3060-pcie-12gb", "geforcertx3050-pcie-8gb", "geforcertx2080ti-pcie-11gb", "geforcertx2080super-pcie-8gb", "geforcertx2060super-pcie-8gb", "geforcegtx1650-pcie-4gb", "geforcegtx1070-pcie-8gb", "geforcegtx1060-pcie-6gb", "geforcegtx1660super-pcie-6gb", "geforecegt710-pcie-1gb"]).optional(), gpu_count: z.number().int().gte(0).optional(), cpu_model: z.string().optional(), cpu_count: z.number().int().gte(0).optional(), ram_gb: z.number().int().gte(0).optional(), storage_gb: z.number().int().gte(0).optional()}); export const bareMetalNodeNetworking = z.object({public_ip: z.string(), private_ip: z.string()}); export const bareMetalRentalKubernetesRestore = z.object({in_progress: z.boolean().optional(), snapshot_captured: z.string().nullable().optional(), last_completed: z.string().nullable().optional(), last_status: z.enum(["Success", "Failed"]).nullable().optional()}); export const mk8sServiceLinks = z.object({grafana: z.string()}); export const bareMetalRentalKubernetesAddon = z.object({version: z.string(), authentication_config_b64: z.string().nullable(), restore: bareMetalRentalKubernetesRestore.nullable().optional(), service_links: mk8sServiceLinks.nullable().optional()}); export const bareMetalRentalSlurmAddon = z.object({version: z.string()}); export const bareMetalRentalAddons = z.object({kubernetes: bareMetalRentalKubernetesAddon.nullable().optional(), slurm: bareMetalRentalSlurmAddon.nullable().optional()}); export const knownBareMetalRentalDetails = z.object({id: z.string(), name: z.string(), creation_timestamp: z.string(), status: z.enum(["Running", "Terminated", "Failed"]), power_status: z.enum(["Running", "Stopped"]), node_count: z.number().int().gt(0), specs_per_node: bareMetalSpecs, rate_hourly: z.string(), network_type: z.enum(["infiniband", "ethernet"]), username: z.string(), node_networking: z.array(bareMetalNodeNetworking), sub_order: z.string().nullable(), storage_id: z.string().nullable(), storage_pv: z.string().nullable(), storage_pvc: z.string().nullable(), k8s_cluster_id: z.string().nullable(), kubeconfig: z.string().nullable(), tags: z.array(z.string()), addons: bareMetalRentalAddons}); export const pendingProgress = z.object({estimated_completed_at: z.string(), percent_complete: z.number().int()}); export const pendingBareMetalRentalDetails = z.object({id: z.string(), name: z.string(), creation_timestamp: z.string(), status: z.literal("Pending"), progress: pendingProgress, rate_hourly: z.string(), sub_order: z.string().nullable(), addons: bareMetalRentalAddons}); export const paginatedResultAnnotatedUnionKnownBareMetalRentalDetailsPendingBareMetalRentalDetailsDiscriminator = z.object({results: z.array(z.discriminatedUnion("status", [knownBareMetalRentalDetails, pendingBareMetalRentalDetails])), total_result_count: z.number().int().gte(0), has_previous: z.boolean(), has_next: z.boolean()}); 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 }; /** * List of owned, unterminated baremetal machines * * GET /bare-metal/ * * Also accepts auth: APIKeyHeader */ export const getApiBareMetal = async (args: GetApiBareMetalArgs, options: GetApiBareMetalOptions) => { const {baseUrl, fetch: fetchFn = fetch, apiTokenAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.limit != null) query.append("limit", String(args.limit)) if (args.offset != null) query.append("offset", String(args.offset)) if (apiTokenAuth !== undefined) headers.set('authorization', `Bearer ${apiTokenAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/bare-metal/${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(paginatedResultAnnotatedUnionKnownBareMetalRentalDetailsPendingBareMetalRentalDetailsDiscriminator, await res.json()) };