cdn.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package huawei
  15. import (
  16. "fmt"
  17. "net/url"
  18. api "yunion.io/x/cloudmux/pkg/apis/compute"
  19. "yunion.io/x/cloudmux/pkg/cloudprovider"
  20. "yunion.io/x/cloudmux/pkg/multicloud"
  21. "yunion.io/x/pkg/errors"
  22. )
  23. type SCdnDomainOriginHost struct {
  24. DomainId string `json:"domain_id"` // 域名ID
  25. OriginHostType string `json:"origin_host_type"` // 回源host的类型
  26. CustomizeDomain string `json:"customize_domain"` // 自定义回源host域名
  27. }
  28. type SCdnSource struct {
  29. IPOrDomain string `json:"ip_or_domain"` // 源站IP(非内网IP)或者域名
  30. DomainID string `json:"domain_id"` //
  31. OriginType string `json:"origin_type"` // 源站类型取值:ipaddr、 domain、obs_bucket,分别表示:源站IP、源站域名、OBS桶访问域名
  32. ActiveStandby int `json:"active_standby"` // 主备状态(1代表主站;0代表备站),主源站必须存在,备源站可选,OBS桶不能有备源站
  33. }
  34. type SCdnDomain struct {
  35. multicloud.SCDNDomainBase
  36. HuaweiTags
  37. client *SHuaweiClient
  38. DomainOriginHost SCdnDomainOriginHost `json:"domain_origin_host"`
  39. Sources []SCdnSource `json:"sources"`
  40. DomainName string `json:"domain_name"` // 加速域名
  41. Cname string `json:"cname"` // 加速域名对应的CNAME
  42. Id string `json:"id"` // 加速域名ID
  43. UserDomainId string `json:"user_domain_id"` // 域名所属用户的domain_id
  44. BusinessType string `json:"business_type"` // 域名业务类型,若为web,则表示类型为网站加速;若为download,则表示业务类型为文件下载加速;若为video,则表示业务类型为点播加速;若为wholeSite,则表示类型为全站加速
  45. ServiceArea string `json:"service_area"` // 华为云CDN提供的加速服务范围,包含:mainland_china中国大陆、outside_mainland_china中国大陆境外、global全球
  46. DomainStatus string `json:"domain_status"` // 加速域名状态。取值意义: - online表示“已开启” - offline表示“已停用” - configuring表示“配置中” - configure_failed表示“配置失败” - checking表示“审核中” - check_failed表示“审核未通过” - deleting表示“删除中”
  47. HttpsStatus int `json:"https_status"` // 是否开启HTTPS加速
  48. CreateTime int64 `json:"create_time"` // 域名创建时间,相对于UTC 1970-01-01到当前时间相隔的毫秒数
  49. ModifyTime int64 `json:"modify_time"` // 域名修改时间,相对于UTC 1970-01-01到当前时间相隔的毫秒数
  50. Disabled int `json:"disabled"` // 封禁状态(0代表未禁用;1代表禁用)
  51. Locked int `json:"locked"` // 锁定状态(0代表未锁定;1代表锁定)
  52. RangeStatus string `json:"range_status"` // Range回源状态
  53. FollowStatus string `json:"follow_status"` // 回源跟随状态
  54. OriginStatus string `json:"origin_status"` // 是否暂停源站回源
  55. AutoRefreshPreheat int `json:"auto_refresh_preheat"` // 自动刷新预热(0代表关闭;1代表打开)
  56. EnterpriseProjectId string `json:"enterprise_project_id"` // 企业项目ID
  57. //config *SCdnConfig
  58. }
  59. func (cd *SCdnDomain) GetCacheKeys() (*cloudprovider.SCDNCacheKeys, error) {
  60. return nil, nil
  61. }
  62. func (cd *SCdnDomain) GetRangeOriginPull() (*cloudprovider.SCDNRangeOriginPull, error) {
  63. return nil, nil
  64. }
  65. func (cd *SCdnDomain) GetCache() (*cloudprovider.SCDNCache, error) {
  66. return nil, nil
  67. }
  68. func (cd *SCdnDomain) GetHTTPS() (*cloudprovider.SCDNHttps, error) {
  69. return nil, nil
  70. }
  71. func (cd *SCdnDomain) GetForceRedirect() (*cloudprovider.SCDNForceRedirect, error) {
  72. return nil, nil
  73. }
  74. func (cd *SCdnDomain) GetReferer() (*cloudprovider.SCDNReferer, error) {
  75. return nil, nil
  76. }
  77. func (cd *SCdnDomain) GetMaxAge() (*cloudprovider.SCDNMaxAge, error) {
  78. return nil, nil
  79. }
  80. func (cd *SCdnDomain) GetArea() string {
  81. switch cd.ServiceArea {
  82. case "mainland_china":
  83. return api.CDN_DOMAIN_AREA_MAINLAND
  84. case "global":
  85. return api.CDN_DOMAIN_AREA_GLOBAL
  86. case "outside_mainland_china":
  87. return api.CDN_DOMAIN_AREA_OVERSEAS
  88. default:
  89. return cd.ServiceArea
  90. }
  91. }
  92. func (cd *SCdnDomain) GetCname() string {
  93. return cd.Cname
  94. }
  95. func (cd *SCdnDomain) GetEnabled() bool {
  96. if cd.Disabled == 0 {
  97. return true
  98. } else {
  99. return false
  100. }
  101. }
  102. func (cd *SCdnDomain) GetId() string {
  103. return cd.DomainName
  104. }
  105. func (cd *SCdnDomain) GetGlobalId() string {
  106. return cd.DomainName
  107. }
  108. func (cd *SCdnDomain) GetName() string {
  109. return cd.DomainName
  110. }
  111. func (cd *SCdnDomain) Refresh() error {
  112. domain, err := cd.client.GetCdnDomain(cd.Id, cd.EnterpriseProjectId)
  113. if err != nil {
  114. return errors.Wrapf(err, "GetCdnDomain")
  115. }
  116. cd.DomainStatus = domain.DomainStatus
  117. return nil
  118. }
  119. func (cd *SCdnDomain) GetOrigins() *cloudprovider.SCdnOrigins {
  120. ret := cloudprovider.SCdnOrigins{}
  121. for _, origin := range cd.Sources {
  122. ret = append(ret, cloudprovider.SCdnOrigin{
  123. Origin: origin.IPOrDomain,
  124. })
  125. }
  126. return &ret
  127. }
  128. func (cd *SCdnDomain) GetServiceType() string {
  129. return cd.BusinessType
  130. }
  131. func (cd *SCdnDomain) GetStatus() string {
  132. switch cd.DomainStatus {
  133. case "online", "offline":
  134. return cd.DomainStatus
  135. case "configuring", "checking":
  136. return api.CDN_DOMAIN_STATUS_PROCESSING
  137. case "configure_failed":
  138. return cd.DomainStatus
  139. case "check_failed":
  140. return api.CDN_DOMAIN_STATUS_REJECTED
  141. }
  142. return cd.DomainStatus
  143. }
  144. func (self *SCdnDomain) GetProjectId() string {
  145. return self.EnterpriseProjectId
  146. }
  147. func (cd *SCdnDomain) Delete() error {
  148. _, err := cd.client.delete(SERVICE_CDN, "", "cdn/domains/"+cd.Id)
  149. return err
  150. }
  151. func (hc *SHuaweiClient) GetICloudCDNDomains() ([]cloudprovider.ICloudCDNDomain, error) {
  152. domains, err := hc.GetCdnDomains()
  153. if err != nil {
  154. return nil, errors.Wrapf(err, "GetCdnDomains")
  155. }
  156. ret := []cloudprovider.ICloudCDNDomain{}
  157. for i := range domains {
  158. domains[i].client = hc
  159. ret = append(ret, &domains[i])
  160. }
  161. return ret, nil
  162. }
  163. func (hc *SHuaweiClient) GetICloudCDNDomainByName(name string) (cloudprovider.ICloudCDNDomain, error) {
  164. return hc.GetCDNDomainByName(name)
  165. }
  166. func (hc *SHuaweiClient) GetCDNDomainByName(name string) (*SCdnDomain, error) {
  167. domains, total, err := hc.DescribeUserDomains(name, 1, 1)
  168. if err != nil {
  169. return nil, errors.Wrapf(err, "GetCdnDomain")
  170. }
  171. if total == 1 {
  172. domains[0].client = hc
  173. return &domains[0], nil
  174. }
  175. if total == 0 {
  176. return nil, errors.Wrapf(cloudprovider.ErrNotFound, "%s", name)
  177. }
  178. return nil, errors.Wrapf(cloudprovider.ErrDuplicateId, "%s", name)
  179. }
  180. func (hc *SHuaweiClient) GetCdnDomains() ([]SCdnDomain, error) {
  181. domains := make([]SCdnDomain, 0)
  182. for {
  183. part, total, err := hc.DescribeUserDomains("", 1000, len(domains)/1000+1)
  184. if err != nil {
  185. return nil, errors.Wrapf(err, "DescribeUserDomains")
  186. }
  187. domains = append(domains, part...)
  188. if len(domains) >= total || len(part) == 0 {
  189. break
  190. }
  191. }
  192. return domains, nil
  193. }
  194. func (hc *SHuaweiClient) DescribeUserDomains(domain string, pageSize, pageNumber int) ([]SCdnDomain, int, error) {
  195. if pageSize < 1 || pageSize > 1000 {
  196. pageSize = 1000
  197. }
  198. if pageNumber < 1 {
  199. pageNumber = 1
  200. }
  201. params := url.Values{
  202. "page_size": []string{fmt.Sprintf("%d", pageSize)},
  203. "page_number": []string{fmt.Sprintf("%d", pageNumber)},
  204. "enterprise_project_id": []string{"ALL"},
  205. }
  206. if len(domain) > 0 {
  207. params["domain_name"] = []string{domain}
  208. }
  209. resp, err := hc.list(SERVICE_CDN, "", "cdn/domains", params)
  210. if err != nil {
  211. return nil, 0, errors.Wrap(err, "DescribeUserDomains")
  212. }
  213. domains := make([]SCdnDomain, 0)
  214. err = resp.Unmarshal(&domains, "domains")
  215. if err != nil {
  216. return nil, 0, errors.Wrap(err, "resp.Unmarshal")
  217. }
  218. totalCount, _ := resp.Int("total")
  219. return domains, int(totalCount), nil
  220. }
  221. func (hc *SHuaweiClient) GetCdnDomain(domainID, epID string) (*SCdnDomain, error) {
  222. params := url.Values{"enterprise_project_id": []string{epID}}
  223. resp, err := hc.list(SERVICE_CDN, "", "cdn/domains/"+domainID+"/detail", params)
  224. if err != nil {
  225. return nil, errors.Wrapf(err, "ShowDomainDetail")
  226. }
  227. domain := &SCdnDomain{client: hc}
  228. err = resp.Unmarshal(domain, "domain")
  229. if err != nil {
  230. return nil, errors.Wrapf(err, "resp.Unmarshal")
  231. }
  232. return domain, nil
  233. }