func (opts *nodeOptions) ToNodeSpec() (swarm.NodeSpec, error) { var spec swarm.NodeSpec switch swarm.NodeRole(strings.ToLower(opts.role)) { case swarm.NodeRoleWorker: spec.Role = swarm.NodeRoleWorker case swarm.NodeRoleManager: spec.Role = swarm.NodeRoleManager case "": default: return swarm.NodeSpec{}, fmt.Errorf("invalid role %q, only worker and manager are supported", opts.role) } switch swarm.NodeMembership(strings.ToLower(opts.membership)) { case swarm.NodeMembershipAccepted: spec.Membership = swarm.NodeMembershipAccepted case "": default: return swarm.NodeSpec{}, fmt.Errorf("invalid membership %q, only accepted is supported", opts.membership) } switch swarm.NodeAvailability(strings.ToLower(opts.availability)) { case swarm.NodeAvailabilityActive: spec.Availability = swarm.NodeAvailabilityActive case swarm.NodeAvailabilityPause: spec.Availability = swarm.NodeAvailabilityPause case swarm.NodeAvailabilityDrain: spec.Availability = swarm.NodeAvailabilityDrain case "": default: return swarm.NodeSpec{}, fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability) } return spec, nil }
func (opts *nodeOptions) ToNodeSpec() (swarm.NodeSpec, error) { var spec swarm.NodeSpec spec.Annotations.Name = opts.annotations.name spec.Annotations.Labels = runconfigopts.ConvertKVStringsToMap(opts.annotations.labels.GetAll()) switch swarm.NodeRole(strings.ToLower(opts.role)) { case swarm.NodeRoleWorker: spec.Role = swarm.NodeRoleWorker case swarm.NodeRoleManager: spec.Role = swarm.NodeRoleManager case "": default: return swarm.NodeSpec{}, fmt.Errorf("invalid role %q, only worker and manager are supported", opts.role) } switch swarm.NodeAvailability(strings.ToLower(opts.availability)) { case swarm.NodeAvailabilityActive: spec.Availability = swarm.NodeAvailabilityActive case swarm.NodeAvailabilityPause: spec.Availability = swarm.NodeAvailabilityPause case swarm.NodeAvailabilityDrain: spec.Availability = swarm.NodeAvailabilityDrain case "": default: return swarm.NodeSpec{}, fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability) } return spec, nil }
// NodeFromGRPC converts a grpc Node to a Node. func NodeFromGRPC(n swarmapi.Node) types.Node { node := types.Node{ ID: n.ID, Spec: types.NodeSpec{ Role: types.NodeRole(strings.ToLower(n.Spec.Role.String())), Membership: types.NodeMembership(strings.ToLower(n.Spec.Membership.String())), Availability: types.NodeAvailability(strings.ToLower(n.Spec.Availability.String())), }, Status: types.NodeStatus{ State: types.NodeState(strings.ToLower(n.Status.State.String())), Message: n.Status.Message, }, } // Meta node.Version.Index = n.Meta.Version.Index node.CreatedAt, _ = ptypes.Timestamp(n.Meta.CreatedAt) node.UpdatedAt, _ = ptypes.Timestamp(n.Meta.UpdatedAt) //Annotations node.Spec.Name = n.Spec.Annotations.Name node.Spec.Labels = n.Spec.Annotations.Labels //Description if n.Description != nil { node.Description.Hostname = n.Description.Hostname if n.Description.Platform != nil { node.Description.Platform.Architecture = n.Description.Platform.Architecture node.Description.Platform.OS = n.Description.Platform.OS } if n.Description.Resources != nil { node.Description.Resources.NanoCPUs = n.Description.Resources.NanoCPUs node.Description.Resources.MemoryBytes = n.Description.Resources.MemoryBytes } if n.Description.Engine != nil { node.Description.Engine.EngineVersion = n.Description.Engine.EngineVersion node.Description.Engine.Labels = n.Description.Engine.Labels for _, plugin := range n.Description.Engine.Plugins { node.Description.Engine.Plugins = append(node.Description.Engine.Plugins, types.PluginDescription{Type: plugin.Type, Name: plugin.Name}) } } } //Manager if n.ManagerStatus != nil { node.ManagerStatus = &types.ManagerStatus{ Leader: n.ManagerStatus.Raft.Status.Leader, Reachability: types.Reachability(strings.ToLower(n.ManagerStatus.Raft.Status.Reachability.String())), Addr: n.ManagerStatus.Raft.Addr, } } return node }
// SwarmFromGRPC converts a grpc Cluster to a Swarm. func SwarmFromGRPC(c swarmapi.Cluster) types.Swarm { swarm := types.Swarm{ ID: c.ID, Spec: types.Spec{ Orchestration: types.OrchestrationConfig{ TaskHistoryRetentionLimit: c.Spec.Orchestration.TaskHistoryRetentionLimit, }, Raft: types.RaftConfig{ SnapshotInterval: c.Spec.Raft.SnapshotInterval, KeepOldSnapshots: c.Spec.Raft.KeepOldSnapshots, LogEntriesForSlowFollowers: c.Spec.Raft.LogEntriesForSlowFollowers, HeartbeatTick: c.Spec.Raft.HeartbeatTick, ElectionTick: c.Spec.Raft.ElectionTick, }, }, } heartbeatPeriod, _ := ptypes.Duration(c.Spec.Dispatcher.HeartbeatPeriod) swarm.Spec.Dispatcher.HeartbeatPeriod = uint64(heartbeatPeriod) swarm.Spec.CAConfig.NodeCertExpiry, _ = ptypes.Duration(c.Spec.CAConfig.NodeCertExpiry) for _, ca := range c.Spec.CAConfig.ExternalCAs { swarm.Spec.CAConfig.ExternalCAs = append(swarm.Spec.CAConfig.ExternalCAs, &types.ExternalCA{ Protocol: types.ExternalCAProtocol(strings.ToLower(ca.Protocol.String())), URL: ca.URL, Options: ca.Options, }) } // Meta swarm.Version.Index = c.Meta.Version.Index swarm.CreatedAt, _ = ptypes.Timestamp(c.Meta.CreatedAt) swarm.UpdatedAt, _ = ptypes.Timestamp(c.Meta.UpdatedAt) // Annotations swarm.Spec.Name = c.Spec.Annotations.Name swarm.Spec.Labels = c.Spec.Annotations.Labels for _, policy := range c.Spec.AcceptancePolicy.Policies { p := types.Policy{ Role: types.NodeRole(strings.ToLower(policy.Role.String())), Autoaccept: policy.Autoaccept, } if policy.Secret != nil { secret := string(policy.Secret.Data) p.Secret = &secret } swarm.Spec.AcceptancePolicy.Policies = append(swarm.Spec.AcceptancePolicy.Policies, p) } return swarm }
func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) { return func(node *swarm.Node) { mergeString := func(flag string, field *string) { if flags.Changed(flag) { *field, _ = flags.GetString(flag) } } mergeRole := func(flag string, field *swarm.NodeRole) { if flags.Changed(flag) { str, _ := flags.GetString(flag) *field = swarm.NodeRole(str) } } mergeMembership := func(flag string, field *swarm.NodeMembership) { if flags.Changed(flag) { str, _ := flags.GetString(flag) *field = swarm.NodeMembership(str) } } mergeAvailability := func(flag string, field *swarm.NodeAvailability) { if flags.Changed(flag) { str, _ := flags.GetString(flag) *field = swarm.NodeAvailability(str) } } mergeLabels := func(flag string, field *map[string]string) { if flags.Changed(flag) { values, _ := flags.GetStringSlice(flag) for key, value := range runconfigopts.ConvertKVStringsToMap(values) { (*field)[key] = value } } } spec := &node.Spec mergeString("name", &spec.Name) // TODO: setting labels is not working mergeLabels("label", &spec.Labels) mergeRole("role", &spec.Role) mergeMembership("membership", &spec.Membership) mergeAvailability("availability", &spec.Availability) } }
func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) error { return func(node *swarm.Node) error { spec := &node.Spec if flags.Changed(flagRole) { str, err := flags.GetString(flagRole) if err != nil { return err } spec.Role = swarm.NodeRole(str) } if flags.Changed(flagMembership) { str, err := flags.GetString(flagMembership) if err != nil { return err } spec.Membership = swarm.NodeMembership(str) } if flags.Changed(flagAvailability) { str, err := flags.GetString(flagAvailability) if err != nil { return err } spec.Availability = swarm.NodeAvailability(str) } if spec.Annotations.Labels == nil { spec.Annotations.Labels = make(map[string]string) } if flags.Changed(flagLabelAdd) { labels := flags.Lookup(flagLabelAdd).Value.(*opts.ListOpts).GetAll() for k, v := range runconfigopts.ConvertKVStringsToMap(labels) { spec.Annotations.Labels[k] = v } } if flags.Changed(flagLabelRemove) { keys := flags.Lookup(flagLabelRemove).Value.(*opts.ListOpts).GetAll() for _, k := range keys { // if a key doesn't exist, fail the command explicitly if _, exists := spec.Annotations.Labels[k]; !exists { return fmt.Errorf("key %s doesn't exist in node's labels", k) } delete(spec.Annotations.Labels, k) } } return nil } }
func mergeNodeUpdate(flags *pflag.FlagSet) func(*swarm.Node) { return func(node *swarm.Node) { spec := &node.Spec if flags.Changed(flagRole) { str, _ := flags.GetString(flagRole) spec.Role = swarm.NodeRole(str) } if flags.Changed(flagMembership) { str, _ := flags.GetString(flagMembership) spec.Membership = swarm.NodeMembership(str) } if flags.Changed(flagAvailability) { str, _ := flags.GetString(flagAvailability) spec.Availability = swarm.NodeAvailability(str) } } }