import {z} from 'zod' export type GetApiContainersIdJsonArgs = {id: string, size?: boolean | undefined}; export type GetApiContainersIdJsonOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const healthcheckResult = z.object({Start: z.string().optional(), End: z.string().optional(), ExitCode: z.number().int().optional(), Output: z.string().optional()}).nullable(); export const health = z.object({Status: z.enum(["none", "starting", "healthy", "unhealthy"]).optional(), FailingStreak: z.number().int().optional(), Log: z.array(healthcheckResult).optional()}).nullable(); export const containerState = z.object({Status: z.enum(["created", "running", "paused", "restarting", "removing", "exited", "dead"]).optional(), Running: z.boolean().optional(), Paused: z.boolean().optional(), Restarting: z.boolean().optional(), OOMKilled: z.boolean().optional(), Dead: z.boolean().optional(), Pid: z.number().int().optional(), ExitCode: z.number().int().optional(), Error: z.string().optional(), StartedAt: z.string().optional(), FinishedAt: z.string().optional(), Health: health.optional()}).nullable(); export const oCIPlatform = z.object({architecture: z.string().optional(), os: z.string().optional(), "os.version": z.string().optional(), "os.features": z.array(z.string()).optional(), variant: z.string().optional()}).nullable(); export const oCIDescriptor = z.object({mediaType: z.string().optional(), digest: z.string().optional(), size: z.number().int().optional(), urls: z.array(z.string()).nullable().optional(), annotations: z.record(z.string(), z.string()).nullable().optional(), data: z.string().nullable().optional(), platform: oCIPlatform.optional(), artifactType: z.string().nullable().optional()}); export const throttleDevice = z.object({Path: z.string().optional(), Rate: z.number().int().gte(0).optional()}); export const deviceMapping = z.object({PathOnHost: z.string().optional(), PathInContainer: z.string().optional(), CgroupPermissions: z.string().optional()}); export const deviceRequest = z.object({Driver: z.string().optional(), Count: z.number().int().optional(), DeviceIDs: z.array(z.string()).optional(), Capabilities: z.array(z.array(z.string())).optional(), Options: z.record(z.string(), z.string()).optional()}); export const portBinding = z.object({HostIp: z.string().optional(), HostPort: z.string().optional()}); export const portMap = z.record(z.string(), z.array(portBinding).nullable()); export const restartPolicy = z.object({Name: z.enum(["", "no", "always", "unless-stopped", "on-failure"]).optional(), MaximumRetryCount: z.number().int().optional()}); export const mount = z.object({Target: z.string().optional(), Source: z.string().optional(), Type: z.enum(["bind", "volume", "image", "tmpfs", "npipe", "cluster"]).optional(), ReadOnly: z.boolean().optional(), Consistency: z.string().optional(), BindOptions: z.object({Propagation: z.enum(["private", "rprivate", "shared", "rshared", "slave", "rslave"]).optional(), NonRecursive: z.boolean().optional(), CreateMountpoint: z.boolean().optional(), ReadOnlyNonRecursive: z.boolean().optional(), ReadOnlyForceRecursive: z.boolean().optional()}).optional(), VolumeOptions: z.object({NoCopy: z.boolean().optional(), Labels: z.record(z.string(), z.string()).optional(), DriverConfig: z.object({Name: z.string().optional(), Options: z.record(z.string(), z.string()).optional()}).optional(), Subpath: z.string().optional()}).optional(), ImageOptions: z.object({Subpath: z.string().optional()}).optional(), TmpfsOptions: z.object({SizeBytes: z.number().int().optional(), Mode: z.number().int().optional(), Options: z.array(z.array(z.string())).optional()}).optional()}); export const hostConfig = z.object({CpuShares: z.number().int().optional(), Memory: z.number().int().optional(), CgroupParent: z.string().optional(), BlkioWeight: z.number().int().gte(0).lte(1000).optional(), BlkioWeightDevice: z.array(z.object({Path: z.string().optional(), Weight: z.number().int().gte(0).optional()})).optional(), BlkioDeviceReadBps: z.array(throttleDevice).optional(), BlkioDeviceWriteBps: z.array(throttleDevice).optional(), BlkioDeviceReadIOps: z.array(throttleDevice).optional(), BlkioDeviceWriteIOps: z.array(throttleDevice).optional(), CpuPeriod: z.number().int().optional(), CpuQuota: z.number().int().optional(), CpuRealtimePeriod: z.number().int().optional(), CpuRealtimeRuntime: z.number().int().optional(), CpusetCpus: z.string().optional(), CpusetMems: z.string().optional(), Devices: z.array(deviceMapping).optional(), DeviceCgroupRules: z.array(z.string()).optional(), DeviceRequests: z.array(deviceRequest).optional(), KernelMemoryTCP: z.number().int().optional(), MemoryReservation: z.number().int().optional(), MemorySwap: z.number().int().optional(), MemorySwappiness: z.number().int().gte(0).lte(100).optional(), NanoCpus: z.number().int().optional(), OomKillDisable: z.boolean().optional(), Init: z.boolean().nullable().optional(), PidsLimit: z.number().int().nullable().optional(), Ulimits: z.array(z.object({Name: z.string().optional(), Soft: z.number().int().optional(), Hard: z.number().int().optional()})).optional(), CpuCount: z.number().int().optional(), CpuPercent: z.number().int().optional(), IOMaximumIOps: z.number().int().optional(), IOMaximumBandwidth: z.number().int().optional(), Binds: z.array(z.string()).optional(), ContainerIDFile: z.string().optional(), LogConfig: z.object({Type: z.enum(["local", "json-file", "syslog", "journald", "gelf", "fluentd", "awslogs", "splunk", "etwlogs", "none"]).optional(), Config: z.record(z.string(), z.string()).optional()}).optional(), NetworkMode: z.string().optional(), PortBindings: portMap.optional(), RestartPolicy: restartPolicy.optional(), AutoRemove: z.boolean().optional(), VolumeDriver: z.string().optional(), VolumesFrom: z.array(z.string()).optional(), Mounts: z.array(mount).optional(), ConsoleSize: z.array(z.number().int().gte(0)).nullable().optional(), Annotations: z.record(z.string(), z.string()).optional(), CapAdd: z.array(z.string()).optional(), CapDrop: z.array(z.string()).optional(), CgroupnsMode: z.enum(["private", "host"]).optional(), Dns: z.array(z.string()).optional(), DnsOptions: z.array(z.string()).optional(), DnsSearch: z.array(z.string()).optional(), ExtraHosts: z.array(z.string()).optional(), GroupAdd: z.array(z.string()).optional(), IpcMode: z.string().optional(), Cgroup: z.string().optional(), Links: z.array(z.string()).optional(), OomScoreAdj: z.number().int().optional(), PidMode: z.string().optional(), Privileged: z.boolean().optional(), PublishAllPorts: z.boolean().optional(), ReadonlyRootfs: z.boolean().optional(), SecurityOpt: z.array(z.string()).optional(), StorageOpt: z.record(z.string(), z.string()).optional(), Tmpfs: z.record(z.string(), z.string()).optional(), UTSMode: z.string().optional(), UsernsMode: z.string().optional(), ShmSize: z.number().int().gte(0).optional(), Sysctls: z.record(z.string(), z.string()).nullable().optional(), Runtime: z.string().nullable().optional(), Isolation: z.enum(["default", "process", "hyperv", ""]).optional(), MaskedPaths: z.array(z.string()).optional(), ReadonlyPaths: z.array(z.string()).optional()}); export const driverData = z.object({Name: z.string(), Data: z.record(z.string(), z.string())}); export const mountPoint = z.object({Type: z.enum(["bind", "volume", "image", "tmpfs", "npipe", "cluster"]).optional(), Name: z.string().optional(), Source: z.string().optional(), Destination: z.string().optional(), Driver: z.string().optional(), Mode: z.string().optional(), RW: z.boolean().optional(), Propagation: z.string().optional()}); export const healthConfig = z.object({Test: z.array(z.string()).optional(), Interval: z.number().int().optional(), Timeout: z.number().int().optional(), Retries: z.number().int().optional(), StartPeriod: z.number().int().optional(), StartInterval: z.number().int().optional()}); export const containerConfig = z.object({Hostname: z.string().optional(), Domainname: z.string().optional(), User: z.string().optional(), AttachStdin: z.boolean().optional(), AttachStdout: z.boolean().optional(), AttachStderr: z.boolean().optional(), ExposedPorts: z.record(z.string(), z.object({})).nullable().optional(), Tty: z.boolean().optional(), OpenStdin: z.boolean().optional(), StdinOnce: z.boolean().optional(), Env: z.array(z.string()).optional(), Cmd: z.array(z.string()).optional(), Healthcheck: healthConfig.optional(), ArgsEscaped: z.boolean().nullable().optional(), Image: z.string().optional(), Volumes: z.record(z.string(), z.object({})).optional(), WorkingDir: z.string().optional(), Entrypoint: z.array(z.string()).optional(), NetworkDisabled: z.boolean().nullable().optional(), MacAddress: z.string().nullable().optional(), OnBuild: z.array(z.string()).nullable().optional(), Labels: z.record(z.string(), z.string()).optional(), StopSignal: z.string().nullable().optional(), StopTimeout: z.number().int().nullable().optional(), Shell: z.array(z.string()).nullable().optional()}); export const address = z.object({Addr: z.string().optional(), PrefixLen: z.number().int().optional()}); export const endpointIPAMConfig = z.object({IPv4Address: z.string().optional(), IPv6Address: z.string().optional(), LinkLocalIPs: z.array(z.string()).optional()}).nullable(); export const endpointSettings = z.object({IPAMConfig: endpointIPAMConfig.optional(), Links: z.array(z.string()).optional(), MacAddress: z.string().optional(), Aliases: z.array(z.string()).optional(), DriverOpts: z.record(z.string(), z.string()).nullable().optional(), GwPriority: z.number().int().optional(), NetworkID: z.string().optional(), EndpointID: z.string().optional(), Gateway: z.string().optional(), IPAddress: z.string().optional(), IPPrefixLen: z.number().int().optional(), IPv6Gateway: z.string().optional(), GlobalIPv6Address: z.string().optional(), GlobalIPv6PrefixLen: z.number().int().optional(), DNSNames: z.array(z.string()).optional()}); export const networkSettings = z.object({Bridge: z.string().optional(), SandboxID: z.string().optional(), HairpinMode: z.boolean().optional(), LinkLocalIPv6Address: z.string().optional(), LinkLocalIPv6PrefixLen: z.number().int().optional(), Ports: portMap.optional(), SandboxKey: z.string().optional(), SecondaryIPAddresses: z.array(address).nullable().optional(), SecondaryIPv6Addresses: z.array(address).nullable().optional(), EndpointID: z.string().optional(), Gateway: z.string().optional(), GlobalIPv6Address: z.string().optional(), GlobalIPv6PrefixLen: z.number().int().optional(), IPAddress: z.string().optional(), IPPrefixLen: z.number().int().optional(), IPv6Gateway: z.string().optional(), MacAddress: z.string().optional(), Networks: z.record(z.string(), endpointSettings).optional()}); export const containerInspectResponse = z.object({Id: z.string().min(64).max(64).optional(), Created: z.string().nullable().optional(), Path: z.string().optional(), Args: z.array(z.string()).optional(), State: containerState.optional(), Image: z.string().optional(), ResolvConfPath: z.string().optional(), HostnamePath: z.string().optional(), HostsPath: z.string().optional(), LogPath: z.string().nullable().optional(), Name: z.string().optional(), RestartCount: z.number().int().optional(), Driver: z.string().optional(), Platform: z.string().optional(), ImageManifestDescriptor: oCIDescriptor.optional(), MountLabel: z.string().optional(), ProcessLabel: z.string().optional(), AppArmorProfile: z.string().optional(), ExecIDs: z.array(z.string()).nullable().optional(), HostConfig: hostConfig.optional(), GraphDriver: driverData.optional(), SizeRw: z.number().int().nullable().optional(), SizeRootFs: z.number().int().nullable().optional(), Mounts: z.array(mountPoint).optional(), Config: containerConfig.optional(), NetworkSettings: networkSettings.optional()}); 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 }; /** * Inspect a container * * GET /containers/{id}/json */ export const getApiContainersIdJson = async (args: GetApiContainersIdJsonArgs, options: GetApiContainersIdJsonOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.size != null) query.append("size", String(args.size)) const url = `${baseUrl.replace(/\/+$/, '')}/containers/${encodeURIComponent(String(args.id))}/json${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(containerInspectResponse, await res.json()) };