// Create an entire cluster func (vp *scalewayProvider) CreateCluster(log *logging.Logger, options providers.CreateClusterOptions, dnsProvider providers.DnsProvider) error { wg := sync.WaitGroup{} errors := make(chan error, options.InstanceCount) instanceDatas := make(chan instanceData, options.InstanceCount) for i := 1; i <= options.InstanceCount; i++ { wg.Add(1) go func(i int) { defer wg.Done() time.Sleep(time.Duration((i - 1)) * time.Second * 10) isCore := (i <= 3) isLB := (i <= 2) instanceOptions, err := options.NewCreateInstanceOptions(isCore, isLB, i) if err != nil { errors <- maskAny(err) return } instance, err := vp.createInstance(log, instanceOptions, dnsProvider, nil) if err != nil { errors <- maskAny(err) } else { instanceDatas <- instanceData{ CreateInstanceOptions: instanceOptions, ClusterInstance: instance, FleetMetadata: instanceOptions.CreateFleetMetadata(i), } } }(i) } wg.Wait() close(errors) close(instanceDatas) err := <-errors if err != nil { return maskAny(err) } instances := []instanceData{} instanceList := providers.ClusterInstanceList{} for data := range instanceDatas { instances = append(instances, data) instanceList = append(instanceList, data.ClusterInstance) } clusterMembers, err := instanceList.AsClusterMemberList(log, nil) if err != nil { return maskAny(err) } // Create tinc network config if instanceList.ReconfigureTincCluster(vp.Logger, instanceList); err != nil { return maskAny(err) } if err := vp.setupInstances(log, instances, clusterMembers); err != nil { return maskAny(err) } return nil }