// createInstance creates a new instances, runs the bootstrap script and registers the instance // in DNS. func (vp *scalewayProvider) createInstance(log *logging.Logger, options providers.CreateInstanceOptions, dnsProvider providers.DnsProvider, existingInstances providers.ClusterInstanceList) (providers.ClusterInstance, error) { if options.RegionID != vp.Region { return providers.ClusterInstance{}, maskAny(fmt.Errorf("Cannot create server on region '%s' with provider configured for region '%s", options.RegionID, vp.Region)) } // Create a new machine ID machineID, err := util.GenUUID() if err != nil { return providers.ClusterInstance{}, maskAny(err) } log.Debugf("created machined-id: %s", machineID) // Create server instance, err := vp.createAndStartServer(options) if err != nil { return providers.ClusterInstance{}, maskAny(err) } // Update `cluster-members` file on existing instances. // This ensures that the firewall of the existing instances allows our new instance if len(existingInstances) > 0 { rebootAfter := false clusterMembers, err := existingInstances.AsClusterMemberList(log, nil) if err != nil { return providers.ClusterInstance{}, maskAny(err) } newMember := providers.ClusterMember{ ClusterID: options.ClusterInfo.ID, MachineID: machineID, ClusterIP: instance.ClusterIP, PrivateHostIP: instance.PrivateIP, EtcdProxy: options.EtcdProxy, } clusterMembers = append(clusterMembers, newMember) if err := existingInstances.UpdateClusterMembers(log, clusterMembers, rebootAfter, vp); err != nil { log.Warningf("Failed to update cluster members: %#v", err) } } // Bootstrap server if err := vp.bootstrapServer(instance, options, machineID); err != nil { return providers.ClusterInstance{}, maskAny(err) } // Wait for the server to be active server, err := vp.waitUntilServerActive(instance.ID, false) if err != nil { return providers.ClusterInstance{}, maskAny(err) } if options.RoleLoadBalancer { privateIpv4 := server.PrivateIP publicIpv4 := server.PublicAddress.IP publicIpv6 := "" if server.IPV6 != nil { publicIpv6 = server.IPV6.Address } if err := providers.RegisterInstance(vp.Logger, dnsProvider, options, server.Name, options.RegisterInstance, options.RoleLoadBalancer, options.RoleLoadBalancer, publicIpv4, publicIpv6, privateIpv4); err != nil { return providers.ClusterInstance{}, maskAny(err) } } vp.Logger.Infof("Server '%s' is ready", server.Name) return vp.clusterInstance(server, false), nil }