package builders import ( "time" "github.com/docker/docker/api/types/swarm" ) // Node creates a node with default values. // Any number of node function builder can be pass to augment it. // // n1 := Node() // Returns a default node // n2 := Node(NodeID("foo"), NodeHostname("bar"), Leader()) func Node(builders ...func(*swarm.Node)) *swarm.Node { t1 := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) node := &swarm.Node{ ID: "nodeID", Meta: swarm.Meta{ CreatedAt: t1, }, Description: swarm.NodeDescription{ Hostname: "defaultNodeHostname", Platform: swarm.Platform{ Architecture: "x86_64", OS: "linux", }, Resources: swarm.Resources{ NanoCPUs: 4, MemoryBytes: 20 * 1024 * 1024, }, Engine: swarm.EngineDescription{ EngineVersion: "1.13.0", Labels: map[string]string{ "engine": "label", }, Plugins: []swarm.PluginDescription{ { Type: "Volume", Name: "local", }, { Type: "Network", Name: "bridge", }, { Type: "Network", Name: "overlay", }, }, }, }, Status: swarm.NodeStatus{ State: swarm.NodeStateReady, Addr: "127.0.0.1", }, Spec: swarm.NodeSpec{ Annotations: swarm.Annotations{ Name: "defaultNodeName", }, Role: swarm.NodeRoleWorker, Availability: swarm.NodeAvailabilityActive, }, } for _, builder := range builders { builder(node) } return node } // NodeID sets the node id func NodeID(id string) func(*swarm.Node) { return func(node *swarm.Node) { node.ID = id } } // NodeLabels sets the node labels func NodeLabels(labels map[string]string) func(*swarm.Node) { return func(node *swarm.Node) { node.Spec.Labels = labels } } // Hostname sets the node hostname func Hostname(hostname string) func(*swarm.Node) { return func(node *swarm.Node) { node.Description.Hostname = hostname } } // Leader sets the current node as a leader func Leader() func(*swarm.ManagerStatus) { return func(managerStatus *swarm.ManagerStatus) { managerStatus.Leader = true } } // Manager set the current node as a manager func Manager(managerStatusBuilders ...func(*swarm.ManagerStatus)) func(*swarm.Node) { return func(node *swarm.Node) { node.Spec.Role = swarm.NodeRoleManager node.ManagerStatus = ManagerStatus(managerStatusBuilders...) } } // ManagerStatus create a ManageStatus with default values. func ManagerStatus(managerStatusBuilders ...func(*swarm.ManagerStatus)) *swarm.ManagerStatus { managerStatus := &swarm.ManagerStatus{ Reachability: swarm.ReachabilityReachable, Addr: "127.0.0.1", } for _, builder := range managerStatusBuilders { builder(managerStatus) } return managerStatus }