region.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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 baidu
  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/jsonutils"
  22. "yunion.io/x/pkg/errors"
  23. )
  24. var regions = map[string]string{
  25. "bj": "北京",
  26. "cd": "成都",
  27. "gz": "广州",
  28. "su": "苏州",
  29. "hkg": "香港",
  30. "fwh": "武汉",
  31. "bd": "保定",
  32. "sin": "新加坡",
  33. "fsh": "上海",
  34. }
  35. type SRegion struct {
  36. multicloud.SRegion
  37. multicloud.SNoObjectStorageRegion
  38. multicloud.SNoLbRegion
  39. client *SBaiduClient
  40. RegionId string
  41. RegionName string
  42. RegionEndpoint string
  43. }
  44. func (region *SRegion) GetId() string {
  45. return region.RegionId
  46. }
  47. func (region *SRegion) GetGlobalId() string {
  48. return fmt.Sprintf("%s/%s", api.CLOUD_PROVIDER_BAIDU, region.RegionId)
  49. }
  50. func (region *SRegion) GetProvider() string {
  51. return api.CLOUD_PROVIDER_BAIDU
  52. }
  53. func (region *SRegion) GetCloudEnv() string {
  54. return api.CLOUD_PROVIDER_BAIDU
  55. }
  56. func (region *SRegion) GetGeographicInfo() cloudprovider.SGeographicInfo {
  57. geo, ok := map[string]cloudprovider.SGeographicInfo{
  58. "bj": api.RegionBeijing,
  59. "gz": api.RegionGuangzhou,
  60. "su": api.RegionSuzhou,
  61. "hkg": api.RegionHongkong,
  62. "fwh": api.RegionHangzhou,
  63. "bd": api.RegionBaoDing,
  64. "sin": api.RegionSingapore,
  65. "fsh": api.RegionShanghai,
  66. "cd": api.RegionChengdu,
  67. }[region.RegionId]
  68. if ok {
  69. return geo
  70. }
  71. return cloudprovider.SGeographicInfo{}
  72. }
  73. func (region *SRegion) GetName() string {
  74. if name, ok := regions[region.RegionId]; ok {
  75. return name
  76. }
  77. return region.RegionName
  78. }
  79. func (region *SRegion) GetI18n() cloudprovider.SModelI18nTable {
  80. table := cloudprovider.SModelI18nTable{}
  81. table["name"] = cloudprovider.NewSModelI18nEntry(region.GetName()).CN(region.GetName()).EN(region.RegionName)
  82. return table
  83. }
  84. func (region *SRegion) GetStatus() string {
  85. return api.CLOUD_REGION_STATUS_INSERVER
  86. }
  87. func (region *SRegion) GetClient() *SBaiduClient {
  88. return region.client
  89. }
  90. func (region *SRegion) CreateEIP(opts *cloudprovider.SEip) (cloudprovider.ICloudEIP, error) {
  91. eip, err := region.CreateEip(opts)
  92. if err != nil {
  93. return nil, err
  94. }
  95. return eip, nil
  96. }
  97. func (region *SRegion) CreateISecurityGroup(opts *cloudprovider.SecurityGroupCreateInput) (cloudprovider.ICloudSecurityGroup, error) {
  98. group, err := region.CreateSecurityGroup(opts)
  99. if err != nil {
  100. return nil, err
  101. }
  102. return group, nil
  103. }
  104. func (region *SRegion) GetISecurityGroupById(id string) (cloudprovider.ICloudSecurityGroup, error) {
  105. group, err := region.GetSecurityGroup(id)
  106. if err != nil {
  107. return nil, err
  108. }
  109. return group, nil
  110. }
  111. func (region *SRegion) CreateIVpc(opts *cloudprovider.VpcCreateOptions) (cloudprovider.ICloudVpc, error) {
  112. vpc, err := region.CreateVpc(opts)
  113. if err != nil {
  114. return nil, err
  115. }
  116. return vpc, nil
  117. }
  118. func (region *SRegion) GetIVpcs() ([]cloudprovider.ICloudVpc, error) {
  119. vpcs, err := region.GetVpcs()
  120. if err != nil {
  121. return nil, errors.Wrapf(err, "GetVpcs")
  122. }
  123. ret := []cloudprovider.ICloudVpc{}
  124. for i := range vpcs {
  125. vpcs[i].region = region
  126. ret = append(ret, &vpcs[i])
  127. }
  128. return ret, nil
  129. }
  130. func (region *SRegion) GetIVpcById(id string) (cloudprovider.ICloudVpc, error) {
  131. vpc, err := region.GetVpc(id)
  132. if err != nil {
  133. return nil, err
  134. }
  135. return vpc, nil
  136. }
  137. func (region *SRegion) GetCapabilities() []string {
  138. return region.client.GetCapabilities()
  139. }
  140. func (region *SRegion) GetIEipById(id string) (cloudprovider.ICloudEIP, error) {
  141. eip, err := region.GetEip(id)
  142. if err != nil {
  143. return nil, err
  144. }
  145. return eip, nil
  146. }
  147. func (region *SRegion) GetIEips() ([]cloudprovider.ICloudEIP, error) {
  148. eips, err := region.GetEips("")
  149. if err != nil {
  150. return nil, err
  151. }
  152. ret := []cloudprovider.ICloudEIP{}
  153. for i := range eips {
  154. eips[i].region = region
  155. ret = append(ret, &eips[i])
  156. }
  157. return ret, nil
  158. }
  159. func (region *SRegion) GetIZones() ([]cloudprovider.ICloudZone, error) {
  160. zones, err := region.GetZones()
  161. if err != nil {
  162. return nil, err
  163. }
  164. ret := []cloudprovider.ICloudZone{}
  165. for i := range zones {
  166. ret = append(ret, &zones[i])
  167. }
  168. return ret, nil
  169. }
  170. func (region *SRegion) GetIZoneById(id string) (cloudprovider.ICloudZone, error) {
  171. zones, err := region.GetIZones()
  172. if err != nil {
  173. return nil, err
  174. }
  175. for i := range zones {
  176. if zones[i].GetId() == id || zones[i].GetGlobalId() == id {
  177. return zones[i], nil
  178. }
  179. }
  180. return nil, errors.Wrapf(cloudprovider.ErrNotFound, "%s", id)
  181. }
  182. func (region *SRegion) getStoragecache() *SStoragecache {
  183. return &SStoragecache{region: region}
  184. }
  185. func (region *SRegion) GetIStoragecaches() ([]cloudprovider.ICloudStoragecache, error) {
  186. return []cloudprovider.ICloudStoragecache{region.getStoragecache()}, nil
  187. }
  188. func (region *SRegion) GetIStoragecacheById(id string) (cloudprovider.ICloudStoragecache, error) {
  189. caches, err := region.GetIStoragecaches()
  190. if err != nil {
  191. return nil, err
  192. }
  193. for i := range caches {
  194. if caches[i].GetGlobalId() == id {
  195. return caches[i], nil
  196. }
  197. }
  198. return nil, cloudprovider.ErrNotFound
  199. }
  200. func (region *SRegion) GetIHostById(id string) (cloudprovider.ICloudHost, error) {
  201. zones, err := region.GetIZones()
  202. if err != nil {
  203. return nil, err
  204. }
  205. for i := 0; i < len(zones); i += 1 {
  206. ihost, err := zones[i].GetIHostById(id)
  207. if err == nil {
  208. return ihost, nil
  209. } else if errors.Cause(err) != cloudprovider.ErrNotFound {
  210. return nil, err
  211. }
  212. }
  213. return nil, cloudprovider.ErrNotFound
  214. }
  215. func (region *SRegion) GetIStorageById(id string) (cloudprovider.ICloudStorage, error) {
  216. zones, err := region.GetIZones()
  217. if err != nil {
  218. return nil, err
  219. }
  220. for i := 0; i < len(zones); i += 1 {
  221. istore, err := zones[i].GetIStorageById(id)
  222. if err == nil {
  223. return istore, nil
  224. } else if errors.Cause(err) != cloudprovider.ErrNotFound {
  225. return nil, err
  226. }
  227. }
  228. return nil, cloudprovider.ErrNotFound
  229. }
  230. func (region *SRegion) GetIHosts() ([]cloudprovider.ICloudHost, error) {
  231. ret := make([]cloudprovider.ICloudHost, 0)
  232. zones, err := region.GetIZones()
  233. if err != nil {
  234. return nil, err
  235. }
  236. for i := 0; i < len(zones); i += 1 {
  237. iZoneHost, err := zones[i].GetIHosts()
  238. if err != nil {
  239. return nil, err
  240. }
  241. ret = append(ret, iZoneHost...)
  242. }
  243. return ret, nil
  244. }
  245. func (region *SRegion) GetIStorages() ([]cloudprovider.ICloudStorage, error) {
  246. ret := make([]cloudprovider.ICloudStorage, 0)
  247. zones, err := region.GetIZones()
  248. if err != nil {
  249. return nil, err
  250. }
  251. for i := 0; i < len(zones); i += 1 {
  252. iZoneStores, err := zones[i].GetIStorages()
  253. if err != nil {
  254. return nil, err
  255. }
  256. ret = append(ret, iZoneStores...)
  257. }
  258. return ret, nil
  259. }
  260. func (region *SRegion) GetIVMs() ([]cloudprovider.ICloudVM, error) {
  261. vms, err := region.GetInstances("", nil)
  262. if err != nil {
  263. return nil, err
  264. }
  265. ret := []cloudprovider.ICloudVM{}
  266. for i := range vms {
  267. ret = append(ret, &vms[i])
  268. }
  269. return ret, nil
  270. }
  271. func (region *SRegion) GetIVMById(id string) (cloudprovider.ICloudVM, error) {
  272. return region.GetInstance(id)
  273. }
  274. func (region *SRegion) GetIDiskById(id string) (cloudprovider.ICloudDisk, error) {
  275. return region.GetDisk(id)
  276. }
  277. func (region *SRegion) bccList(resource string, params url.Values) (jsonutils.JSONObject, error) {
  278. return region.client.bccList(region.RegionId, resource, params)
  279. }
  280. func (region *SRegion) bccPost(resource string, params url.Values, body map[string]interface{}) (jsonutils.JSONObject, error) {
  281. return region.client.bccPost(region.RegionId, resource, params, body)
  282. }
  283. func (region *SRegion) bccDelete(resource string, params url.Values) (jsonutils.JSONObject, error) {
  284. return region.client.bccDelete(region.RegionId, resource, params)
  285. }
  286. func (region *SRegion) bccUpdate(resource string, params url.Values, body map[string]interface{}) (jsonutils.JSONObject, error) {
  287. return region.client.bccUpdate(region.RegionId, resource, params, body)
  288. }
  289. func (region *SRegion) eipList(resource string, params url.Values) (jsonutils.JSONObject, error) {
  290. return region.client.eipList(region.RegionId, resource, params)
  291. }
  292. func (region *SRegion) eipPost(resource string, params url.Values, body map[string]interface{}) (jsonutils.JSONObject, error) {
  293. return region.client.eipPost(region.RegionId, resource, params, body)
  294. }
  295. func (region *SRegion) eipDelete(resource string, params url.Values) (jsonutils.JSONObject, error) {
  296. return region.client.eipDelete(region.RegionId, resource, params)
  297. }
  298. func (region *SRegion) eipUpdate(resource string, params url.Values, body map[string]interface{}) (jsonutils.JSONObject, error) {
  299. return region.client.eipUpdate(region.RegionId, resource, params, body)
  300. }
  301. func (region *SRegion) GetIBuckets() ([]cloudprovider.ICloudBucket, error) {
  302. buckets, err := region.ListBuckets()
  303. if err != nil {
  304. return nil, err
  305. }
  306. ret := []cloudprovider.ICloudBucket{}
  307. for i := range buckets {
  308. if buckets[i].Location != region.GetId() {
  309. continue
  310. }
  311. buckets[i].region = region
  312. ret = append(ret, &buckets[i])
  313. }
  314. return ret, nil
  315. }
  316. func (region *SRegion) CreateIBucket(name string, storageClassStr string, aclStr string) error {
  317. return region.CreateBucket(name, storageClassStr, aclStr)
  318. }
  319. func (region *SRegion) DeleteIBucket(name string) error {
  320. return region.DeleteBucket(name)
  321. }
  322. func (region *SRegion) IBucketExist(name string) (bool, error) {
  323. buckets, err := region.GetIBuckets()
  324. if err != nil {
  325. return false, errors.Wrapf(err, "GetIBuckets")
  326. }
  327. for i := range buckets {
  328. if buckets[i].GetName() == name {
  329. return true, nil
  330. }
  331. }
  332. return false, nil
  333. }
  334. func (region *SRegion) GetIBucketById(name string) (cloudprovider.ICloudBucket, error) {
  335. buckets, err := region.GetIBuckets()
  336. if err != nil {
  337. return nil, errors.Wrapf(err, "GetIBuckets")
  338. }
  339. for i := range buckets {
  340. if buckets[i].GetName() == name {
  341. return buckets[i], nil
  342. }
  343. }
  344. return nil, cloudprovider.ErrNotFound
  345. }
  346. func (region *SRegion) GetIBucketByName(name string) (cloudprovider.ICloudBucket, error) {
  347. return region.GetIBucketById(name)
  348. }