diff --git a/go.mod b/go.mod index 8ffb33fc0d..6bd2523550 100644 --- a/go.mod +++ b/go.mod @@ -83,7 +83,7 @@ require ( k8s.io/client-go v0.19.3 k8s.io/cluster-bootstrap v0.19.3 moul.io/http2curl/v2 v2.3.0 - yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221110030606-998da89d7f4d + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221111025915-ff307c592d7d yunion.io/x/executor v0.0.0-20211018100936-39a2cd966656 yunion.io/x/jsonutils v1.0.1-0.20220819091305-3bab322ab4fd yunion.io/x/log v1.0.0 diff --git a/go.sum b/go.sum index f1500f8a3c..cc3cb4f9ba 100644 --- a/go.sum +++ b/go.sum @@ -1162,8 +1162,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221110030606-998da89d7f4d h1:4Q3DFKvkGmuYH9AcNWVSy690SIBwkszFAwwwLr13Tlk= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221110030606-998da89d7f4d/go.mod h1:drc/WDD65r6wI1tSejk19xcl9QwmzZlgJGXN7a9o2KQ= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221111025915-ff307c592d7d h1:4+xSygGpc2iehPhHjz3WRYnPt0ZrQIAlDTk44iVjJuk= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221111025915-ff307c592d7d/go.mod h1:drc/WDD65r6wI1tSejk19xcl9QwmzZlgJGXN7a9o2KQ= yunion.io/x/executor v0.0.0-20211018100936-39a2cd966656 h1:0zlZD5uhZoIHgLVAWCz2aHaYk2ZrNsACCYD7R6EIBII= yunion.io/x/executor v0.0.0-20211018100936-39a2cd966656/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws= yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634= diff --git a/vendor/modules.txt b/vendor/modules.txt index 900a42e58f..0eaa3e32cd 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1428,7 +1428,7 @@ sigs.k8s.io/structured-merge-diff/v4/value # sigs.k8s.io/yaml v1.2.0 ## explicit; go 1.12 sigs.k8s.io/yaml -# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221110030606-998da89d7f4d +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20221111025915-ff307c592d7d ## explicit; go 1.18 yunion.io/x/cloudmux/pkg/apis yunion.io/x/cloudmux/pkg/apis/billing diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/huawei.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/huawei.go index e47f1ac57d..27fdb2e4c3 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/huawei.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/hcso/huawei.go @@ -18,6 +18,7 @@ import ( "fmt" "net/http" "strings" + "sync" "time" "yunion.io/x/log" @@ -46,7 +47,7 @@ const ( HUAWEI_API_VERSION = "" ) -var HUAWEI_REGION_CACHES = map[string]userRegionsCache{} +var HUAWEI_REGION_CACHES sync.Map type userRegionsCache struct { UserId string @@ -202,17 +203,19 @@ func (self *SHuaweiClient) fetchRegions() error { return errors.Wrap(err, "GetUserId") } - if regionsCache, ok := HUAWEI_REGION_CACHES[userId]; !ok || regionsCache.ExpireAt.Sub(time.Now()).Seconds() > 0 { + if regionsCache, ok := HUAWEI_REGION_CACHES.Load(userId); !ok || regionsCache.(*userRegionsCache).ExpireAt.Sub(time.Now()).Seconds() > 0 { regions := make([]SRegion, 0) err := doListAll(huawei.Regions.List, nil, ®ions) if err != nil { return errors.Wrap(err, "Regions.List") } - HUAWEI_REGION_CACHES[userId] = userRegionsCache{ExpireAt: time.Now().Add(24 * time.Hour), UserId: userId, Regions: regions} + HUAWEI_REGION_CACHES.Store(userId, &userRegionsCache{ExpireAt: time.Now().Add(24 * time.Hour), UserId: userId, Regions: regions}) } - self.regions = HUAWEI_REGION_CACHES[userId].Regions + if regionsCache, ok := HUAWEI_REGION_CACHES.Load(userId); ok { + self.regions = regionsCache.(*userRegionsCache).Regions + } } filtedRegions := make([]SRegion, 0) diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/monitor.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/monitor.go index fd279e5a34..ab29f46d69 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/monitor.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/monitor.go @@ -23,12 +23,14 @@ import ( func (self *SRemoteFileClient) GetMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { switch opts.ResourceType { case cloudprovider.METRIC_RESOURCE_TYPE_SERVER: - return self.GetEcsMetrics(opts) + return self.GetRemoteMetrics(opts) + case cloudprovider.METRIC_RESOURCE_TYPE_RDS: + return self.GetRemoteMetrics(opts) default: return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "%s", opts.ResourceType) } } -func (self *SRemoteFileClient) GetEcsMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { +func (self *SRemoteFileClient) GetRemoteMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { return self.getMetrics(opts.ResourceType, opts.MetricType) } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/remotefile.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/remotefile.go index cf08f0e24c..dc22f1a7ce 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/remotefile.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/remotefile/remotefile.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "net/http" + "sync" "yunion.io/x/jsonutils" @@ -55,7 +56,7 @@ type RemoteFileClientConfig struct { lbs []SLoadbalancer misc []SMisc secgroups []SSecurityGroup - metrics map[string]interface{} + metrics []map[cloudprovider.TMetricType]map[string]interface{} debug bool } @@ -81,6 +82,7 @@ func (cfg *RemoteFileClientConfig) Debug(debug bool) *RemoteFileClientConfig { type SRemoteFileClient struct { *RemoteFileClientConfig + lock sync.Mutex } func NewRemoteFileClient(cfg *RemoteFileClientConfig) (*SRemoteFileClient, error) { @@ -286,22 +288,29 @@ func (self *SRemoteFileClient) GetStorages() ([]SStorage, error) { func (self *SRemoteFileClient) getMetrics(resourceType cloudprovider.TResourceType, metricType cloudprovider.TMetricType) ([]cloudprovider.MetricValues, error) { ret := []cloudprovider.MetricValues{} - res := fmt.Sprintf("%s/%s", resourceType, metricType) if self.metrics == nil { - self.metrics = map[string]interface{}{} + self.lock.Lock() + defer self.lock.Unlock() + self.metrics = []map[cloudprovider.TMetricType]map[string]interface{}{} resp, err := self.get("metrics") if err != nil { return nil, err } - err = resp.Unmarshal(self.metrics) + err = resp.Unmarshal(&self.metrics) if err != nil { return nil, err } } - values, ok := self.metrics[res] - if ok { - jsonutils.Update(&ret, values) + + for _, metric := range self.metrics { + values, ok := metric[metricType] + if ok { + mid := cloudprovider.MetricValues{} + jsonutils.Update(&mid, values) + ret = append(ret, mid) + } } + return ret, nil }