dbinstance.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  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 oceanbase
  15. import (
  16. "context"
  17. "fmt"
  18. "net/url"
  19. "strings"
  20. "time"
  21. "yunion.io/x/jsonutils"
  22. "yunion.io/x/pkg/errors"
  23. billing_api "yunion.io/x/cloudmux/pkg/apis/billing"
  24. api "yunion.io/x/cloudmux/pkg/apis/compute"
  25. "yunion.io/x/cloudmux/pkg/cloudprovider"
  26. "yunion.io/x/cloudmux/pkg/multicloud"
  27. )
  28. type SDBInstance struct {
  29. multicloud.SDBInstanceBase
  30. region *SRegion
  31. AvailableZones []string
  32. DeployMode string
  33. DeployType string
  34. NodeNum int
  35. CreateTime time.Time
  36. Status string
  37. Vpc string
  38. StopTime time.Time
  39. PayType string
  40. CloudProvider string
  41. CPU int
  42. Mem int
  43. CPUArchitecture string
  44. DiskType string
  45. Resource struct {
  46. Cpu struct {
  47. TotalCpu float64
  48. UsedCpu float64
  49. }
  50. Memory struct {
  51. TotalMemory float64
  52. UsedMemory float64
  53. }
  54. Disk struct {
  55. TotalDataSize float64
  56. TotalDiskSize float64
  57. UsedDiskSize float64
  58. }
  59. }
  60. InstanceName string
  61. InstanceId string
  62. InstanceType string
  63. InstanceClass string
  64. SaleChannel string
  65. Series string
  66. StandbyInstanceIds []string
  67. State string
  68. StorageArchitecture string
  69. TagList []string
  70. UsedDiskSize float64
  71. Version string
  72. VpcId string
  73. DiskSize int
  74. Region string
  75. }
  76. func (region *SRegion) GetDBInstances() ([]SDBInstance, error) {
  77. params := url.Values{}
  78. params.Set("pageSize", "10")
  79. pageNum := 1
  80. ret := []SDBInstance{}
  81. for {
  82. params.Set("pageNumber", fmt.Sprintf("%d", pageNum))
  83. resp, err := region.list("/api/v2/instances", params)
  84. if err != nil {
  85. return nil, err
  86. }
  87. part := struct {
  88. Data struct {
  89. DataList []SDBInstance
  90. Total int
  91. }
  92. }{}
  93. err = resp.Unmarshal(&part)
  94. if err != nil {
  95. return nil, err
  96. }
  97. ret = append(ret, part.Data.DataList...)
  98. if len(ret) >= part.Data.Total || len(part.Data.DataList) == 0 {
  99. break
  100. }
  101. pageNum++
  102. }
  103. return ret, nil
  104. }
  105. func (region *SRegion) GetDBInstance(id string) (*SDBInstance, error) {
  106. resp, err := region.list(fmt.Sprintf("/api/v2/instances/%s", id), url.Values{})
  107. if err != nil {
  108. return nil, err
  109. }
  110. dbinstance := &SDBInstance{region: region}
  111. err = resp.Unmarshal(&dbinstance, "data")
  112. if err != nil {
  113. return nil, err
  114. }
  115. return dbinstance, nil
  116. }
  117. func (region *SRegion) DeleteDBInstance(id string) error {
  118. _, err := region.delete("/api/v2/instances", map[string]interface{}{"instanceId": id})
  119. return err
  120. }
  121. func (region *SRegion) StartDBInstance(id string) error {
  122. _, err := region.put(fmt.Sprintf("/api/v2/instances/%s/startCluster", id), nil)
  123. return err
  124. }
  125. func (region *SRegion) StopDBInstance(id string) error {
  126. _, err := region.put(fmt.Sprintf("/api/v2/instances/%s/stopCluster", id), nil)
  127. return err
  128. }
  129. func (rds *SDBInstance) GetGlobalId() string {
  130. return rds.InstanceId
  131. }
  132. func (rds *SDBInstance) GetName() string {
  133. return rds.InstanceName
  134. }
  135. func (rds *SDBInstance) GetStatus() string {
  136. switch rds.Status {
  137. case "ONLINE":
  138. return api.DBINSTANCE_RUNNING
  139. case "PENDING_STOP", "STOPPED", "PENDING_START":
  140. return api.DBINSTANCE_REBOOTING
  141. case "PENDING_DELETE":
  142. return api.DBINSTANCE_DELETING
  143. case "PENDING_CREATE":
  144. return api.DBINSTANCE_DEPLOYING
  145. default:
  146. return api.DBINSTANCE_UNKNOWN
  147. }
  148. }
  149. func (rds *SDBInstance) GetCreatedAt() time.Time {
  150. return rds.CreateTime
  151. }
  152. func (rds *SDBInstance) GetExpiredAt() time.Time {
  153. return time.Time{}
  154. }
  155. func (rds *SDBInstance) GetBillingType() string {
  156. if rds.PayType == "POSTPAY" {
  157. return billing_api.BILLING_TYPE_POSTPAID
  158. }
  159. return billing_api.BILLING_TYPE_PREPAID
  160. }
  161. func (rds *SDBInstance) GetProjectId() string {
  162. return ""
  163. }
  164. // ICloudResource 接口方法
  165. func (rds *SDBInstance) GetId() string {
  166. return rds.InstanceId
  167. }
  168. func (rds *SDBInstance) GetDescription() string {
  169. return ""
  170. }
  171. func (rds *SDBInstance) Refresh() error {
  172. instance, err := rds.region.GetDBInstance(rds.InstanceId)
  173. if err != nil {
  174. return err
  175. }
  176. return jsonutils.Update(rds, instance)
  177. }
  178. func (rds *SDBInstance) GetSysTags() map[string]string {
  179. return map[string]string{}
  180. }
  181. func (rds *SDBInstance) GetTags() (map[string]string, error) {
  182. return map[string]string{}, nil
  183. }
  184. func (rds *SDBInstance) SetTags(tags map[string]string, replace bool) error {
  185. return cloudprovider.ErrNotSupported
  186. }
  187. // 资源相关方法
  188. func (rds *SDBInstance) GetVcpuCount() int {
  189. return rds.CPU
  190. }
  191. func (rds *SDBInstance) GetVmemSizeMB() int {
  192. return rds.Mem * 1024
  193. }
  194. func (rds *SDBInstance) GetDiskSizeGB() int {
  195. return rds.DiskSize
  196. }
  197. func (rds *SDBInstance) GetDiskSizeUsedMB() int {
  198. return int(rds.UsedDiskSize * 1024)
  199. }
  200. func (rds *SDBInstance) GetInstanceType() string {
  201. return rds.InstanceClass
  202. }
  203. // 网络相关方法
  204. func (rds *SDBInstance) GetPort() int {
  205. return 2881 // OceanBase 默认端口
  206. }
  207. func (rds *SDBInstance) GetConnectionStr() string {
  208. return ""
  209. }
  210. func (rds *SDBInstance) GetInternalConnectionStr() string {
  211. return ""
  212. }
  213. func (rds *SDBInstance) GetIVpcId() string {
  214. return rds.VpcId
  215. }
  216. // 可用区相关方法
  217. func (rds *SDBInstance) GetZone1Id() string {
  218. if len(rds.AvailableZones) > 0 {
  219. return fmt.Sprintf("%s-%s", rds.Region, rds.AvailableZones[0])
  220. }
  221. return ""
  222. }
  223. func (rds *SDBInstance) GetZone2Id() string {
  224. if len(rds.AvailableZones) > 1 {
  225. return fmt.Sprintf("%s-%s", rds.Region, rds.AvailableZones[1])
  226. }
  227. return ""
  228. }
  229. func (rds *SDBInstance) GetZone3Id() string {
  230. if len(rds.AvailableZones) > 2 {
  231. return fmt.Sprintf("%s-%s", rds.Region, rds.AvailableZones[2])
  232. }
  233. return ""
  234. }
  235. // 引擎相关方法
  236. func (rds *SDBInstance) GetEngine() string {
  237. return "OceanBase"
  238. }
  239. func (rds *SDBInstance) GetEngineVersion() string {
  240. return rds.Version
  241. }
  242. func (rds *SDBInstance) GetCategory() string {
  243. return strings.ToLower(rds.InstanceType)
  244. }
  245. func (rds *SDBInstance) GetStorageType() string {
  246. return rds.DiskType
  247. }
  248. func (rds *SDBInstance) GetMaintainTime() string {
  249. return ""
  250. }
  251. func (rds *SDBInstance) GetIops() int {
  252. return 0
  253. }
  254. // 操作相关方法
  255. func (rds *SDBInstance) Reboot() error {
  256. return errors.Wrapf(cloudprovider.ErrNotImplemented, "Reboot")
  257. }
  258. func (rds *SDBInstance) Delete() error {
  259. return rds.region.DeleteDBInstance(rds.InstanceId)
  260. }
  261. func (rds *SDBInstance) ChangeConfig(ctx context.Context, config *cloudprovider.SManagedDBInstanceChangeConfig) error {
  262. return errors.Wrapf(cloudprovider.ErrNotImplemented, "ChangeConfig")
  263. }
  264. func (rds *SDBInstance) Update(ctx context.Context, input cloudprovider.SDBInstanceUpdateOptions) error {
  265. return errors.Wrapf(cloudprovider.ErrNotImplemented, "Update")
  266. }
  267. // 管理相关方法
  268. func (rds *SDBInstance) GetMasterInstanceId() string {
  269. return ""
  270. }
  271. func (rds *SDBInstance) GetSecurityGroupIds() ([]string, error) {
  272. return []string{}, nil
  273. }
  274. func (rds *SDBInstance) SetSecurityGroups(ids []string) error {
  275. return errors.Wrapf(cloudprovider.ErrNotImplemented, "SetSecurityGroups")
  276. }
  277. func (rds *SDBInstance) GetDBNetworks() ([]cloudprovider.SDBInstanceNetwork, error) {
  278. return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetDBNetworks")
  279. }
  280. func (rds *SDBInstance) GetIDBInstanceParameters() ([]cloudprovider.ICloudDBInstanceParameter, error) {
  281. return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetIDBInstanceParameters")
  282. }
  283. func (rds *SDBInstance) GetIDBInstanceDatabases() ([]cloudprovider.ICloudDBInstanceDatabase, error) {
  284. return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetIDBInstanceDatabases")
  285. }
  286. func (rds *SDBInstance) GetIDBInstanceAccounts() ([]cloudprovider.ICloudDBInstanceAccount, error) {
  287. return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetIDBInstanceAccounts")
  288. }
  289. func (rds *SDBInstance) GetIDBInstanceBackups() ([]cloudprovider.ICloudDBInstanceBackup, error) {
  290. return nil, errors.Wrapf(cloudprovider.ErrNotImplemented, "GetIDBInstanceBackups")
  291. }
  292. func (rds *SDBInstance) OpenPublicConnection() error {
  293. return errors.Wrapf(cloudprovider.ErrNotImplemented, "OpenPublicConnection")
  294. }
  295. func (rds *SDBInstance) ClosePublicConnection() error {
  296. return errors.Wrapf(cloudprovider.ErrNotImplemented, "ClosePublicConnection")
  297. }
  298. func (rds *SDBInstance) CreateDatabase(conf *cloudprovider.SDBInstanceDatabaseCreateConfig) error {
  299. return errors.Wrapf(cloudprovider.ErrNotImplemented, "CreateDatabase")
  300. }
  301. func (rds *SDBInstance) CreateAccount(conf *cloudprovider.SDBInstanceAccountCreateConfig) error {
  302. return errors.Wrapf(cloudprovider.ErrNotImplemented, "CreateAccount")
  303. }
  304. func (rds *SDBInstance) CreateIBackup(conf *cloudprovider.SDBInstanceBackupCreateConfig) (string, error) {
  305. return "", errors.Wrapf(cloudprovider.ErrNotImplemented, "CreateIBackup")
  306. }
  307. func (rds *SDBInstance) RecoveryFromBackup(conf *cloudprovider.SDBInstanceRecoveryConfig) error {
  308. return errors.Wrapf(cloudprovider.ErrNotImplemented, "RecoveryFromBackup")
  309. }