diff --git a/pkg/util/aliyun/aliyun.go b/pkg/util/aliyun/aliyun.go index 5a82934320..629356bd45 100644 --- a/pkg/util/aliyun/aliyun.go +++ b/pkg/util/aliyun/aliyun.go @@ -103,7 +103,7 @@ func (self *SAliyunClient) businessRequest(apiName string, params map[string]str } func (self *SAliyunClient) fetchRegions() error { - body, err := self.jsonRequest("DescribeRegions", nil) + body, err := self.jsonRequest("DescribeRegions", map[string]string{"AcceptLanguage": "zh-CN"}) if err != nil { log.Errorf("fetchRegions fail %s", err) return err diff --git a/pkg/util/aliyun/region.go b/pkg/util/aliyun/region.go index c080b4375b..8064ca3829 100644 --- a/pkg/util/aliyun/region.go +++ b/pkg/util/aliyun/region.go @@ -1,8 +1,11 @@ package aliyun import ( + "context" "fmt" + "net/http" "strings" + "time" "github.com/aliyun/alibaba-cloud-sdk-go/sdk" "github.com/aliyun/aliyun-oss-go-sdk/oss" @@ -13,8 +16,11 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" + "yunion.io/x/onecloud/pkg/util/httputils" ) +const LOCATION_KEY = "AIzaSyDzERKiHXz3c3W0GFbzcINuJEk-gM47wjg" + type SRegion struct { client *SAliyunClient ecsClient *sdk.Client @@ -30,6 +36,10 @@ type SRegion struct { storageCache *SStoragecache instanceTypes []SInstanceType + + latitude float64 + longitude float64 + fetchLocation bool } func (self *SRegion) GetClient() *SAliyunClient { @@ -103,12 +113,55 @@ func (self *SRegion) GetProvider() string { return CLOUD_PROVIDER_ALIYUN } +func (self *SRegion) fetchLatitudeLongtitude() { + city := self.LocalName + for key, value := range map[string]string{"(": ")", "(": ")"} { + if strings.Index(self.LocalName, key) > 0 { + _city := strings.Split(self.LocalName, key)[1] + city = strings.Replace(_city, value, "", -1) + } + } + if _, res, err := httputils.JSONRequest( + httputils.GetDefaultClient(), + context.Background(), + "GET", "https://maps.google.cn/maps/api/geocode/json?address="+city+"&key="+LOCATION_KEY, + http.Header{}, nil, false); err != nil { + log.Errorf("fetchLatitudeLongtitude %s error: %v", city, err) + } else if status, err := res.GetString("status"); err != nil || status != "OK" { + log.Errorf("fetchLatitudeLongtitude %s error: %v res: %s", city, err, res.PrettyString()) + } else if results, err := res.GetArray("results"); err != nil { + log.Errorf("fetchLatitudeLongtitude %s error: %v res: %s", city, err, res.PrettyString()) + } else if len(results) < 1 { + log.Errorf("fetchLatitudeLongtitude %s error: %v res: %s", city, err, res.PrettyString()) + } else { + self.latitude, _ = results[0].Float("geometry", "location", "lat") + self.longitude, _ = results[0].Float("geometry", "location", "lng") + self.fetchLocation = true + return + } + time.Sleep(time.Second * 2) +} + func (self *SRegion) GetLatitude() float32 { - return 0.0 + for i := 0; i < 3; i++ { + if !self.fetchLocation { + self.fetchLatitudeLongtitude() + } else { + break + } + } + return float32(self.latitude) } func (self *SRegion) GetLongitude() float32 { - return 0.0 + for i := 0; i < 3; i++ { + if !self.fetchLocation { + self.fetchLatitudeLongtitude() + } else { + break + } + } + return float32(self.longitude) } func (self *SRegion) GetStatus() string {