func ensureContainersStarted(p DockerProvisioner, w io.Writer, relaunch bool, names []string, nodes ...cluster.Node) error { if w == nil { w = ioutil.Discard } var err error if len(names) == 0 { names, err = nodecontainer.AllNodeContainersNames() 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)*len(names)) wg := sync.WaitGroup{} log.Debugf("[node containers] recreating %d containers", len(nodes)*len(names)) recreateContainer := func(node *cluster.Node, confName string) { defer wg.Done() pool := node.Metadata["pool"] containerConfig, confErr := nodecontainer.LoadNodeContainer(pool, confName) if confErr != nil { errChan <- confErr return } if !containerConfig.Valid() { 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 = create(containerConfig, node, pool, p, relaunch) if confErr != nil { confErr = errors.Wrapf(confErr, "[node containers] failed to create container in %s [%s]", node.Address, pool) errChan <- log.WrapError(confErr) } } for i := range nodes { wg.Add(1) go func(node *cluster.Node) { defer wg.Done() for j := range names { wg.Add(1) go recreateContainer(node, names[j]) } }(&nodes[i]) } wg.Wait() close(errChan) var allErrors []error for err = range errChan { allErrors = append(allErrors, err) } if len(allErrors) == 0 { return nil } return tsuruErrors.NewMultiError(allErrors...) }
func (p *swarmProvisioner) ensureNodeContainersCreated() error { names, err := nodecontainer.AllNodeContainersNames() if err != nil { return errors.WithStack(err) } for _, n := range names { poolMap, err := nodecontainer.LoadNodeContainersForPools(n) if err != nil { return errors.WithStack(err) } for pool := range poolMap { err = p.UpgradeNodeContainer(n, pool, ioutil.Discard) if err != nil { return err } } } return nil }