3535 AccountAPI = "https://account.scaleway.com/"
3636 MetadataAPI = "http://169.254.42.42/"
3737 MarketplaceAPI = "https://api-marketplace.scaleway.com"
38- URLPublicDNS = ".pub.cloud.scaleway.com"
39- URLPrivateDNS = ".priv.cloud.scaleway.com"
38+ ComputeAPIPar1 = "https://api.scaleway.com/"
39+ ComputeAPIAms1 = "https://cp-ams1.scaleway.com"
40+
41+ URLPublicDNS = ".pub.cloud.scaleway.com"
42+ URLPrivateDNS = ".priv.cloud.scaleway.com"
4043)
4144
4245func init () {
@@ -887,7 +890,9 @@ func NewScalewayAPI(organization, token, userAgent, region string, options ...fu
887890 }
888891 switch region {
889892 case "par1" , "" :
890- s .computeAPI = "https://api.scaleway.com/"
893+ s .computeAPI = ComputeAPIPar1
894+ case "ams1" :
895+ s .computeAPI = ComputeAPIAms1
891896 default :
892897 return nil , fmt .Errorf ("%s isn't a valid region" , region )
893898 }
@@ -1101,6 +1106,30 @@ func (s *ScalewayAPI) handleHTTPError(goodStatusCode []int, resp *http.Response)
11011106 return body , nil
11021107}
11031108
1109+ func (s * ScalewayAPI ) fetchServers (api string , query url.Values , out chan <- ScalewayServers ) func () error {
1110+ return func () error {
1111+ resp , err := s .GetResponsePaginate (api , "servers" , query )
1112+ if resp != nil {
1113+ defer resp .Body .Close ()
1114+ }
1115+ if err != nil {
1116+ return err
1117+ }
1118+
1119+ body , err := s .handleHTTPError ([]int {http .StatusOK }, resp )
1120+ if err != nil {
1121+ return err
1122+ }
1123+ var servers ScalewayServers
1124+
1125+ if err = json .Unmarshal (body , & servers ); err != nil {
1126+ return err
1127+ }
1128+ out <- servers
1129+ return nil
1130+ }
1131+ }
1132+
11041133// GetServers gets the list of servers from the ScalewayAPI
11051134func (s * ScalewayAPI ) GetServers (all bool , limit int ) (* []ScalewayServer , error ) {
11061135 query := url.Values {}
@@ -1115,32 +1144,34 @@ func (s *ScalewayAPI) GetServers(all bool, limit int) (*[]ScalewayServer, error)
11151144 if all && limit == 0 {
11161145 s .Cache .ClearServers ()
11171146 }
1118- resp , err := s .GetResponsePaginate (s .computeAPI , "servers" , query )
1119- if resp != nil {
1120- defer resp .Body .Close ()
1121- }
1122- if err != nil {
1123- return nil , err
1147+ var (
1148+ g errgroup.Group
1149+ apis = []string {
1150+ ComputeAPIPar1 ,
1151+ ComputeAPIAms1 ,
1152+ }
1153+ )
1154+
1155+ serverChan := make (chan ScalewayServers , 2 )
1156+ for _ , api := range apis {
1157+ g .Go (s .fetchServers (api , query , serverChan ))
11241158 }
11251159
1126- body , err := s .handleHTTPError ([]int {http .StatusOK }, resp )
1127- if err != nil {
1160+ if err := g .Wait (); err != nil {
11281161 return nil , err
11291162 }
1163+ close (serverChan )
11301164 var servers ScalewayServers
1131- if err = json .Unmarshal (body , & servers ); err != nil {
1132- return nil , err
1165+
1166+ for server := range serverChan {
1167+ servers .Servers = append (servers .Servers , server .Servers ... )
11331168 }
1169+
11341170 for i , server := range servers .Servers {
1135- // FIXME arch, owner, title
11361171 servers .Servers [i ].DNSPublic = server .Identifier + URLPublicDNS
11371172 servers .Servers [i ].DNSPrivate = server .Identifier + URLPrivateDNS
11381173 s .Cache .InsertServer (server .Identifier , server .Location .ZoneID , server .Arch , server .Organization , server .Name )
11391174 }
1140- // FIXME: when API limit is ready, remove the following code
1141- if limit > 0 && limit < len (servers .Servers ) {
1142- servers .Servers = servers .Servers [0 :limit ]
1143- }
11441175 return & servers .Servers , nil
11451176}
11461177
@@ -2177,7 +2208,7 @@ func (s *ScalewayAPI) GetImageID(needle, arch string) (*ScalewayImageIdentifier,
21772208 }, nil
21782209 }
21792210 if len (images ) == 0 {
2180- return nil , fmt .Errorf ("No such image: %s" , needle )
2211+ return nil , fmt .Errorf ("No such image (zone %s, arch %s) : %s" , s . Region , arch , needle )
21812212 }
21822213 return nil , showResolverResults (needle , images )
21832214}
@@ -2841,6 +2872,8 @@ func (s *ScalewayAPI) ResolveTTYUrl() string {
28412872 switch s .Region {
28422873 case "par1" , "" :
28432874 return "https://tty.scaleway.com/v2/"
2875+ case "ams1" :
2876+ return "https://tty-ams1.scaleway.com"
28442877 }
28452878 return ""
28462879}
0 commit comments