package client import ( "context" "encoding/json" "net/netip" "github.com/moby/moby/api/types/swarm" ) // SwarmInitOptions contains options for initializing a new swarm. type SwarmInitOptions struct { ListenAddr string AdvertiseAddr string DataPathAddr string DataPathPort uint32 ForceNewCluster bool Spec swarm.Spec AutoLockManagers bool Availability swarm.NodeAvailability DefaultAddrPool []netip.Prefix SubnetSize uint32 } // SwarmInitResult contains the result of a SwarmInit operation. type SwarmInitResult struct { NodeID string } // SwarmInit initializes the swarm. func (cli *Client) SwarmInit(ctx context.Context, options SwarmInitOptions) (SwarmInitResult, error) { req := swarm.InitRequest{ ListenAddr: options.ListenAddr, AdvertiseAddr: options.AdvertiseAddr, DataPathAddr: options.DataPathAddr, DataPathPort: options.DataPathPort, ForceNewCluster: options.ForceNewCluster, Spec: options.Spec, AutoLockManagers: options.AutoLockManagers, Availability: options.Availability, DefaultAddrPool: options.DefaultAddrPool, SubnetSize: options.SubnetSize, } resp, err := cli.post(ctx, "/swarm/init", nil, req, nil) defer ensureReaderClosed(resp) if err != nil { return SwarmInitResult{}, err } var nodeID string err = json.NewDecoder(resp.Body).Decode(&nodeID) return SwarmInitResult{NodeID: nodeID}, err }