| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- // 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.SCDNDomainBase
- 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.delete(SERVICE_CDN, "", "cdn/domains/"+cd.Id)
- return err
- }
- 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, "%s", name)
- }
- return nil, errors.Wrapf(cloudprovider.ErrDuplicateId, "%s", 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.list(SERVICE_CDN, "", "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) {
- params := url.Values{"enterprise_project_id": []string{epID}}
- resp, err := hc.list(SERVICE_CDN, "", "cdn/domains/"+domainID+"/detail", params)
- 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
- }
|