// AddOneNode is a helper to add a single node. Called repeatedly. func AddOneNode(driver drivers.Driver) error { nodes, err := docker.ListCockroachNodes() if err != nil { return util.Errorf("failed to get list of existing cockroach nodes: %v", err) } if len(nodes) == 0 { return util.Errorf("no existing cockroach nodes detected, does the cluster exist?") } largestIndex, err := docker.GetLargestNodeIndex(nodes) if err != nil { return util.Errorf("problem parsing existing node list: %v", err) } nodeName := docker.MakeNodeName(largestIndex + 1) // Create node. err = docker.CreateMachine(driver, nodeName) if err != nil { return util.Errorf("could not create machine %s: %v", nodeName, err) } // Lookup node info. nodeConfig, err := driver.GetNodeConfig(nodeName) if err != nil { return util.Errorf("could not get node config for %s: %v", nodeName, err) } // Do "start node" logic. err = driver.StartNode(nodeName, nodeConfig) if err != nil { return util.Errorf("could not run StartNode steps for %s: %v", nodeName, err) } // Start the cockroach node. err = docker.RunDockerStart(driver, nodeName, nodeConfig) if err != nil { return util.Errorf("could not initialize first cockroach node %s: %v", nodeName, err) } return nil }