func ensureContainersStarted(p DockerProvisioner, w io.Writer, relaunch bool, nodes ...cluster.Node) error { if w == nil { w = ioutil.Discard } confNames, err := scopedconfig.FindAllScopedConfigNames(nodeContainerCollection) if err != nil { return err } if len(nodes) == 0 { nodes, err = p.Cluster().UnfilteredNodes() if err != nil { return err } } errChan := make(chan error, len(nodes)) wg := sync.WaitGroup{} log.Debugf("[node containers] recreating %d containers", len(nodes)) recreateContainer := func(node *cluster.Node, confName string) { defer wg.Done() pool := node.Metadata["pool"] containerConfig, confErr := LoadNodeContainer(pool, confName) if confErr != nil { errChan <- confErr return } log.Debugf("[node containers] recreating container %q in %s [%s]", confName, node.Address, pool) fmt.Fprintf(w, "relaunching node container %q in the node %s [%s]\n", confName, node.Address, pool) confErr = containerConfig.create(node.Address, pool, p, relaunch) if confErr != nil { msg := fmt.Sprintf("[node containers] failed to create container in %s [%s]: %s", node.Address, pool, confErr) log.Error(msg) errChan <- errors.New(msg) } } for i := range nodes { wg.Add(1) go func(node *cluster.Node) { defer wg.Done() for j := range confNames { wg.Add(1) go recreateContainer(node, confNames[j]) } }(&nodes[i]) } wg.Wait() close(errChan) var allErrors []string for err = range errChan { allErrors = append(allErrors, err.Error()) } if len(allErrors) == 0 { return nil } return fmt.Errorf("multiple errors: %s", strings.Join(allErrors, ", ")) }
func AllNodeContainers() ([]NodeContainerConfigGroup, error) { confNames, err := scopedconfig.FindAllScopedConfigNames(nodeContainerCollection) if err != nil { return nil, err } result := make([]NodeContainerConfigGroup, len(confNames)) for i, n := range confNames { confMap, err := LoadNodeContainersForPools(n) if err != nil { return nil, err } result[i] = NodeContainerConfigGroup{Name: n, ConfigPools: confMap} } return result, nil }
func AllNodeContainersNames() ([]string, error) { return scopedconfig.FindAllScopedConfigNames(nodeContainerCollection) }