From 4fcec841a4a8a3a3e1f94961037c635f13e11c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Fri, 17 Nov 2023 10:08:41 +0800 Subject: [PATCH] fix(region): vendor update (#18711) --- go.mod | 2 +- go.sum | 4 +- vendor/modules.txt | 2 +- .../x/cloudmux/pkg/cloudprovider/dnszone.go | 2 + .../multicloud/aliyun/dns_domain_record.go | 4 + .../x/cloudmux/pkg/multicloud/aws/aws.go | 34 +++ .../pkg/multicloud/aws/aws_request.go | 29 +- .../x/cloudmux/pkg/multicloud/aws/cdn.go | 269 +++++++++++++++++ .../pkg/multicloud/aws/provider/provider.go | 8 + .../x/cloudmux/pkg/multicloud/aws/region.go | 3 + .../x/cloudmux/pkg/multicloud/huawei/cdn.go | 273 ++++++++++++++++++ .../cloudmux/pkg/multicloud/huawei/huawei.go | 27 +- .../multicloud/huawei/provider/provider.go | 8 + .../pkg/multicloud/qcloud/loadbalancer.go | 5 +- 14 files changed, 659 insertions(+), 11 deletions(-) create mode 100644 vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/cdn.go create mode 100644 vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/cdn.go diff --git a/go.mod b/go.mod index af0b51a87e..2cb8c08077 100644 --- a/go.mod +++ b/go.mod @@ -86,7 +86,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.20231116081347-9207615214fe + yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231117015828-a46d7098bf71 yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 yunion.io/x/jsonutils v1.0.1-0.20230613121553-0f3b41e2ef19 yunion.io/x/log v1.0.1-0.20230411060016-feb3f46ab361 diff --git a/go.sum b/go.sum index d10f1a1f20..34b1c1e2da 100644 --- a/go.sum +++ b/go.sum @@ -1192,8 +1192,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.20231116081347-9207615214fe h1:xFiw/QyM1Mui9uzuPDCV5vCondoTtdh2+ityoN4jKYQ= -yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231116081347-9207615214fe/go.mod h1:aj1gR9PPb6eqqKOwvANe26CoZFY8ydmXy0fuvgKYXH0= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231117015828-a46d7098bf71 h1:8avCx3dnQChgEDHve7jJJPgN5+o0QJ+rhGiPS08A+UE= +yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231117015828-a46d7098bf71/go.mod h1:aj1gR9PPb6eqqKOwvANe26CoZFY8ydmXy0fuvgKYXH0= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32 h1:v7POYkQwo1XzOxBoIoRVr/k0V9Y5JyjpshlIFa9raug= yunion.io/x/executor v0.0.0-20230705125604-c5ac3141db32/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 41c690a7d2..c9c29c685d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1458,7 +1458,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.20231116081347-9207615214fe +# yunion.io/x/cloudmux v0.3.10-0-alpha.1.0.20231117015828-a46d7098bf71 ## 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/cloudprovider/dnszone.go b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/dnszone.go index fb9b101090..0197c7d8e4 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/dnszone.go +++ b/vendor/yunion.io/x/cloudmux/pkg/cloudprovider/dnszone.go @@ -117,6 +117,8 @@ var ( DnsPolicyValueOversea = TDnsPolicyValue("oversea") DnsPolicyValueMainland = TDnsPolicyValue("mainland") + DnsPolicyValueNAmerica = TDnsPolicyValue("os_namerica") + DnsPolicyValueEuro = TDnsPolicyValue("os_euro") DnsPolicyValueBaidu = TDnsPolicyValue("baidu") DnsPolicyValueGoogle = TDnsPolicyValue("google") diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/dns_domain_record.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/dns_domain_record.go index 68233ac648..b0f05a9a61 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/dns_domain_record.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aliyun/dns_domain_record.go @@ -126,6 +126,10 @@ func GetRecordLineLineType(policyinfo cloudprovider.TDnsPolicyValue) string { return "drpeng" case cloudprovider.DnsPolicyValueBtvn: return "btvn" + case cloudprovider.DnsPolicyValueNAmerica: + return "os_namerica" + case cloudprovider.DnsPolicyValueEuro: + return "os_euro" case cloudprovider.DnsPolicyValueBaidu: return "baidu" diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws.go index 766d297da1..b32b93c4da 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws.go @@ -174,6 +174,10 @@ func (self *SAwsClient) ec2Request(regionId string, apiName string, params map[s return self.request(regionId, EC2_SERVICE_NAME, EC2_SERVICE_ID, "2016-11-15", apiName, params, retval, assumeRole) } +func (self *SAwsClient) cfRequest(apiName string, params map[string]string, retval interface{}, assumeRole bool) error { + return self.request("", CDN_SERVICE_NAME, CDN_SERVICE_ID, "2020-05-31", apiName, params, retval, assumeRole) +} + func (client *SAwsClient) getAwsSession(regionId string, assumeRole bool) (*session.Session, error) { httpClient := client.cpcfg.AdaptiveTimeoutHttpClient() transport, _ := httpClient.Transport.(*http.Transport) @@ -447,6 +451,35 @@ func (self *SAwsClient) GetIStorageById(id string) (cloudprovider.ICloudStorage, return nil, errors.Wrap(cloudprovider.ErrNotFound, "GetIStorageById") } +func (self *SAwsClient) cdnList(marker string, pageSize int64) ([]SCdnDomain, string, error) { + input := map[string]string{ + "Marker": marker, + "MaxItems": fmt.Sprintf("%d", pageSize), + } + ret := &struct { + Items []SCdnDomain `xml:"Items>DistributionSummary"` + NextMarker string `xml:"NextMarker,omitempty"` + }{} + err := self.cfRequest("ListDistributions2020_05_31", input, ret, true) + if err != nil { + return nil, "", errors.Wrap(err, "cdnList") + } + return ret.Items, ret.NextMarker, err +} + +func (self *SAwsClient) cdnGet(id string) (*SCdnDomain, error) { + input := map[string]string{ + "Id": id, + } + var ret SCdnDomain + err := self.cfRequest("GetDistribution2020_05_31", input, &ret, true) + if err != nil { + return nil, errors.Wrap(err, "cdnGet") + } + + return &ret, err +} + type SAccountBalance struct { AvailableAmount float64 AvailableCashAmount float64 @@ -504,6 +537,7 @@ func (self *SAwsClient) GetCapabilities() []string { cloudprovider.CLOUD_CAPABILITY_WAF, cloudprovider.CLOUD_CAPABILITY_VPC_PEER, cloudprovider.CLOUD_CAPABILITY_CONTAINER, + cloudprovider.CLOUD_CAPABILITY_CDN + cloudprovider.READ_ONLY_SUFFIX, } return caps } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws_request.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws_request.go index 9de97590cd..b3b1cee4b8 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws_request.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/aws_request.go @@ -60,7 +60,7 @@ func Unmarshal(r *request.Request) { } else { decoder = xml.NewDecoder(r.HTTPResponse.Body) } - if r.ClientInfo.ServiceID == EC2_SERVICE_ID { + if r.ClientInfo.ServiceID == EC2_SERVICE_ID || r.ClientInfo.ServiceID == CDN_SERVICE_ID { err := decoder.Decode(r.Data) if err != nil { r.Error = awserr.NewRequestFailure( @@ -135,6 +135,13 @@ func Build(r *request.Request) { log.Debugf("params: %s", body.Encode()) } + if r.ClientInfo.ServiceID == CDN_SERVICE_ID { + switch r.HTTPRequest.Method { + case "GET": + r.HTTPRequest.URL.RawQuery = body.Encode() + return + } + } if r.ClientInfo.ServiceID == ROUTE53_SERVICE_ID { switch r.HTTPRequest.Method { case "GET": @@ -262,6 +269,26 @@ func (self *SAwsClient) request(regionId, serviceName, serviceId, apiVersion str func jsonRequest(cli *client.Client, apiName string, params map[string]string, retval interface{}) error { method, path := "POST", "/" + if cli.ServiceID == CDN_SERVICE_ID { + for _, prefix := range []string{"List", "Get"} { + if strings.HasPrefix(apiName, prefix) { + method = "GET" + } + } + for k, v := range map[string]string{ + "ListDistributions2020_05_31": "distribution", + "GetDistribution2020_05_31": "distribution", + } { + if apiName == k { + path = fmt.Sprintf("/2020-05-31/%s", v) + if id, ok := params["Id"]; ok { + path = fmt.Sprintf("/2020-05-31/%s/%s", v, strings.TrimPrefix(id, "/")) + delete(params, "Id") + } + } + } + } + if cli.ServiceID == ROUTE53_SERVICE_ID { for _, prefix := range []string{"List", "Get"} { if strings.HasPrefix(apiName, prefix) { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/cdn.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/cdn.go new file mode 100644 index 0000000000..886e8b68ff --- /dev/null +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/cdn.go @@ -0,0 +1,269 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package aws + +import ( + "strings" + + "yunion.io/x/cloudmux/pkg/cloudprovider" + "yunion.io/x/cloudmux/pkg/multicloud" + "yunion.io/x/pkg/errors" +) + +type AliasesType struct { + Quantity int `xml:"Quantity"` + Items []string `xml:"Items>CNAME"` +} + +type Origin struct { + DomainName string `xml:"DomainName"` + Id string `xml:"Id"` + ConnectionAttempts int `xml:"ConnectionAttempts,omitempty"` + ConnectionTimeout int `xml:"ConnectionTimeout,omitempty"` + OriginAccessControlId string `xml:"OriginAccessControlId,omitempty"` + OriginPath string `xml:"OriginPath,omitempty"` +} + +type OriginsType struct { + Items []Origin `xml:"Items>Origin"` + Quantity int `xml:"Quantity"` +} + +type DistributionConfigType struct { + CallerReference string `xml:"CallerReference"` + Comment string `xml:"Comment"` + Enabled bool `xml:"Enabled"` + Origins OriginsType `xml:"Origins"` + Aliases AliasesType `xml:"Aliases,omitempty"` + ContinuousDeploymentPolicyId string `xml:"ContinuousDeploymentPolicyId,omitempty"` + DefaultRootObject string `xml:"DefaultRootObject,omitempty"` + HttpVersion string `xml:"HttpVersion,omitempty"` + IsIPV6Enabled bool `xml:"IsIPV6Enabled,omitempty"` + PriceClass string `xml:"PriceClass,omitempty"` + Staging bool `xml:"Staging,omitempty"` + WebACLId string `xml:"WebACLId,omitempty"` +} + +type SCdnDomain struct { + multicloud.SResourceBase + AwsTags + + client *SAwsClient + + Aliases AliasesType `xml:"Aliases"` + ARN string `xml:"ARN"` + Comment string `xml:"Comment"` + DomainName string `xml:"DomainName"` + Enabled bool `xml:"Enabled"` + HttpVersion string `xml:"HttpVersion"` + Id string `xml:"Id"` + IsIPV6Enabled bool `xml:"IsIPV6Enabled"` + LastModifiedTime string `xml:"LastModifiedTime"` // or time.Time if parsed + Origins OriginsType `xml:"Origins"` + PriceClass string `xml:"PriceClass"` + Staging bool `xml:"Staging"` + Status string `xml:"Status"` + WebACLId string `xml:"WebACLId"` + DistributionConfig DistributionConfigType `xml:"DistributionConfig"` +} + +func (cd *SCdnDomain) GetCacheKeys() (*cloudprovider.SCDNCacheKeys, error) { + return nil, cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetRangeOriginPull() (*cloudprovider.SCDNRangeOriginPull, error) { + return nil, cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetCache() (*cloudprovider.SCDNCache, error) { + return nil, cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetHTTPS() (*cloudprovider.SCDNHttps, error) { + return nil, cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetForceRedirect() (*cloudprovider.SCDNForceRedirect, error) { + return nil, cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetReferer() (*cloudprovider.SCDNReferer, error) { + return nil, cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetMaxAge() (*cloudprovider.SCDNMaxAge, error) { + return nil, cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetArea() string { + return "global" +} + +func (cd *SCdnDomain) GetCname() string { + res := make([]string, len(cd.Aliases.Items)) + for idx, item := range cd.Aliases.Items { + res[idx] = item + } + return strings.Join(res, ",") +} + +func (cd *SCdnDomain) GetEnabled() bool { + return cd.Enabled +} + +func (cd *SCdnDomain) GetId() string { + return cd.DomainName +} + +func (cd *SCdnDomain) GetGlobalId() string { + return cd.DomainName +} + +func (cd *SCdnDomain) GetName() string { + return cd.DomainName +} + +func (cd *SCdnDomain) Refresh() error { + domain, err := cd.client.GetCdnDomain(cd.Id) + if err != nil { + return errors.Wrapf(err, "GetCdnDomain") + } + + cd.Status = domain.Status + return nil +} + +func (cd *SCdnDomain) GetOrigins() *cloudprovider.SCdnOrigins { + domain, err := cd.client.GetCdnDomain(cd.Id) + if err != nil { + return nil + } + + ret := cloudprovider.SCdnOrigins{} + for _, origin := range domain.Origins.Items { + ret = append(ret, cloudprovider.SCdnOrigin{ + Origin: origin.DomainName, + Path: origin.OriginPath, + }) + } + return &ret +} + +func (cd *SCdnDomain) GetServiceType() string { + return "wholeSite" +} + +func (cd *SCdnDomain) GetStatus() string { + if cd.Status == "Deployed" { + return "online" + } else { + return "offline" + } +} + +func (cd *SCdnDomain) Delete() error { + return cloudprovider.ErrNotSupported +} + +func (cd *SCdnDomain) GetProjectId() string { + return "" +} + +func (cd *SCdnDomain) GetDescription() string { + return "" +} + +func (ac *SAwsClient) GetICloudCDNDomains() ([]cloudprovider.ICloudCDNDomain, error) { + domains, err := ac.GetCdnDomains() + if err != nil { + return nil, errors.Wrapf(err, "GetCdnDomains") + } + + ret := make([]cloudprovider.ICloudCDNDomain, 0) + for i := range domains { + domains[i].client = ac + ret = append(ret, &domains[i]) + } + return ret, nil +} + +func (ac *SAwsClient) GetICloudCDNDomainByName(name string) (cloudprovider.ICloudCDNDomain, error) { + return ac.GetCDNDomainByName(name) +} + +func (ac *SAwsClient) GetCDNDomainByName(name string) (*SCdnDomain, error) { + domains, err := ac.GetCdnDomains() + if err != nil { + return nil, errors.Wrapf(err, "GetCdnDomain") + } + + for i := range domains { + if domains[i].DomainName == name { + domains[i].client = ac + return &domains[i], nil + } + } + + return nil, errors.Wrapf(cloudprovider.ErrNotFound, name) +} + +func (ac *SAwsClient) GetCdnDomains() ([]SCdnDomain, error) { + domains := make([]SCdnDomain, 0) + marker := "" + for { + part, nextMarker, err := ac.DescribeUserDomains(marker, int64(100)) + if err != nil { + return nil, errors.Wrapf(err, "DescribeUserDomains") + } + + domains = append(domains, part...) + if nextMarker == "" { + break + } else { + marker = nextMarker + } + } + return domains, nil +} + +func (ac *SAwsClient) DescribeUserDomains(marker string, pageSize int64) ([]SCdnDomain, string, error) { + resp, NextMarker, err := ac.cdnList(marker, pageSize) + if err != nil { + return nil, "", errors.Wrap(err, "DescribeUserDomains") + } + + domains := make([]SCdnDomain, 0) + for i := range resp { + resp[i].client = ac + domains = append(domains, resp[i]) + } + return domains, NextMarker, nil +} + +func (ac *SAwsClient) GetCdnDomain(domainID string) (*SCdnDomain, error) { + resp, err := ac.cdnGet(domainID) + if err != nil { + return nil, errors.Wrapf(err, "ShowDomainDetail") + } + + domain := &SCdnDomain{client: ac} + domain.Status = resp.Status + domain.Origins = resp.DistributionConfig.Origins + if err != nil { + return nil, errors.Wrapf(err, "resp.Unmarshal") + } + + return domain, nil +} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go index 711bae674c..6703bdbc43 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/provider/provider.go @@ -418,3 +418,11 @@ func (self *SAwsProvider) CreateICloudrole(opts *cloudprovider.SRoleCreateOption func (self *SAwsProvider) GetMetrics(opts *cloudprovider.MetricListOptions) ([]cloudprovider.MetricValues, error) { return self.client.GetMetrics(opts) } + +func (self *SAwsProvider) GetICloudCDNDomains() ([]cloudprovider.ICloudCDNDomain, error) { + return self.client.GetICloudCDNDomains() +} + +func (self *SAwsProvider) GetICloudCDNDomainByName(name string) (cloudprovider.ICloudCDNDomain, error) { + return self.client.GetICloudCDNDomainByName(name) +} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/region.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/region.go index eed884240f..d27df9f8e9 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/region.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/aws/region.go @@ -146,6 +146,9 @@ const ( PRICING_SERVICE_NAME = "api.pricing" PRICING_SERVICE_ID = "Pricing" + + CDN_SERVICE_NAME = "cloudfront" + CDN_SERVICE_ID = "CloudFront" ) type SRegion struct { diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/cdn.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/cdn.go new file mode 100644 index 0000000000..2ad108fabb --- /dev/null +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/cdn.go @@ -0,0 +1,273 @@ +// Copyright 2019 Yunion +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package huawei + +import ( + "fmt" + "net/url" + + api "yunion.io/x/cloudmux/pkg/apis/compute" + "yunion.io/x/cloudmux/pkg/cloudprovider" + "yunion.io/x/cloudmux/pkg/multicloud" + "yunion.io/x/pkg/errors" +) + +type SCdnDomainOriginHost struct { + DomainId string `json:"domain_id"` // 域名ID + OriginHostType string `json:"origin_host_type"` // 回源host的类型 + CustomizeDomain string `json:"customize_domain"` // 自定义回源host域名 +} + +type SCdnSource struct { + IPOrDomain string `json:"ip_or_domain"` // 源站IP(非内网IP)或者域名 + DomainID string `json:"domain_id"` // + OriginType string `json:"origin_type"` // 源站类型取值:ipaddr、 domain、obs_bucket,分别表示:源站IP、源站域名、OBS桶访问域名 + ActiveStandby int `json:"active_standby"` // 主备状态(1代表主站;0代表备站),主源站必须存在,备源站可选,OBS桶不能有备源站 +} + +type SCdnDomain struct { + multicloud.SResourceBase + HuaweiTags + + client *SHuaweiClient + + DomainOriginHost SCdnDomainOriginHost `json:"domain_origin_host"` + Sources []SCdnSource `json:"sources"` + DomainName string `json:"domain_name"` // 加速域名 + Cname string `json:"cname"` // 加速域名对应的CNAME + Id string `json:"id"` // 加速域名ID + UserDomainId string `json:"user_domain_id"` // 域名所属用户的domain_id + BusinessType string `json:"business_type"` // 域名业务类型,若为web,则表示类型为网站加速;若为download,则表示业务类型为文件下载加速;若为video,则表示业务类型为点播加速;若为wholeSite,则表示类型为全站加速 + ServiceArea string `json:"service_area"` // 华为云CDN提供的加速服务范围,包含:mainland_china中国大陆、outside_mainland_china中国大陆境外、global全球 + DomainStatus string `json:"domain_status"` // 加速域名状态。取值意义: - online表示“已开启” - offline表示“已停用” - configuring表示“配置中” - configure_failed表示“配置失败” - checking表示“审核中” - check_failed表示“审核未通过” - deleting表示“删除中” + HttpsStatus int `json:"https_status"` // 是否开启HTTPS加速 + CreateTime int64 `json:"create_time"` // 域名创建时间,相对于UTC 1970-01-01到当前时间相隔的毫秒数 + ModifyTime int64 `json:"modify_time"` // 域名修改时间,相对于UTC 1970-01-01到当前时间相隔的毫秒数 + Disabled int `json:"disabled"` // 封禁状态(0代表未禁用;1代表禁用) + Locked int `json:"locked"` // 锁定状态(0代表未锁定;1代表锁定) + RangeStatus string `json:"range_status"` // Range回源状态 + FollowStatus string `json:"follow_status"` // 回源跟随状态 + OriginStatus string `json:"origin_status"` // 是否暂停源站回源 + AutoRefreshPreheat int `json:"auto_refresh_preheat"` // 自动刷新预热(0代表关闭;1代表打开) + EnterpriseProjectId string `json:"enterprise_project_id"` // 企业项目ID + + //config *SCdnConfig +} + +func (cd *SCdnDomain) GetCacheKeys() (*cloudprovider.SCDNCacheKeys, error) { + return nil, nil +} + +func (cd *SCdnDomain) GetRangeOriginPull() (*cloudprovider.SCDNRangeOriginPull, error) { + return nil, nil +} + +func (cd *SCdnDomain) GetCache() (*cloudprovider.SCDNCache, error) { + return nil, nil +} + +func (cd *SCdnDomain) GetHTTPS() (*cloudprovider.SCDNHttps, error) { + return nil, nil +} + +func (cd *SCdnDomain) GetForceRedirect() (*cloudprovider.SCDNForceRedirect, error) { + return nil, nil +} + +func (cd *SCdnDomain) GetReferer() (*cloudprovider.SCDNReferer, error) { + return nil, nil +} + +func (cd *SCdnDomain) GetMaxAge() (*cloudprovider.SCDNMaxAge, error) { + return nil, nil +} + +func (cd *SCdnDomain) GetArea() string { + switch cd.ServiceArea { + case "mainland_china": + return api.CDN_DOMAIN_AREA_MAINLAND + case "global": + return api.CDN_DOMAIN_AREA_GLOBAL + case "outside_mainland_china": + return api.CDN_DOMAIN_AREA_OVERSEAS + default: + return cd.ServiceArea + } +} + +func (cd *SCdnDomain) GetCname() string { + return cd.Cname +} + +func (cd *SCdnDomain) GetEnabled() bool { + if cd.Disabled == 0 { + return true + } else { + return false + } +} + +func (cd *SCdnDomain) GetId() string { + return cd.DomainName +} + +func (cd *SCdnDomain) GetGlobalId() string { + return cd.DomainName +} + +func (cd *SCdnDomain) GetName() string { + return cd.DomainName +} + +func (cd *SCdnDomain) Refresh() error { + domain, err := cd.client.GetCdnDomain(cd.Id, cd.EnterpriseProjectId) + if err != nil { + return errors.Wrapf(err, "GetCdnDomain") + } + cd.DomainStatus = domain.DomainStatus + return nil +} + +func (cd *SCdnDomain) GetOrigins() *cloudprovider.SCdnOrigins { + ret := cloudprovider.SCdnOrigins{} + for _, origin := range cd.Sources { + ret = append(ret, cloudprovider.SCdnOrigin{ + Origin: origin.IPOrDomain, + }) + } + return &ret +} + +func (cd *SCdnDomain) GetServiceType() string { + return cd.BusinessType +} + +func (cd *SCdnDomain) GetStatus() string { + switch cd.DomainStatus { + case "online", "offline": + return cd.DomainStatus + case "configuring", "checking": + return api.CDN_DOMAIN_STATUS_PROCESSING + case "configure_failed": + return cd.DomainStatus + case "check_failed": + return api.CDN_DOMAIN_STATUS_REJECTED + } + return cd.DomainStatus +} + +func (self *SCdnDomain) GetProjectId() string { + return self.EnterpriseProjectId +} + +func (cd *SCdnDomain) Delete() error { + _, err := cd.client.cdnDelete("cdn/domains/" + cd.Id) + return errors.Wrapf(err, "DeleteCdnDomain") +} + +func (hc *SHuaweiClient) GetICloudCDNDomains() ([]cloudprovider.ICloudCDNDomain, error) { + domains, err := hc.GetCdnDomains() + if err != nil { + return nil, errors.Wrapf(err, "GetCdnDomains") + } + + ret := []cloudprovider.ICloudCDNDomain{} + for i := range domains { + domains[i].client = hc + ret = append(ret, &domains[i]) + } + return ret, nil +} + +func (hc *SHuaweiClient) GetICloudCDNDomainByName(name string) (cloudprovider.ICloudCDNDomain, error) { + return hc.GetCDNDomainByName(name) +} + +func (hc *SHuaweiClient) GetCDNDomainByName(name string) (*SCdnDomain, error) { + domains, total, err := hc.DescribeUserDomains(name, 1, 1) + if err != nil { + return nil, errors.Wrapf(err, "GetCdnDomain") + } + if total == 1 { + domains[0].client = hc + return &domains[0], nil + } + if total == 0 { + return nil, errors.Wrapf(cloudprovider.ErrNotFound, name) + } + + return nil, errors.Wrapf(cloudprovider.ErrDuplicateId, name) +} + +func (hc *SHuaweiClient) GetCdnDomains() ([]SCdnDomain, error) { + domains := make([]SCdnDomain, 0) + for { + part, total, err := hc.DescribeUserDomains("", 1000, len(domains)/1000+1) + if err != nil { + return nil, errors.Wrapf(err, "DescribeUserDomains") + } + + domains = append(domains, part...) + if len(domains) >= total || len(part) == 0 { + break + } + } + return domains, nil +} + +func (hc *SHuaweiClient) DescribeUserDomains(domain string, pageSize, pageNumber int) ([]SCdnDomain, int, error) { + if pageSize < 1 || pageSize > 1000 { + pageSize = 1000 + } + if pageNumber < 1 { + pageNumber = 1 + } + params := url.Values{ + "page_size": []string{fmt.Sprintf("%d", pageSize)}, + "page_number": []string{fmt.Sprintf("%d", pageNumber)}, + "enterprise_project_id": []string{"ALL"}, + } + if len(domain) > 0 { + params["domain_name"] = []string{domain} + } + resp, err := hc.cdnList("cdn/domains", params) + if err != nil { + return nil, 0, errors.Wrap(err, "DescribeUserDomains") + } + + domains := make([]SCdnDomain, 0) + err = resp.Unmarshal(&domains, "domains") + if err != nil { + return nil, 0, errors.Wrap(err, "resp.Unmarshal") + } + + totalCount, _ := resp.Int("total") + return domains, int(totalCount), nil +} + +func (hc *SHuaweiClient) GetCdnDomain(domainID, epID string) (*SCdnDomain, error) { + resp, err := hc.cdnGet("cdn/domains/"+domainID+"/detail", epID) + if err != nil { + return nil, errors.Wrapf(err, "ShowDomainDetail") + } + + domain := &SCdnDomain{client: hc} + err = resp.Unmarshal(domain, "domain") + if err != nil { + return nil, errors.Wrapf(err, "resp.Unmarshal") + } + + return domain, nil +} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/huawei.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/huawei.go index 4ccee84fd7..802f4b5688 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/huawei.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/huawei.go @@ -127,9 +127,9 @@ type SHuaweiClient struct { signer auth.Signer - isMainProject bool // whether the project is the main project in the region - isSyncCertProject bool - clientRegion string + isMainProject bool // whether the project is the main project in the region + isDefaultProject bool // whether the project is the default region project + clientRegion string userId string ownerId string @@ -394,6 +394,22 @@ func (self *SHuaweiClient) sslcertExport(regionId, resource string, scID string) return self.request(httputils.POST, uri, url.Values{}, nil) } +func (self *SHuaweiClient) cdnGet(resource, epID string) (jsonutils.JSONObject, error) { + params := url.Values{"enterprise_project_id": []string{epID}} + uri := fmt.Sprintf("https://cdn.myhuaweicloud.com/v1.0/%s", resource) + return self.request(httputils.GET, uri, params, nil) +} + +func (self *SHuaweiClient) cdnList(resource string, query url.Values) (jsonutils.JSONObject, error) { + uri := fmt.Sprintf("https://cdn.myhuaweicloud.com/v1.0/%s", resource) + return self.request(httputils.GET, uri, query, nil) +} + +func (self *SHuaweiClient) cdnDelete(resource string) (jsonutils.JSONObject, error) { + uri := fmt.Sprintf("https://cdn.myhuaweicloud.com/v1.0/%s", resource) + return self.request(httputils.DELETE, uri, url.Values{}, nil) +} + type akClient struct { client *http.Client aksk aksk.SignOptions @@ -486,7 +502,7 @@ func (self *SHuaweiClient) fetchRegions() error { } } if project.Name == HUAWEI_CERT_DEFAULT_REGION { - self.isSyncCertProject = true + self.isDefaultProject = true } } else { filtedRegions = self.regions @@ -877,8 +893,9 @@ func (self *SHuaweiClient) GetCapabilities() []string { if self.isMainProject { caps = append(caps, cloudprovider.CLOUD_CAPABILITY_OBJECTSTORE) } - if self.isSyncCertProject { + if self.isDefaultProject { caps = append(caps, cloudprovider.CLOUD_CAPABILITY_CERT) + caps = append(caps, cloudprovider.CLOUD_CAPABILITY_CDN+cloudprovider.READ_ONLY_SUFFIX) } return caps } diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go index 0c821b91ca..c83b5c2187 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/huawei/provider/provider.go @@ -319,3 +319,11 @@ func (self *SHuaweiProvider) GetISSLCertificates() ([]cloudprovider.ICloudSSLCer func (self *SHuaweiProvider) GetISSLCertificate(certId string) (cloudprovider.ICloudSSLCertificate, error) { return self.client.GetISSLCertificate(certId) } + +func (self *SHuaweiProvider) GetICloudCDNDomains() ([]cloudprovider.ICloudCDNDomain, error) { + return self.client.GetICloudCDNDomains() +} + +func (self *SHuaweiProvider) GetICloudCDNDomainByName(name string) (cloudprovider.ICloudCDNDomain, error) { + return self.client.GetICloudCDNDomainByName(name) +} diff --git a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go index 1024cc2626..056e700003 100644 --- a/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go +++ b/vendor/yunion.io/x/cloudmux/pkg/multicloud/qcloud/loadbalancer.go @@ -213,7 +213,10 @@ func (self *SLoadbalancer) Refresh() error { // 腾讯云当前不支持一个LB绑定多个ip,每个LB只支持绑定一个ip func (self *SLoadbalancer) GetAddress() string { - return self.LoadBalancerVips[0] + for _, addr := range self.LoadBalancerVips { + return addr + } + return "" } func (self *SLoadbalancer) GetAddressType() string {