import {z} from 'zod' export type PluginPrivilege = {Name?: string | undefined, Description?: string | undefined, Value?: Array | undefined}; export type Mount = {Target?: string | undefined, Source?: string | undefined, Type?: ('bind' | 'volume' | 'image' | 'tmpfs' | 'npipe' | 'cluster') | undefined, ReadOnly?: boolean | undefined, Consistency?: string | undefined, BindOptions?: ({Propagation?: ('private' | 'rprivate' | 'shared' | 'rshared' | 'slave' | 'rslave') | undefined, NonRecursive?: boolean | undefined, CreateMountpoint?: boolean | undefined, ReadOnlyNonRecursive?: boolean | undefined, ReadOnlyForceRecursive?: boolean | undefined}) | undefined, VolumeOptions?: ({NoCopy?: boolean | undefined, Labels?: {[key: string]: string} | undefined, DriverConfig?: ({Name?: string | undefined, Options?: {[key: string]: string} | undefined}) | undefined, Subpath?: string | undefined}) | undefined, ImageOptions?: ({Subpath?: string | undefined}) | undefined, TmpfsOptions?: ({SizeBytes?: number | undefined, Mode?: number | undefined, Options?: Array> | undefined}) | undefined}; export type HealthConfig = {Test?: Array | undefined, Interval?: number | undefined, Timeout?: number | undefined, Retries?: number | undefined, StartPeriod?: number | undefined, StartInterval?: number | undefined}; export type Limit = {NanoCPUs?: number | undefined, MemoryBytes?: number | undefined, Pids?: number | undefined}; export type GenericResources = Array<{NamedResourceSpec?: ({Kind?: string | undefined, Value?: string | undefined}) | undefined, DiscreteResourceSpec?: ({Kind?: string | undefined, Value?: number | undefined}) | undefined}>; export type ResourceObject = {NanoCPUs?: number | undefined, MemoryBytes?: number | undefined, GenericResources?: GenericResources | undefined}; export type Platform = {Architecture?: string | undefined, OS?: string | undefined}; export type NetworkAttachmentConfig = {Target?: string | undefined, Aliases?: Array | undefined, DriverOpts?: {[key: string]: string} | undefined}; export type TaskSpec = {PluginSpec?: ({Name?: string | undefined, Remote?: string | undefined, Disabled?: boolean | undefined, PluginPrivilege?: Array | undefined}) | undefined, ContainerSpec?: ({Image?: string | undefined, Labels?: {[key: string]: string} | undefined, Command?: Array | undefined, Args?: Array | undefined, Hostname?: string | undefined, Env?: Array | undefined, Dir?: string | undefined, User?: string | undefined, Groups?: Array | undefined, Privileges?: ({CredentialSpec?: ({Config?: string | undefined, File?: string | undefined, Registry?: string | undefined}) | undefined, SELinuxContext?: ({Disable?: boolean | undefined, User?: string | undefined, Role?: string | undefined, Type?: string | undefined, Level?: string | undefined}) | undefined, Seccomp?: ({Mode?: ('default' | 'unconfined' | 'custom') | undefined, Profile?: string | undefined}) | undefined, AppArmor?: ({Mode?: ('default' | 'disabled') | undefined}) | undefined, NoNewPrivileges?: boolean | undefined}) | undefined, TTY?: boolean | undefined, OpenStdin?: boolean | undefined, ReadOnly?: boolean | undefined, Mounts?: Array | undefined, StopSignal?: string | undefined, StopGracePeriod?: number | undefined, HealthCheck?: HealthConfig | undefined, Hosts?: Array | undefined, DNSConfig?: ({Nameservers?: Array | undefined, Search?: Array | undefined, Options?: Array | undefined}) | undefined, Secrets?: (Array<{File?: ({Name?: string | undefined, UID?: string | undefined, GID?: string | undefined, Mode?: number | undefined}) | undefined, SecretID?: string | undefined, SecretName?: string | undefined}>) | undefined, OomScoreAdj?: number | undefined, Configs?: (Array<{File?: ({Name?: string | undefined, UID?: string | undefined, GID?: string | undefined, Mode?: number | undefined}) | undefined, Runtime?: Record | undefined, ConfigID?: string | undefined, ConfigName?: string | undefined}>) | undefined, Isolation?: ('default' | 'process' | 'hyperv' | '') | undefined, Init?: (boolean | null) | undefined, Sysctls?: {[key: string]: string} | undefined, CapabilityAdd?: Array | undefined, CapabilityDrop?: Array | undefined, Ulimits?: (Array<{Name?: string | undefined, Soft?: number | undefined, Hard?: number | undefined}>) | undefined}) | undefined, NetworkAttachmentSpec?: ({ContainerID?: string | undefined}) | undefined, Resources?: ({Limits?: Limit | undefined, Reservations?: ResourceObject | undefined}) | undefined, RestartPolicy?: ({Condition?: ('none' | 'on-failure' | 'any') | undefined, Delay?: number | undefined, MaxAttempts?: number | undefined, Window?: number | undefined}) | undefined, Placement?: ({Constraints?: Array | undefined, Preferences?: (Array<{Spread?: ({SpreadDescriptor?: string | undefined}) | undefined}>) | undefined, MaxReplicas?: number | undefined, Platforms?: Array | undefined}) | undefined, ForceUpdate?: number | undefined, Runtime?: string | undefined, Networks?: Array | undefined, LogDriver?: ({Name?: string | undefined, Options?: {[key: string]: string} | undefined}) | undefined}; export type EndpointPortConfig = {Name?: string | undefined, Protocol?: ('tcp' | 'udp' | 'sctp') | undefined, TargetPort?: number | undefined, PublishedPort?: number | undefined, PublishMode?: ('ingress' | 'host') | undefined}; export type EndpointSpec = {Mode?: ('vip' | 'dnsrr') | undefined, Ports?: Array | undefined}; export type CreateApiServicesCreateArgs = {'X-Registry-Auth'?: string | undefined, body: {Name?: string | undefined, Labels?: {[key: string]: string} | undefined, TaskTemplate?: TaskSpec | undefined, Mode?: ({Replicated?: ({Replicas?: number | undefined}) | undefined, Global?: Record | undefined, ReplicatedJob?: ({MaxConcurrent?: number | undefined, TotalCompletions?: number | undefined}) | undefined, GlobalJob?: Record | undefined}) | undefined, UpdateConfig?: ({Parallelism?: number | undefined, Delay?: number | undefined, FailureAction?: ('continue' | 'pause' | 'rollback') | undefined, Monitor?: number | undefined, MaxFailureRatio?: number | undefined, Order?: ('stop-first' | 'start-first') | undefined}) | undefined, RollbackConfig?: ({Parallelism?: number | undefined, Delay?: number | undefined, FailureAction?: ('continue' | 'pause') | undefined, Monitor?: number | undefined, MaxFailureRatio?: number | undefined, Order?: ('stop-first' | 'start-first') | undefined}) | undefined, Networks?: Array | undefined, EndpointSpec?: EndpointSpec | undefined}}; export type CreateApiServicesCreateOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const serviceCreateResponse = z.object({ID: z.string().optional(), Warnings: z.array(z.string()).nullable().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 }; /** * Create a service * * POST /services/create */ export const createApiServicesCreate = async (args: CreateApiServicesCreateArgs, options: CreateApiServicesCreateOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['X-Registry-Auth'] != null) headers.set("X-Registry-Auth", String(args['X-Registry-Auth'])) const url = `${baseUrl.replace(/\/+$/, '')}/services/create${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", 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(serviceCreateResponse, await res.json()) };