region.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  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 azure
  15. import (
  16. "fmt"
  17. "net/url"
  18. "strconv"
  19. "strings"
  20. "yunion.io/x/jsonutils"
  21. "yunion.io/x/log"
  22. "yunion.io/x/pkg/errors"
  23. "yunion.io/x/pkg/gotypes"
  24. "yunion.io/x/pkg/util/netutils"
  25. api "yunion.io/x/cloudmux/pkg/apis/compute"
  26. "yunion.io/x/cloudmux/pkg/cloudprovider"
  27. "yunion.io/x/cloudmux/pkg/multicloud"
  28. )
  29. type SVMSize struct {
  30. //MaxDataDiskCount int32 `json:"maxDataDiskCount,omitempty"` //Unmarshal会出错
  31. MemoryInMB int32 `json:"memoryInMB,omitempty"`
  32. NumberOfCores int `json:"numberOfCores,omitempty"`
  33. Name string
  34. OsDiskSizeInMB int32 `json:"osDiskSizeInMB,omitempty"`
  35. ResourceDiskSizeInMB int32 `json:"resourceDiskSizeInMB,omitempty"`
  36. }
  37. type SRegion struct {
  38. multicloud.SRegion
  39. client *SAzureClient
  40. storageCache *SStoragecache
  41. ID string
  42. Name string
  43. DisplayName string
  44. Latitude string
  45. Longitude string
  46. }
  47. // ///////////////////////////////////////////////////////////////////////////
  48. func (self *SRegion) Refresh() error {
  49. // do nothing
  50. return nil
  51. }
  52. func (self *SRegion) GetClient() *SAzureClient {
  53. return self.client
  54. }
  55. func (self *SRegion) ListVmSizes() ([]SVMSize, error) {
  56. result := []SVMSize{}
  57. resource := fmt.Sprintf("Microsoft.Compute/locations/%s/vmSizes", self.Name)
  58. return result, self.client.list(resource, url.Values{}, &result)
  59. }
  60. func (self *SRegion) getHardwareProfile(cpu, memMB int) []string {
  61. vmSizes, err := self.ListVmSizes()
  62. if err != nil {
  63. return []string{}
  64. }
  65. result := []string{}
  66. for i := range vmSizes {
  67. if vmSizes[i].MemoryInMB == int32(memMB) && vmSizes[i].NumberOfCores == cpu {
  68. result = append(result, vmSizes[i].Name)
  69. }
  70. }
  71. return result
  72. }
  73. func (self *SRegion) getVMSize(name string) (*SVMSize, error) {
  74. vmSizes, err := self.ListVmSizes()
  75. if err != nil {
  76. return nil, errors.Wrapf(err, "ListVmSizes")
  77. }
  78. for i := range vmSizes {
  79. if vmSizes[i].Name == name {
  80. return &vmSizes[i], nil
  81. }
  82. }
  83. return nil, errors.Wrapf(cloudprovider.ErrNotFound, "%s", name)
  84. }
  85. func (self *SRegion) GetId() string {
  86. return self.Name
  87. }
  88. func (self *SRegion) GetName() string {
  89. return fmt.Sprintf("%s %s", CLOUD_PROVIDER_AZURE_CN, self.DisplayName)
  90. }
  91. func (self *SRegion) GetI18n() cloudprovider.SModelI18nTable {
  92. en := fmt.Sprintf("%s %s", CLOUD_PROVIDER_AZURE_EN, self.DisplayName)
  93. table := cloudprovider.SModelI18nTable{}
  94. table["name"] = cloudprovider.NewSModelI18nEntry(self.GetName()).CN(self.GetName()).EN(en)
  95. return table
  96. }
  97. func (self *SRegion) GetGlobalId() string {
  98. return fmt.Sprintf("%s/%s", self.client.GetAccessEnv(), self.Name)
  99. }
  100. func (self *SRegion) IsEmulated() bool {
  101. return false
  102. }
  103. func (self *SRegion) GetProvider() string {
  104. return CLOUD_PROVIDER_AZURE
  105. }
  106. func (self *SRegion) GetCloudEnv() string {
  107. return self.client.envName
  108. }
  109. func (self *SRegion) trimGeographicString(geographic string) string {
  110. return strings.TrimFunc(geographic, func(r rune) bool {
  111. return !((r >= '0' && r <= '9') || r == '.' || r == '-')
  112. })
  113. }
  114. func (self *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo {
  115. info := cloudprovider.SGeographicInfo{}
  116. if geographicInfo, ok := AzureGeographicInfo[self.Name]; ok {
  117. info = geographicInfo
  118. }
  119. self.Latitude = self.trimGeographicString(self.Latitude)
  120. self.Longitude = self.trimGeographicString(self.Longitude)
  121. latitude, err := strconv.ParseFloat(self.Latitude, 32)
  122. if err != nil {
  123. log.Errorf("Parse azure region %s latitude %s error: %v", self.Name, self.Latitude, err)
  124. } else {
  125. info.Latitude = float32(latitude)
  126. }
  127. longitude, err := strconv.ParseFloat(self.Longitude, 32)
  128. if err != nil {
  129. log.Errorf("Parse azure region %s longitude %s error: %v", self.Name, self.Longitude, err)
  130. } else {
  131. info.Longitude = float32(longitude)
  132. }
  133. return info
  134. }
  135. func (self *SRegion) GetStatus() string {
  136. return api.CLOUD_REGION_STATUS_INSERVER
  137. }
  138. func (self *SRegion) CreateIVpc(opts *cloudprovider.VpcCreateOptions) (cloudprovider.ICloudVpc, error) {
  139. vpc := SVpc{
  140. region: self,
  141. Name: opts.NAME,
  142. Location: self.Name,
  143. Properties: VirtualNetworkPropertiesFormat{
  144. AddressSpace: AddressSpace{
  145. AddressPrefixes: []string{opts.CIDR},
  146. },
  147. },
  148. Type: "Microsoft.Network/virtualNetworks",
  149. }
  150. return &vpc, self.create("", jsonutils.Marshal(vpc), &vpc)
  151. }
  152. func (self *SRegion) GetIHostById(id string) (cloudprovider.ICloudHost, error) {
  153. izones, err := self.GetIZones()
  154. if err != nil {
  155. return nil, err
  156. }
  157. for i := 0; i < len(izones); i += 1 {
  158. ihost, err := izones[i].GetIHostById(id)
  159. if err == nil {
  160. return ihost, nil
  161. } else if err != cloudprovider.ErrNotFound {
  162. return nil, err
  163. }
  164. }
  165. return nil, cloudprovider.ErrNotFound
  166. }
  167. func (self *SRegion) GetIStorageById(id string) (cloudprovider.ICloudStorage, error) {
  168. izones, err := self.GetIZones()
  169. if err != nil {
  170. return nil, err
  171. }
  172. for i := 0; i < len(izones); i += 1 {
  173. istore, err := izones[i].GetIStorageById(id)
  174. if err == nil {
  175. return istore, nil
  176. } else if err != cloudprovider.ErrNotFound {
  177. return nil, err
  178. }
  179. }
  180. return nil, cloudprovider.ErrNotFound
  181. }
  182. func (self *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) {
  183. return self.GetInstance(id)
  184. }
  185. func (self *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) {
  186. return self.GetDisk(id)
  187. }
  188. func (self *SRegion) GetIHosts() ([]cloudprovider.ICloudHost, error) {
  189. iHosts := make([]cloudprovider.ICloudHost, 0)
  190. izones, err := self.GetIZones()
  191. if err != nil {
  192. return nil, err
  193. }
  194. for i := 0; i < len(izones); i += 1 {
  195. iZoneHost, err := izones[i].GetIHosts()
  196. if err != nil {
  197. return nil, err
  198. }
  199. iHosts = append(iHosts, iZoneHost...)
  200. }
  201. return iHosts, nil
  202. }
  203. func (self *SRegion) GetIStorages() ([]cloudprovider.ICloudStorage, error) {
  204. iStores := make([]cloudprovider.ICloudStorage, 0)
  205. izones, err := self.GetIZones()
  206. if err != nil {
  207. return nil, err
  208. }
  209. for i := 0; i < len(izones); i += 1 {
  210. iZoneStores, err := izones[i].GetIStorages()
  211. if err != nil {
  212. return nil, err
  213. }
  214. iStores = append(iStores, iZoneStores...)
  215. }
  216. return iStores, nil
  217. }
  218. func (self *SRegion) GetIStoragecacheById(id string) (cloudprovider.ICloudStoragecache, error) {
  219. storageCache := self.getStoragecache()
  220. if storageCache.GetGlobalId() == id {
  221. return self.storageCache, nil
  222. }
  223. return nil, cloudprovider.ErrNotFound
  224. }
  225. func (self *SRegion) GetIVpcById(id string) (cloudprovider.ICloudVpc, error) {
  226. ivpcs, err := self.GetIVpcs()
  227. if err != nil {
  228. return nil, err
  229. }
  230. for i := 0; i < len(ivpcs); i++ {
  231. if ivpcs[i].GetGlobalId() == id {
  232. return ivpcs[i], nil
  233. }
  234. }
  235. return nil, cloudprovider.ErrNotFound
  236. }
  237. func (self *SRegion) GetIZoneById(id string) (cloudprovider.ICloudZone, error) {
  238. if izones, err := self.GetIZones(); err != nil {
  239. return nil, err
  240. } else {
  241. for i := 0; i < len(izones); i += 1 {
  242. if izones[i].GetGlobalId() == id {
  243. return izones[i], nil
  244. }
  245. }
  246. }
  247. return nil, cloudprovider.ErrNotFound
  248. }
  249. func (self *SRegion) getZone() *SZone {
  250. return &SZone{region: self, Name: self.Name}
  251. }
  252. func (self *SRegion) GetIZones() ([]cloudprovider.ICloudZone, error) {
  253. return []cloudprovider.ICloudZone{self.getZone()}, nil
  254. }
  255. func (self *SRegion) getStoragecache() *SStoragecache {
  256. if self.storageCache == nil {
  257. self.storageCache = &SStoragecache{region: self}
  258. }
  259. return self.storageCache
  260. }
  261. func (self *SRegion) ListVpcs() ([]SVpc, error) {
  262. result := []SVpc{}
  263. err := self.list("Microsoft.Network/virtualNetworks", url.Values{}, &result)
  264. if err != nil {
  265. return nil, errors.Wrapf(err, "list")
  266. }
  267. return result, nil
  268. }
  269. func (self *SRegion) GetIVpcs() ([]cloudprovider.ICloudVpc, error) {
  270. vpcs, err := self.ListVpcs()
  271. if err != nil {
  272. return nil, errors.Wrapf(err, "ListVpcs")
  273. }
  274. ret := []cloudprovider.ICloudVpc{}
  275. for i := range vpcs {
  276. vpcs[i].region = self
  277. ret = append(ret, &vpcs[i])
  278. }
  279. return ret, nil
  280. }
  281. func (self *SRegion) CreateInstanceSimple(name string, imgId, osType string, cpu int, memMb int, sysDiskSizeGB int, storageType string, dataDiskSizesGB []int, nicId string, passwd string, publicKey string) (*SInstance, error) {
  282. desc := &cloudprovider.SManagedVMCreateConfig{
  283. Name: name,
  284. ExternalImageId: imgId,
  285. SysDisk: cloudprovider.SDiskInfo{SizeGB: sysDiskSizeGB, StorageType: storageType},
  286. Cpu: cpu,
  287. MemoryMB: memMb,
  288. Password: passwd,
  289. DataDisks: []cloudprovider.SDiskInfo{},
  290. PublicKey: publicKey,
  291. OsType: osType,
  292. }
  293. if len(passwd) > 0 {
  294. desc.Password = passwd
  295. }
  296. for _, sizeGB := range dataDiskSizesGB {
  297. desc.DataDisks = append(desc.DataDisks, cloudprovider.SDiskInfo{SizeGB: sizeGB, StorageType: storageType})
  298. }
  299. return self._createVM(desc, nicId)
  300. }
  301. func (region *SRegion) GetEips() ([]SEipAddress, error) {
  302. eips := []SEipAddress{}
  303. err := region.client.list("Microsoft.Network/publicIPAddresses", url.Values{}, &eips)
  304. if err != nil {
  305. return nil, err
  306. }
  307. result := []SEipAddress{}
  308. for i := 0; i < len(eips); i++ {
  309. if eips[i].Location == region.Name {
  310. eips[i].region = region
  311. result = append(result, eips[i])
  312. }
  313. }
  314. return result, nil
  315. }
  316. func (region *SRegion) GetIEips() ([]cloudprovider.ICloudEIP, error) {
  317. eips, err := region.GetEips()
  318. if err != nil {
  319. return nil, errors.Wrapf(err, "GetEips")
  320. }
  321. ieips := []cloudprovider.ICloudEIP{}
  322. for i := 0; i < len(eips); i++ {
  323. if len(eips[i].GetIpAddr()) == 0 {
  324. continue
  325. }
  326. _, err := netutils.NewIPV4Addr(eips[i].GetIpAddr())
  327. if err != nil {
  328. continue
  329. }
  330. eips[i].region = region
  331. ieips = append(ieips, &eips[i])
  332. }
  333. return ieips, nil
  334. }
  335. func (self *SRegion) GetISecurityGroups() ([]cloudprovider.ICloudSecurityGroup, error) {
  336. secgroups, err := self.ListSecgroups()
  337. if err != nil {
  338. return nil, errors.Wrapf(err, "ListSecgroups")
  339. }
  340. ret := []cloudprovider.ICloudSecurityGroup{}
  341. for i := range secgroups {
  342. secgroups[i].region = self
  343. ret = append(ret, &secgroups[i])
  344. }
  345. return ret, nil
  346. }
  347. func (region *SRegion) GetISecurityGroupById(secgroupId string) (cloudprovider.ICloudSecurityGroup, error) {
  348. return region.GetSecurityGroupDetails(secgroupId)
  349. }
  350. func (region *SRegion) CreateISecurityGroup(opts *cloudprovider.SecurityGroupCreateInput) (cloudprovider.ICloudSecurityGroup, error) {
  351. return region.CreateSecurityGroup(opts)
  352. }
  353. func (region *SRegion) GetILoadBalancers() ([]cloudprovider.ICloudLoadbalancer, error) {
  354. lbs, err := region.GetLoadbalancers()
  355. if err != nil {
  356. return nil, err
  357. }
  358. ret := []cloudprovider.ICloudLoadbalancer{}
  359. for i := range lbs {
  360. lbs[i].region = region
  361. ret = append(ret, &lbs[i])
  362. }
  363. return ret, nil
  364. }
  365. func (region *SRegion) GetILoadBalancerById(loadbalancerId string) (cloudprovider.ICloudLoadbalancer, error) {
  366. lb := SLoadbalancer{}
  367. params := url.Values{}
  368. params.Set("api-version", "2021-02-01")
  369. err := region.get(loadbalancerId, params, &lb)
  370. if err != nil {
  371. return nil, errors.Wrapf(err, "get")
  372. }
  373. lb.region = region
  374. return &lb, nil
  375. }
  376. func (region *SRegion) GetILoadBalancerAclById(aclId string) (cloudprovider.ICloudLoadbalancerAcl, error) {
  377. return nil, errors.Wrap(cloudprovider.ErrNotSupported, "GetILoadBalancerAclById")
  378. }
  379. func (region *SRegion) GetILoadBalancerCertificateById(certId string) (cloudprovider.ICloudLoadbalancerCertificate, error) {
  380. segs := strings.Split(certId, "/sslCertificates")
  381. if len(segs[0]) > 0 {
  382. lb, err := region.GetLoadbalancer(segs[0])
  383. if err != nil {
  384. return nil, errors.Wrap(err, "GetILoadBalancerById")
  385. }
  386. for i := range lb.Properties.SSLCertificates {
  387. ssl := &lb.Properties.SSLCertificates[i]
  388. ssl.region = region
  389. if ssl.GetGlobalId() == certId {
  390. return ssl, nil
  391. }
  392. }
  393. }
  394. return nil, errors.Wrap(cloudprovider.ErrNotFound, certId)
  395. }
  396. func (region *SRegion) GetILoadBalancerCertificates() ([]cloudprovider.ICloudLoadbalancerCertificate, error) {
  397. lbs, err := region.GetLoadbalancerCertificates()
  398. if err != nil {
  399. return nil, errors.Wrap(err, "GetILoadBalancers")
  400. }
  401. ret := []cloudprovider.ICloudLoadbalancerCertificate{}
  402. for i := range lbs {
  403. lbs[i].region = region
  404. ret = append(ret, &lbs[i])
  405. }
  406. return ret, nil
  407. }
  408. func (region *SRegion) CreateILoadBalancerCertificate(cert *cloudprovider.SLoadbalancerCertificate) (cloudprovider.ICloudLoadbalancerCertificate, error) {
  409. return nil, errors.Wrap(cloudprovider.ErrNotImplemented, "CreateILoadBalancerCertificate")
  410. }
  411. func (region *SRegion) GetILoadBalancerAcls() ([]cloudprovider.ICloudLoadbalancerAcl, error) {
  412. return nil, errors.Wrap(cloudprovider.ErrNotSupported, "GetILoadBalancerAcls")
  413. }
  414. func (region *SRegion) CreateILoadBalancer(loadbalancer *cloudprovider.SLoadbalancerCreateOptions) (cloudprovider.ICloudLoadbalancer, error) {
  415. return nil, errors.Wrap(cloudprovider.ErrNotImplemented, "CreateILoadBalancer")
  416. }
  417. func (region *SRegion) CreateILoadBalancerAcl(acl *cloudprovider.SLoadbalancerAccessControlList) (cloudprovider.ICloudLoadbalancerAcl, error) {
  418. return nil, errors.Wrap(cloudprovider.ErrNotImplemented, "CreateILoadBalancerAcl")
  419. }
  420. func (region *SRegion) GetIBuckets() ([]cloudprovider.ICloudBucket, error) {
  421. accounts, err := region.ListStorageAccounts()
  422. if err != nil {
  423. return nil, errors.Wrapf(err, "ListStorageAccounts")
  424. }
  425. ret := make([]cloudprovider.ICloudBucket, 0)
  426. for i := range accounts {
  427. ret = append(ret, &accounts[i])
  428. }
  429. return ret, nil
  430. }
  431. func (region *SRegion) CreateIBucket(name string, storageClassStr string, acl string) error {
  432. _, err := region.createStorageAccount(name, storageClassStr)
  433. if err != nil {
  434. return errors.Wrapf(err, "region.createStorageAccount name=%s storageClass=%s acl=%s", name, storageClassStr, acl)
  435. }
  436. return nil
  437. }
  438. func (region *SRegion) DeleteIBucket(name string) error {
  439. accounts, err := region.listStorageAccounts()
  440. if err != nil {
  441. return errors.Wrap(err, "ListStorageAccounts")
  442. }
  443. for i := range accounts {
  444. if accounts[i].Name == name {
  445. err = region.del(accounts[i].ID)
  446. if err != nil {
  447. return errors.Wrapf(err, "region.del")
  448. }
  449. return nil
  450. }
  451. }
  452. return nil
  453. }
  454. func (region *SRegion) IBucketExist(name string) (bool, error) {
  455. return region.checkStorageAccountNameExist(name)
  456. }
  457. func (region *SRegion) GetIBucketById(name string) (cloudprovider.ICloudBucket, error) {
  458. return cloudprovider.GetIBucketById(region, name)
  459. }
  460. func (region *SRegion) GetIBucketByName(name string) (cloudprovider.ICloudBucket, error) {
  461. return region.GetIBucketById(name)
  462. }
  463. func (region *SRegion) GetCapabilities() []string {
  464. return region.client.GetCapabilities()
  465. }
  466. func (self *SRegion) get(resource string, params url.Values, retVal interface{}) error {
  467. return self.client.get(resource, params, retVal)
  468. }
  469. func (self *SRegion) Show(resource string) (jsonutils.JSONObject, error) {
  470. ret := jsonutils.NewDict()
  471. err := self.get(resource, url.Values{}, ret)
  472. if err != nil {
  473. return nil, err
  474. }
  475. return ret, nil
  476. }
  477. func (self *SRegion) del(resource string) error {
  478. return self.client.del(resource)
  479. }
  480. func (self *SRegion) Delete(resource string) error {
  481. return self.del(resource)
  482. }
  483. func (self *SRegion) checkResourceGroup(resourceGroup string) (string, error) {
  484. if len(resourceGroup) == 0 {
  485. resourceGroup = "Default"
  486. }
  487. resourceGroups, err := self.client.ListResourceGroups()
  488. if err != nil {
  489. return "", errors.Wrapf(err, "ListResourceGroups")
  490. }
  491. for i := range resourceGroups {
  492. proj := resourceGroups[i]
  493. if strings.ToLower(proj.GetName()) == strings.ToLower(resourceGroup) ||
  494. proj.GetGlobalId() == resourceGroup ||
  495. (strings.Contains(resourceGroup, "/") && strings.HasSuffix(proj.GetGlobalId(), resourceGroup)) {
  496. return resourceGroup, nil
  497. }
  498. }
  499. _, err = self.CreateResourceGroup(resourceGroup)
  500. return resourceGroup, err
  501. }
  502. type sInfo struct {
  503. Location string `json:"Location"`
  504. Name string `json:"Name"`
  505. Type string `json:"Type"`
  506. }
  507. func (self *SRegion) createInfo(body jsonutils.JSONObject) (sInfo, error) {
  508. info := sInfo{}
  509. err := body.Unmarshal(&info)
  510. if err != nil {
  511. return info, errors.Wrapf(err, "body.Unmarshal")
  512. }
  513. if len(info.Name) == 0 {
  514. return info, fmt.Errorf("Missing name params")
  515. }
  516. if len(info.Type) == 0 {
  517. return info, fmt.Errorf("Missing type params")
  518. }
  519. return info, nil
  520. }
  521. func (self *SRegion) create(resourceGroup string, _body jsonutils.JSONObject, retVal interface{}) error {
  522. body := _body.(*jsonutils.JSONDict)
  523. info, err := self.createInfo(_body)
  524. if err != nil {
  525. return errors.Wrapf(err, "createInfo")
  526. }
  527. resourceGroup, err = self.checkResourceGroup(resourceGroup)
  528. if err != nil {
  529. return errors.Wrapf(err, "checkResourceGroup(%s)", resourceGroup)
  530. }
  531. info.Name, err = self.client.getUniqName(resourceGroup, info.Type, info.Name)
  532. if err != nil {
  533. return errors.Wrapf(err, "getUniqName")
  534. }
  535. info.Location = self.Name
  536. body.Update(jsonutils.Marshal(info))
  537. body.Remove("location")
  538. body.Remove("name")
  539. body.Remove("type")
  540. return self.client.create(resourceGroup, info.Type, info.Name, body, retVal)
  541. }
  542. func (self *SRegion) update(body jsonutils.JSONObject, retVal interface{}) error {
  543. return self.client.update(body, retVal)
  544. }
  545. func (self *SRegion) perform(id, action string, body jsonutils.JSONObject) (jsonutils.JSONObject, error) {
  546. return self.client.perform(id, action, body)
  547. }
  548. func (self *SRegion) put(resource string, body jsonutils.JSONObject) (jsonutils.JSONObject, error) {
  549. return self.client.put(resource, body)
  550. }
  551. func (self *SRegion) patch(resource string, body jsonutils.JSONObject) (jsonutils.JSONObject, error) {
  552. return self.client.patch(resource, body)
  553. }
  554. func (self *SRegion) list(resource string, params url.Values, retVal interface{}) error {
  555. result := []jsonutils.JSONObject{}
  556. err := self.client.list(resource, params, &result)
  557. if err != nil {
  558. return errors.Wrapf(err, "client.list")
  559. }
  560. ret := []jsonutils.JSONObject{}
  561. for i := range result {
  562. location, _ := result[i].GetString("location")
  563. if len(location) == 0 || strings.ToLower(self.Name) == strings.ToLower(strings.Replace(location, " ", "", -1)) {
  564. ret = append(ret, result[i])
  565. }
  566. }
  567. return jsonutils.Update(retVal, ret)
  568. }
  569. func (self *SRegion) list_resources(resource string, apiVersion string, params url.Values) (jsonutils.JSONObject, error) {
  570. if gotypes.IsNil(params) {
  571. params = url.Values{}
  572. }
  573. params.Add("$filter", fmt.Sprintf("location eq '%s'", self.Name))
  574. params.Add("$filter", fmt.Sprintf("resourceType eq '%s'", resource))
  575. return self.client.list_v2("resources", apiVersion, params)
  576. }
  577. func (self *SRegion) list_v2(resource string, apiVersion string, params url.Values) (jsonutils.JSONObject, error) {
  578. if gotypes.IsNil(params) {
  579. params = url.Values{}
  580. }
  581. return self.client.list_v2(resource, apiVersion, params)
  582. }
  583. func (self *SRegion) post_v2(resource string, apiVersion string, body map[string]interface{}) (jsonutils.JSONObject, error) {
  584. return self.client.post_v2(resource, apiVersion, body)
  585. }
  586. func (self *SRegion) show(resource string, apiVersion string) (jsonutils.JSONObject, error) {
  587. return self.client.list_v2(resource, apiVersion, nil)
  588. }
  589. func (region *SRegion) GetIVMs() ([]cloudprovider.ICloudVM, error) {
  590. zones, err := region.GetIZones()
  591. if err != nil {
  592. return nil, err
  593. }
  594. ret := make([]cloudprovider.ICloudVM, 0)
  595. for i := range zones {
  596. hosts, err := zones[i].GetIHosts()
  597. if err != nil {
  598. return nil, err
  599. }
  600. for j := range hosts {
  601. ivms, err := hosts[j].GetIVMs()
  602. if err != nil {
  603. return nil, err
  604. }
  605. ret = append(ret, ivms...)
  606. }
  607. }
  608. return ret, nil
  609. }