import {z} from 'zod' export type GetApiApiV1SeedSeedNameDcArgs = {seed_name: string}; export type GetApiApiV1SeedSeedNameDcOptions = {baseUrl: string, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const datacenterMeta = z.object({name: z.string().optional()}); export const datacenterSpecAlibaba = z.object({region: z.string().optional()}); export const datacenterSpecAnexia = z.object({location_id: z.string().optional()}); export const imageList = z.record(z.string(), z.string()); export const datacenterSpecAWS = z.object({images: imageList.optional(), region: z.string().optional()}); export const datacenterSpecAzure = z.object({location: z.string().optional()}); export const datacenterSpecBringYourOwn = z.object({}); export const datacenterSpecDigitalocean = z.object({region: z.string().optional()}); export const datacenterSpecFake = z.object({fake_property: z.string().optional()}); export const datacenterSpecGCP = z.object({region: z.string().optional(), regional: z.boolean().optional(), zone_suffixes: z.array(z.string()).optional()}); export const datacenterSpecHetzner = z.object({datacenter: z.string().optional(), location: z.string().optional(), network: z.string().optional()}); export const podDNSConfigOption = z.object({name: z.string().optional(), value: z.string().optional()}); export const podDNSConfig = z.object({nameservers: z.array(z.string()).optional(), options: z.array(podDNSConfigOption).optional(), searches: z.array(z.string()).optional()}); export const datacenterSpecKubevirt = z.object({dns_config: podDNSConfig.optional(), dns_policy: z.string().optional()}); export const proxyValue = z.string(); export const nodeSettings = z.object({http_proxy: proxyValue.optional(), hyperkube_image: z.string().optional(), insecure_registries: z.array(z.string()).optional(), no_proxy: proxyValue.optional(), pause_image: z.string().optional(), registry_mirrors: z.array(z.string()).optional()}); export const openstackNodeSizeRequirements = z.object({minimum_memory: z.number().int().optional(), minimum_vcpus: z.number().int().optional()}); export const datacenterSpecOpenstack = z.object({auth_url: z.string().optional(), availability_zone: z.string().optional(), dns_servers: z.array(z.string()).optional(), enabled_flavors: z.array(z.string()).optional(), enforce_floating_ip: z.boolean().optional(), ignore_volume_az: z.boolean().optional(), images: imageList.optional(), manage_security_groups: z.boolean().optional(), node_size_requirements: openstackNodeSizeRequirements.optional(), region: z.string().optional(), trust_device_path: z.boolean().optional(), use_octavia: z.boolean().optional()}); export const datacenterSpecPacket = z.object({facilities: z.array(z.string()).optional()}); export const vSphereCredentials = z.object({password: z.string().optional(), username: z.string().optional()}); export const datacenterSpecVSphere = z.object({allow_insecure: z.boolean().optional(), cluster: z.string().optional(), datacenter: z.string().optional(), datastore: z.string().optional(), endpoint: z.string().optional(), infra_management_user: vSphereCredentials.optional(), root_path: z.string().optional(), storage_policy: z.string().optional(), templates: imageList.optional()}); export const datacenterSpec = z.object({alibaba: datacenterSpecAlibaba.optional(), anexia: datacenterSpecAnexia.optional(), aws: datacenterSpecAWS.optional(), azure: datacenterSpecAzure.optional(), bringyourown: datacenterSpecBringYourOwn.optional(), country: z.string().optional(), digitalocean: datacenterSpecDigitalocean.optional(), enforceAuditLogging: z.boolean().optional(), enforcePodSecurityPolicy: z.boolean().optional(), fake: datacenterSpecFake.optional(), gcp: datacenterSpecGCP.optional(), hetzner: datacenterSpecHetzner.optional(), kubevirt: datacenterSpecKubevirt.optional(), location: z.string().optional(), node: nodeSettings.optional(), openstack: datacenterSpecOpenstack.optional(), packet: datacenterSpecPacket.optional(), provider: z.string().optional(), requiredEmailDomain: z.string().optional(), requiredEmailDomains: z.array(z.string()).optional(), seed: z.string().optional(), vsphere: datacenterSpecVSphere.optional()}); export const datacenter = z.object({metadata: datacenterMeta.optional(), spec: datacenterSpec.optional()}); export const getApiApiV1SeedSeedNameDcResponse = z.array(datacenter); 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 }; /** * Returns all datacenters for the specified seed. * * GET /api/v1/seed/{seed_name}/dc */ export const getApiApiV1SeedSeedNameDc = async (args: GetApiApiV1SeedSeedNameDcArgs, options: GetApiApiV1SeedSeedNameDcOptions) => { const {baseUrl, fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (apiKey !== undefined) headers.set("Authorization", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/seed/${encodeURIComponent(String(args.seed_name))}/dc${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(getApiApiV1SeedSeedNameDcResponse, await res.json()) };