// NodeSpecToGRPC converts a NodeSpec to a grpc NodeSpec. func NodeSpecToGRPC(s types.NodeSpec) (swarmapi.NodeSpec, error) { spec := swarmapi.NodeSpec{ Annotations: swarmapi.Annotations{ Name: s.Name, Labels: s.Labels, }, } if role, ok := swarmapi.NodeRole_value[strings.ToUpper(string(s.Role))]; ok { spec.Role = swarmapi.NodeRole(role) } else { return swarmapi.NodeSpec{}, fmt.Errorf("invalid Role: %q", s.Role) } if membership, ok := swarmapi.NodeSpec_Membership_value[strings.ToUpper(string(s.Membership))]; ok { spec.Membership = swarmapi.NodeSpec_Membership(membership) } else { return swarmapi.NodeSpec{}, fmt.Errorf("invalid Membership: %q", s.Membership) } if availability, ok := swarmapi.NodeSpec_Availability_value[strings.ToUpper(string(s.Availability))]; ok { spec.Availability = swarmapi.NodeSpec_Availability(availability) } else { return swarmapi.NodeSpec{}, fmt.Errorf("invalid Availability: %q", s.Availability) } return spec, nil }
func (n *nodeRunner) start(conf nodeStartConfig) error { var control string if runtime.GOOS == "windows" { control = `\\.\pipe\` + controlSocket } else { control = filepath.Join(n.cluster.runtimeRoot, controlSocket) } swarmnodeConfig := swarmnode.Config{ Hostname: n.cluster.config.Name, ForceNewCluster: conf.forceNewCluster, ListenControlAPI: control, ListenRemoteAPI: conf.ListenAddr, AdvertiseRemoteAPI: conf.AdvertiseAddr, JoinAddr: conf.joinAddr, StateDir: n.cluster.root, JoinToken: conf.joinToken, Executor: container.NewExecutor(n.cluster.config.Backend), HeartbeatTick: 1, ElectionTick: 3, UnlockKey: conf.lockKey, AutoLockManagers: conf.autolock, } if conf.availability != "" { avail, ok := swarmapi.NodeSpec_Availability_value[strings.ToUpper(string(conf.availability))] if !ok { return fmt.Errorf("invalid Availability: %q", conf.availability) } swarmnodeConfig.Availability = swarmapi.NodeSpec_Availability(avail) } node, err := swarmnode.New(&swarmnodeConfig) if err != nil { return err } if err := node.Start(context.Background()); err != nil { return err } n.done = make(chan struct{}) n.ready = make(chan struct{}) n.swarmNode = node n.config = conf savePersistentState(n.cluster.root, conf) ctx, cancel := context.WithCancel(context.Background()) go func() { n.handleNodeExit(node) cancel() }() go n.handleReadyEvent(ctx, node, n.ready) go n.handleControlSocketChange(ctx, node) return nil }