{"record":{"id":"7f0ab27ffb00cba6","repo":"docker/cli","slug":"invalid-availability-q-only-active-pause-and-dr","errorCode":null,"errorMessage":"invalid availability %q, only active, pause and drain are supported","messagePattern":"invalid availability %q, only active, pause and drain are supported","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/command/swarm/init.go","lineNumber":95,"sourceCode":"\t\t}\n\t\tip := p.IP.To4()\n\t\tif ip == nil {\n\t\t\tip = p.IP.To16()\n\t\t}\n\t\taddr, ok := netip.AddrFromSlice(ip)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"invalid IP address: %s\", p.IP)\n\t\t}\n\t\tones, _ := p.Mask.Size()\n\t\tdefaultAddrPool = append(defaultAddrPool, netip.PrefixFrom(addr, ones))\n\t}\n\tvar availability swarm.NodeAvailability\n\tif flags.Changed(flagAvailability) {\n\t\tswitch a := swarm.NodeAvailability(strings.ToLower(opts.availability)); a {\n\t\tcase swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain:\n\t\t\tavailability = a\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid availability %q, only active, pause and drain are supported\", opts.availability)\n\t\t}\n\t}\n\n\tres, err := apiClient.SwarmInit(ctx, client.SwarmInitOptions{\n\t\tListenAddr:       opts.listenAddr.String(),\n\t\tAdvertiseAddr:    opts.advertiseAddr,\n\t\tDataPathAddr:     opts.dataPathAddr,\n\t\tDataPathPort:     opts.dataPathPort,\n\t\tDefaultAddrPool:  defaultAddrPool,\n\t\tForceNewCluster:  opts.forceNewCluster,\n\t\tSpec:             opts.swarmOptions.ToSpec(flags),\n\t\tAutoLockManagers: opts.swarmOptions.autolock,\n\t\tAvailability:     availability,\n\t\tSubnetSize:       opts.DefaultAddrPoolMaskLength,\n\t})\n\tif err != nil {\n\t\tif strings.Contains(err.Error(), \"could not choose an IP address to advertise\") || strings.Contains(err.Error(), \"could not find the system's IP address\") {\n\t\t\treturn fmt.Errorf(\"%w - specify one with --advertise-addr\", err)","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/cli/command/swarm/init.go#L77-L113","documentation":"Returned by 'docker swarm init' when --availability is explicitly set but its value is not one of active, pause, drain (case-insensitive). The switch at init.go:91-96 only accepts swarm.NodeAvailabilityActive/Pause/Drain.","triggerScenarios":"Running 'docker swarm init --availability <other>' where <other> is e.g. 'drained', 'running', 'enabled', or a typo. Only triggered when flags.Changed(flagAvailability) is true.","commonSituations":"Misremembered value ('drained' vs 'drain', 'paused' vs 'pause'); copy-pasted a Kubernetes-style value; trailing whitespace.","solutions":["Use exactly one of: active, pause, drain (case-insensitive).","If unsure, omit --availability to default to active.","Double-check spelling and strip any trailing spaces/quotes from the value."],"exampleFix":"# before\ndocker swarm init --availability drained\n\n# after\ndocker swarm init --availability drain","handlingStrategy":"validation","validationCode":"// Validate availability before calling init\nvalidAvail := map[string]bool{\"active\": true, \"pause\": true, \"drain\": true}\nif opts.availability != \"\" && !validAvail[strings.ToLower(opts.availability)] {\n    return fmt.Errorf(\"invalid availability %q\", opts.availability)\n}","typeGuard":"func isValidAvailability(s string) bool {\n\tswitch strings.ToLower(s) {\n\tcase \"active\", \"pause\", \"drain\":\n\t\treturn true\n\t}\n\treturn false\n}","tryCatchPattern":null,"preventionTips":["Use only active, pause, drain (case-insensitive).","Omit --availability to accept the active default.","Centralize the allowed set in a shared constant in scripts."],"tags":["swarm","init","availability","validation"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}