region.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  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. "strings"
  19. "time"
  20. "yunion.io/x/jsonutils"
  21. "yunion.io/x/log"
  22. "yunion.io/x/pkg/errors"
  23. api "yunion.io/x/cloudmux/pkg/apis/compute"
  24. "yunion.io/x/cloudmux/pkg/cloudprovider"
  25. "yunion.io/x/cloudmux/pkg/multicloud"
  26. "yunion.io/x/cloudmux/pkg/multicloud/huawei/obs"
  27. )
  28. type Locales struct {
  29. EnUs string `json:"en-us"`
  30. ZhCN string `json:"zh-cn"`
  31. }
  32. type SRegion struct {
  33. multicloud.SRegion
  34. client *SHuaweiClient
  35. obsClient *obs.ObsClient // 对象存储client.请勿直接引用。
  36. Description string
  37. Id string
  38. Locales Locales
  39. ParentRegionId string
  40. Type string
  41. storageCache *SStoragecache
  42. }
  43. func (self *SRegion) GetClient() *SHuaweiClient {
  44. return self.client
  45. }
  46. func (self *SRegion) list(service, resource string, query url.Values) (jsonutils.JSONObject, error) {
  47. return self.client.list(service, self.Id, resource, query)
  48. }
  49. func (self *SRegion) delete(service, resource string) (jsonutils.JSONObject, error) {
  50. return self.client.delete(service, self.Id, resource)
  51. }
  52. func (self *SRegion) put(service, resource string, params map[string]interface{}) (jsonutils.JSONObject, error) {
  53. return self.client.put(service, self.Id, resource, params)
  54. }
  55. func (self *SRegion) post(service, resource string, params map[string]interface{}) (jsonutils.JSONObject, error) {
  56. return self.client.post(service, self.Id, resource, params)
  57. }
  58. func (self *SRegion) patch(service, resource string, query url.Values, params map[string]interface{}) (jsonutils.JSONObject, error) {
  59. return self.client.patch(service, self.Id, resource, query, params)
  60. }
  61. func (self *SRegion) getOBSEndpoint() string {
  62. return getOBSEndpoint(self.getId())
  63. }
  64. func (self *SRegion) getOBSClient(signType obs.SignatureType) (*obs.ObsClient, error) {
  65. if self.obsClient == nil {
  66. obsClient, err := self.client.getOBSClient(self.getId(), signType)
  67. if err != nil {
  68. return nil, err
  69. }
  70. self.obsClient = obsClient
  71. }
  72. return self.obsClient, nil
  73. }
  74. // https://console.huaweicloud.com/apiexplorer/#/openapi/ECS/doc?api=NovaListAvailabilityZones
  75. func (self *SRegion) GetZones() ([]SZone, error) {
  76. resp, err := self.list(SERVICE_ECS_V2_1, "os-availability-zone", nil)
  77. if err != nil {
  78. return nil, err
  79. }
  80. ret := []SZone{}
  81. err = resp.Unmarshal(&ret, "availabilityZoneInfo")
  82. if err != nil {
  83. return nil, errors.Wrapf(err, "resp.Unmarshal")
  84. }
  85. return ret, nil
  86. }
  87. func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) {
  88. instance, err := self.GetInstance(id)
  89. if err != nil {
  90. return nil, err
  91. }
  92. return instance, err
  93. }
  94. func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) {
  95. return self.GetDisk(id)
  96. }
  97. func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo {
  98. if info, ok := LatitudeAndLongitude[self.getId()]; ok {
  99. return info
  100. }
  101. return cloudprovider.SGeographicInfo{}
  102. }
  103. func (self *SRegion) GetILoadBalancers() ([]cloudprovider.ICloudLoadbalancer, error) {
  104. elbs, err := self.GetLoadBalancers()
  105. if err != nil {
  106. return nil, err
  107. }
  108. ielbs := make([]cloudprovider.ICloudLoadbalancer, len(elbs))
  109. for i := range elbs {
  110. elbs[i].region = self
  111. ielbs[i] = &elbs[i]
  112. }
  113. return ielbs, nil
  114. }
  115. func (self *SRegion) GetLoadBalancers() ([]SLoadbalancer, error) {
  116. lbs := []SLoadbalancer{}
  117. params := url.Values{}
  118. return lbs, self.lbListAll("elb/loadbalancers", params, "loadbalancers", &lbs)
  119. }
  120. func (self *SRegion) GetILoadBalancerById(id string) (cloudprovider.ICloudLoadbalancer, error) {
  121. elb, err := self.GetLoadbalancer(id)
  122. if err != nil {
  123. return nil, err
  124. }
  125. return elb, nil
  126. }
  127. func (self *SRegion) GetILoadBalancerAclById(aclId string) (cloudprovider.ICloudLoadbalancerAcl, error) {
  128. acl, err := self.GetLoadBalancerAcl(aclId)
  129. if err != nil {
  130. return nil, err
  131. }
  132. return acl, nil
  133. }
  134. func (self *SRegion) GetILoadBalancerCertificateById(certId string) (cloudprovider.ICloudLoadbalancerCertificate, error) {
  135. cert, err := self.GetLoadBalancerCertificate(certId)
  136. if err != nil {
  137. return nil, err
  138. }
  139. return cert, nil
  140. }
  141. func (self *SRegion) CreateILoadBalancerCertificate(cert *cloudprovider.SLoadbalancerCertificate) (cloudprovider.ICloudLoadbalancerCertificate, error) {
  142. ret, err := self.CreateLoadBalancerCertificate(cert)
  143. if err != nil {
  144. return nil, err
  145. }
  146. return ret, nil
  147. }
  148. func (self *SRegion) GetILoadBalancerAcls() ([]cloudprovider.ICloudLoadbalancerAcl, error) {
  149. ret, err := self.GetLoadBalancerAcls("")
  150. if err != nil {
  151. return nil, err
  152. }
  153. iret := make([]cloudprovider.ICloudLoadbalancerAcl, len(ret))
  154. for i := range ret {
  155. ret[i].region = self
  156. iret[i] = &ret[i]
  157. }
  158. return iret, nil
  159. }
  160. func (self *SRegion) GetILoadBalancerCertificates() ([]cloudprovider.ICloudLoadbalancerCertificate, error) {
  161. ret, err := self.GetLoadBalancerCertificates()
  162. if err != nil {
  163. return nil, err
  164. }
  165. iret := make([]cloudprovider.ICloudLoadbalancerCertificate, len(ret))
  166. for i := range ret {
  167. ret[i].region = self
  168. iret[i] = &ret[i]
  169. }
  170. return iret, nil
  171. }
  172. func (self *SRegion) GetId() string {
  173. return self.Id
  174. }
  175. func (self *SRegion) GetName() string {
  176. name := self.Locales.ZhCN
  177. suffix := self.getSuffix()
  178. if len(suffix) > 0 {
  179. name = fmt.Sprintf("%s-%s", name, suffix)
  180. }
  181. return fmt.Sprintf("%s %s", CLOUD_PROVIDER_HUAWEI_CN, name)
  182. }
  183. func (self *SRegion) getId() string {
  184. idx := strings.Index(self.Id, "_")
  185. if idx > 0 {
  186. return self.Id[:idx]
  187. }
  188. return self.Id
  189. }
  190. func (self *SRegion) getSuffix() string {
  191. idx := strings.Index(self.Id, "_")
  192. if idx > 0 {
  193. return self.Id[idx+1:]
  194. }
  195. return ""
  196. }
  197. func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
  198. en := self.Locales.EnUs
  199. suffix := self.getSuffix()
  200. if len(suffix) > 0 {
  201. en = fmt.Sprintf("%s-%s", en, suffix)
  202. }
  203. en = fmt.Sprintf("%s %s", CLOUD_PROVIDER_HUAWEI_EN, en)
  204. table := cloudprovider.SModelI18nTable{}
  205. table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
  206. return table
  207. }
  208. func (self *SRegion) GetGlobalId() string {
  209. return fmt.Sprintf("%s/%s", api.CLOUD_PROVIDER_HUAWEI, self.Id)
  210. }
  211. func (self *SRegion) GetStatus() string {
  212. return api.CLOUD_REGION_STATUS_INSERVER
  213. }
  214. func (self *SRegion) Refresh() error {
  215. return nil
  216. }
  217. func (self *SRegion) GetIZones() ([]cloudprovider.ICloudZone, error) {
  218. zones, err := self.GetZones()
  219. if err != nil {
  220. return nil, err
  221. }
  222. ret := []cloudprovider.ICloudZone{}
  223. for i := range zones {
  224. zones[i].region = self
  225. ret = append(ret, &zones[i])
  226. }
  227. return ret, nil
  228. }
  229. func (self *SRegion) GetIVpcs() ([]cloudprovider.ICloudVpc, error) {
  230. vpcs, err := self.GetVpcs()
  231. if err != nil {
  232. return nil, errors.Wrapf(err, "GetVpcs")
  233. }
  234. ret := []cloudprovider.ICloudVpc{}
  235. for i := range vpcs {
  236. vpcs[i].region = self
  237. ret = append(ret, &vpcs[i])
  238. }
  239. return ret, nil
  240. }
  241. func (self *SRegion) GetIEips() ([]cloudprovider.ICloudEIP, error) {
  242. eips, err := self.GetEips("", nil)
  243. if err != nil {
  244. return nil, err
  245. }
  246. ret := []cloudprovider.ICloudEIP{}
  247. for i := 0; i < len(eips); i += 1 {
  248. eips[i].region = self
  249. ret = append(ret, &eips[i])
  250. }
  251. return ret, nil
  252. }
  253. func (self *SRegion) GetIVpcById(id string) (cloudprovider.ICloudVpc, error) {
  254. ivpcs, err := self.GetIVpcs()
  255. if err != nil {
  256. return nil, err
  257. }
  258. for i := 0; i < len(ivpcs); i += 1 {
  259. if ivpcs[i].GetGlobalId() == id {
  260. return ivpcs[i], nil
  261. }
  262. }
  263. return nil, cloudprovider.ErrNotFound
  264. }
  265. func (self *SRegion) GetIZoneById(id string) (cloudprovider.ICloudZone, error) {
  266. izones, err := self.GetIZones()
  267. if err != nil {
  268. return nil, err
  269. }
  270. for i := 0; i < len(izones); i += 1 {
  271. if izones[i].GetGlobalId() == id {
  272. return izones[i], nil
  273. }
  274. }
  275. return nil, cloudprovider.ErrNotFound
  276. }
  277. func (self *SRegion) GetIEipById(eipId string) (cloudprovider.ICloudEIP, error) {
  278. eip, err := self.GetEip(eipId)
  279. if err != nil {
  280. return nil, err
  281. }
  282. return eip, nil
  283. }
  284. func (self *SRegion) DeleteSecurityGroup(id string) error {
  285. _, err := self.delete(SERVICE_VPC_V3, "vpc/security-groups/"+id)
  286. return err
  287. }
  288. func (self *SRegion) GetISecurityGroupById(secgroupId string) (cloudprovider.ICloudSecurityGroup, error) {
  289. return self.GetSecurityGroup(secgroupId)
  290. }
  291. func (self *SRegion) GetISecurityGroups() ([]cloudprovider.ICloudSecurityGroup, error) {
  292. groups, err := self.GetSecurityGroups("")
  293. if err != nil {
  294. return nil, errors.Wrapf(err, "GetSecurityGroups")
  295. }
  296. ret := []cloudprovider.ICloudSecurityGroup{}
  297. for i := range groups {
  298. groups[i].region = self
  299. ret = append(ret, &groups[i])
  300. }
  301. return ret, nil
  302. }
  303. func (self *SRegion) CreateISecurityGroup(opts *cloudprovider.SecurityGroupCreateInput) (cloudprovider.ICloudSecurityGroup, error) {
  304. return self.CreateSecurityGroup(opts)
  305. }
  306. func (self *SRegion) CreateIVpc(opts *cloudprovider.VpcCreateOptions) (cloudprovider.ICloudVpc, error) {
  307. return self.CreateVpc(opts.NAME, opts.CIDR, opts.Desc)
  308. }
  309. func (self *SRegion) CreateVpc(name, cidr, desc string) (*SVpc, error) {
  310. params := map[string]interface{}{
  311. "vpc": map[string]string{
  312. "name": name,
  313. "cidr": cidr,
  314. "description": desc,
  315. },
  316. }
  317. vpc := &SVpc{region: self}
  318. resp, err := self.post(SERVICE_VPC, "vpcs", params)
  319. if err != nil {
  320. return nil, errors.Wrapf(err, "create vpc")
  321. }
  322. err = resp.Unmarshal(vpc, "vpc")
  323. if err != nil {
  324. return nil, errors.Wrapf(err, "Unmarshal")
  325. }
  326. return vpc, nil
  327. }
  328. // https://support.huaweicloud.com/api-vpc/zh-cn_topic_0020090596.html
  329. // size: 1Mbit/s~2000Mbit/s
  330. // bgpType: 5_telcom,5_union,5_bgp,5_sbgp.
  331. // 东北-大连:5_telcom、5_union
  332. // 华南-广州:5_sbgp
  333. // 华东-上海二:5_sbgp
  334. // 华北-北京一:5_bgp、5_sbgp
  335. // 亚太-香港:5_bgp
  336. func (self *SRegion) CreateEIP(opts *cloudprovider.SEip) (cloudprovider.ICloudEIP, error) {
  337. eip, err := self.AllocateEIP(opts)
  338. if err != nil {
  339. return nil, err
  340. }
  341. err = cloudprovider.WaitStatus(eip, api.EIP_STATUS_READY, 5*time.Second, time.Minute)
  342. return eip, err
  343. }
  344. func (self *SRegion) GetISnapshots() ([]cloudprovider.ICloudSnapshot, error) {
  345. snapshots, err := self.GetSnapshots("", "")
  346. if err != nil {
  347. log.Errorf("self.GetSnapshots fail %s", err)
  348. return nil, err
  349. }
  350. ret := make([]cloudprovider.ICloudSnapshot, len(snapshots))
  351. for i := 0; i < len(snapshots); i += 1 {
  352. snapshots[i].region = self
  353. ret[i] = &snapshots[i]
  354. }
  355. return ret, nil
  356. }
  357. func (self *SRegion) GetISnapshotById(id string) (cloudprovider.ICloudSnapshot, error) {
  358. snapshot, err := self.GetSnapshot(id)
  359. if err != nil {
  360. return nil, err
  361. }
  362. return snapshot, nil
  363. }
  364. func (self *SRegion) GetIHosts() ([]cloudprovider.ICloudHost, error) {
  365. iHosts := make([]cloudprovider.ICloudHost, 0)
  366. izones, err := self.GetIZones()
  367. if err != nil {
  368. return nil, err
  369. }
  370. for i := 0; i < len(izones); i += 1 {
  371. iZoneHost, err := izones[i].GetIHosts()
  372. if err != nil {
  373. return nil, err
  374. }
  375. iHosts = append(iHosts, iZoneHost...)
  376. }
  377. return iHosts, nil
  378. }
  379. func (self *SRegion) GetIHostById(id string) (cloudprovider.ICloudHost, error) {
  380. izones, err := self.GetIZones()
  381. if err != nil {
  382. return nil, err
  383. }
  384. for i := 0; i < len(izones); i += 1 {
  385. ihost, err := izones[i].GetIHostById(id)
  386. if err == nil {
  387. return ihost, nil
  388. } else if errors.Cause(err) != cloudprovider.ErrNotFound {
  389. return nil, err
  390. }
  391. }
  392. return nil, cloudprovider.ErrNotFound
  393. }
  394. func (self *SRegion) GetIStorages() ([]cloudprovider.ICloudStorage, error) {
  395. iStores := make([]cloudprovider.ICloudStorage, 0)
  396. izones, err := self.GetIZones()
  397. if err != nil {
  398. return nil, err
  399. }
  400. for i := 0; i < len(izones); i += 1 {
  401. iZoneStores, err := izones[i].GetIStorages()
  402. if err != nil {
  403. return nil, err
  404. }
  405. iStores = append(iStores, iZoneStores...)
  406. }
  407. return iStores, nil
  408. }
  409. func (self *SRegion) GetIStorageById(id string) (cloudprovider.ICloudStorage, error) {
  410. izones, err := self.GetIZones()
  411. if err != nil {
  412. return nil, err
  413. }
  414. for i := 0; i < len(izones); i += 1 {
  415. istore, err := izones[i].GetIStorageById(id)
  416. if err == nil {
  417. return istore, nil
  418. } else if errors.Cause(err) != cloudprovider.ErrNotFound {
  419. return nil, err
  420. }
  421. }
  422. return nil, cloudprovider.ErrNotFound
  423. }
  424. func (self *SRegion) GetProvider() string {
  425. return CLOUD_PROVIDER_HUAWEI
  426. }
  427. func (self *SRegion) GetCloudEnv() string {
  428. return CLOUD_PROVIDER_HUAWEI
  429. }
  430. func (self *SRegion) CreateSecurityGroup(opts *cloudprovider.SecurityGroupCreateInput) (*SSecurityGroup, error) {
  431. params := map[string]interface{}{
  432. "name": opts.Name,
  433. "description": opts.Desc,
  434. "enterprise_project_id": "0",
  435. }
  436. if len(opts.ProjectId) > 0 {
  437. params["enterprise_project_id"] = opts.ProjectId
  438. }
  439. resp, err := self.post(SERVICE_VPC_V3, "vpc/security-groups", map[string]interface{}{"security_group": params})
  440. if err != nil {
  441. return nil, err
  442. }
  443. ret := &SSecurityGroup{region: self}
  444. return ret, resp.Unmarshal(ret, "security_group")
  445. }
  446. func (self *SRegion) CreateILoadBalancer(loadbalancer *cloudprovider.SLoadbalancerCreateOptions) (cloudprovider.ICloudLoadbalancer, error) {
  447. ret, err := self.CreateLoadBalancer(loadbalancer)
  448. if err != nil {
  449. return nil, err
  450. }
  451. return ret, nil
  452. }
  453. func (self *SRegion) CreateILoadBalancerAcl(acl *cloudprovider.SLoadbalancerAccessControlList) (cloudprovider.ICloudLoadbalancerAcl, error) {
  454. return nil, cloudprovider.ErrNotSupported
  455. }
  456. func (region *SRegion) GetIBuckets() ([]cloudprovider.ICloudBucket, error) {
  457. iBuckets, err := region.client.getIBuckets()
  458. if err != nil {
  459. return nil, errors.Wrap(err, "getIBuckets")
  460. }
  461. ret := make([]cloudprovider.ICloudBucket, 0)
  462. for i := range iBuckets {
  463. // huawei OBS is shared across projects
  464. if iBuckets[i].GetLocation() == region.GetId() {
  465. ret = append(ret, iBuckets[i])
  466. }
  467. }
  468. return ret, nil
  469. }
  470. func str2StorageClass(storageClassStr string) (obs.StorageClassType, error) {
  471. if strings.EqualFold(storageClassStr, string(obs.StorageClassStandard)) {
  472. return obs.StorageClassStandard, nil
  473. } else if strings.EqualFold(storageClassStr, string(obs.StorageClassWarm)) {
  474. return obs.StorageClassWarm, nil
  475. } else if strings.EqualFold(storageClassStr, string(obs.StorageClassCold)) {
  476. return obs.StorageClassCold, nil
  477. } else {
  478. return obs.StorageClassStandard, errors.Error("unsupported storageClass")
  479. }
  480. }
  481. func (region *SRegion) CreateIBucket(name string, storageClassStr string, aclStr string) error {
  482. obsClient, err := region.getOBSClient("")
  483. if err != nil {
  484. return errors.Wrap(err, "region.getOBSClient")
  485. }
  486. input := &obs.CreateBucketInput{}
  487. input.Bucket = name
  488. input.Location = region.getId()
  489. if len(aclStr) > 0 {
  490. if strings.EqualFold(aclStr, string(obs.AclPrivate)) {
  491. input.ACL = obs.AclPrivate
  492. } else if strings.EqualFold(aclStr, string(obs.AclPublicRead)) {
  493. input.ACL = obs.AclPublicRead
  494. } else if strings.EqualFold(aclStr, string(obs.AclPublicReadWrite)) {
  495. input.ACL = obs.AclPublicReadWrite
  496. } else {
  497. return errors.Error("unsupported acl")
  498. }
  499. }
  500. if len(storageClassStr) > 0 {
  501. input.StorageClass, err = str2StorageClass(storageClassStr)
  502. if err != nil {
  503. return err
  504. }
  505. }
  506. _, err = obsClient.CreateBucket(input)
  507. if err != nil {
  508. return errors.Wrap(err, "obsClient.CreateBucket")
  509. }
  510. region.client.invalidateIBuckets()
  511. return nil
  512. }
  513. func obsHttpCode(err error) int {
  514. switch httpErr := err.(type) {
  515. case obs.ObsError:
  516. return httpErr.StatusCode
  517. case *obs.ObsError:
  518. return httpErr.StatusCode
  519. }
  520. return -1
  521. }
  522. func (region *SRegion) DeleteIBucket(name string) error {
  523. obsClient, err := region.getOBSClient("")
  524. if err != nil {
  525. return errors.Wrap(err, "region.getOBSClient")
  526. }
  527. _, err = obsClient.DeleteBucket(name)
  528. if err != nil {
  529. if obsHttpCode(err) == 404 {
  530. return nil
  531. }
  532. log.Debugf("%#v %s", err, err)
  533. return errors.Wrap(err, "DeleteBucket")
  534. }
  535. region.client.invalidateIBuckets()
  536. return nil
  537. }
  538. func (region *SRegion) HeadBucket(name string) (*obs.BaseModel, error) {
  539. obsClient, err := region.getOBSClient("")
  540. if err != nil {
  541. return nil, errors.Wrap(err, "region.getOBSClient")
  542. }
  543. return obsClient.HeadBucket(name)
  544. }
  545. func (region *SRegion) IBucketExist(name string) (bool, error) {
  546. _, err := region.HeadBucket(name)
  547. if err != nil {
  548. if obsHttpCode(err) == 404 {
  549. return false, nil
  550. } else {
  551. return false, errors.Wrap(err, "HeadBucket")
  552. }
  553. }
  554. return true, nil
  555. }
  556. func (region *SRegion) GetIBucketById(name string) (cloudprovider.ICloudBucket, error) {
  557. return cloudprovider.GetIBucketById(region, name)
  558. }
  559. func (region *SRegion) GetIBucketByName(name string) (cloudprovider.ICloudBucket, error) {
  560. return region.GetIBucketById(name)
  561. }
  562. func (self *SRegion) GetSkus(zoneId string) ([]cloudprovider.ICloudSku, error) {
  563. return nil, cloudprovider.ErrNotImplemented
  564. }
  565. func (self *SRegion) GetIElasticcaches() ([]cloudprovider.ICloudElasticcache, error) {
  566. caches, err := self.GetElasticCaches()
  567. if err != nil {
  568. return nil, err
  569. }
  570. icaches := make([]cloudprovider.ICloudElasticcache, len(caches))
  571. for i := range caches {
  572. caches[i].region = self
  573. icaches[i] = &caches[i]
  574. }
  575. return icaches, nil
  576. }
  577. func (region *SRegion) GetCapabilities() []string {
  578. if strings.Contains(region.Id, "_") {
  579. return []string{
  580. cloudprovider.CLOUD_CAPABILITY_PROJECT,
  581. cloudprovider.CLOUD_CAPABILITY_COMPUTE,
  582. cloudprovider.CLOUD_CAPABILITY_NETWORK,
  583. cloudprovider.CLOUD_CAPABILITY_SECURITY_GROUP,
  584. cloudprovider.CLOUD_CAPABILITY_EIP,
  585. cloudprovider.CLOUD_CAPABILITY_LOADBALANCER,
  586. cloudprovider.CLOUD_CAPABILITY_RDS,
  587. cloudprovider.CLOUD_CAPABILITY_CACHE,
  588. cloudprovider.CLOUD_CAPABILITY_CLOUDID,
  589. cloudprovider.CLOUD_CAPABILITY_SAML_AUTH,
  590. cloudprovider.CLOUD_CAPABILITY_NAT,
  591. cloudprovider.CLOUD_CAPABILITY_NAS,
  592. cloudprovider.CLOUD_CAPABILITY_QUOTA + cloudprovider.READ_ONLY_SUFFIX,
  593. cloudprovider.CLOUD_CAPABILITY_MODELARTES,
  594. cloudprovider.CLOUD_CAPABILITY_VPC_PEER,
  595. }
  596. }
  597. return region.client.GetCapabilities()
  598. }
  599. func (self *SRegion) GetDiskTypes() ([]SDiskType, error) {
  600. resp, err := self.list(SERVICE_EVS, "types", nil)
  601. if err != nil {
  602. return nil, err
  603. }
  604. ret := []SDiskType{}
  605. err = resp.Unmarshal(&ret, "volume_types")
  606. if err != nil {
  607. return nil, errors.Wrapf(err, "Unmarshal")
  608. }
  609. return ret, nil
  610. }
  611. func (region *SRegion) GetIVMs() ([]cloudprovider.ICloudVM, error) {
  612. vms, err := region.GetInstances("")
  613. if err != nil {
  614. return nil, errors.Wrap(err, "GetInstances")
  615. }
  616. ret := []cloudprovider.ICloudVM{}
  617. for i := range vms {
  618. ret = append(ret, &vms[i])
  619. }
  620. return ret, nil
  621. }