github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/opengauss/v3/instances/requests.go (about) 1 package instances 2 3 import ( 4 "fmt" 5 6 "github.com/chnsz/golangsdk" 7 "github.com/chnsz/golangsdk/pagination" 8 ) 9 10 type DataStoreOpt struct { 11 Type string `json:"type" required:"true"` 12 Version string `json:"version,omitempty"` 13 } 14 15 type BackupStrategyOpt struct { 16 StartTime string `json:"start_time" required:"true"` 17 KeepDays int `json:"keep_days,omitempty"` 18 } 19 20 type HaOpt struct { 21 Mode string `json:"mode" required:"true"` 22 ReplicationMode string `json:"replication_mode" required:"true"` 23 Consistency string `json:"consistency,omitempty"` 24 } 25 26 type VolumeOpt struct { 27 Type string `json:"type" required:"true"` 28 Size int `json:"size" required:"true"` 29 } 30 31 type RestorePointOpt struct { 32 InstanceId string `json:"instance_id" required:"true"` 33 Type string `json:"type" required:"true"` 34 BackupId string `json:"backup_id,omitempty"` 35 RestoreTime int `json:"restore_time,omitempty"` 36 DatabaseName map[string]string `json:"database_name,omitempty"` 37 } 38 39 type ChargeInfo struct { 40 ChargeMode string `json:"charge_mode" required:"true"` 41 PeriodType string `json:"period_type,omitempty"` 42 PeriodNum int `json:"period_num,omitempty"` 43 IsAutoRenew string `json:"is_auto_renew,omitempty"` 44 IsAutoPay string `json:"is_auto_pay,omitempty"` 45 } 46 47 type CreateGaussDBOpts struct { 48 Ha *HaOpt `json:"ha,omitempty"` 49 BackupStrategy *BackupStrategyOpt `json:"backup_strategy,omitempty"` 50 ChargeInfo *ChargeInfo `json:"charge_info,omitempty"` 51 RestorePoint *RestorePointOpt `json:"restore_point,omitempty"` 52 53 AvailabilityZone string `json:"availability_zone" required:"true"` 54 DataStore DataStoreOpt `json:"datastore" required:"true"` 55 Flavor string `json:"flavor_ref" required:"true"` 56 Name string `json:"name" required:"true"` 57 Password string `json:"password" required:"true"` 58 Volume VolumeOpt `json:"volume" required:"true"` 59 Region string `json:"region,omitempty"` 60 VpcId string `json:"vpc_id,omitempty"` 61 SubnetId string `json:"subnet_id,omitempty"` 62 SecurityGroupId string `json:"security_group_id,omitempty"` 63 Port string `json:"port,omitempty"` 64 DiskEncryptionId string `json:"disk_encryption_id,omitempty"` 65 TimeZone string `json:"time_zone,omitempty"` 66 ConfigurationId string `json:"configuration_id,omitempty"` 67 DsspoolId string `json:"dsspool_id,omitempty"` 68 ReplicaOfId string `json:"replica_of_id,omitempty"` 69 ShardingNum int `json:"sharding_num,omitempty"` 70 CoordinatorNum int `json:"coordinator_num,omitempty"` 71 EnterpriseProjectId string `json:"enterprise_project_id,omitempty"` 72 ReplicaNum int `json:"replica_num,omitempty"` 73 } 74 75 type CreateGaussDBBuilder interface { 76 ToInstancesCreateMap() (map[string]interface{}, error) 77 } 78 79 func (opts CreateGaussDBOpts) ToInstancesCreateMap() (map[string]interface{}, error) { 80 b, err := golangsdk.BuildRequestBody(opts, "") 81 if err != nil { 82 return nil, err 83 } 84 return b, nil 85 } 86 87 func Create(client *golangsdk.ServiceClient, opts CreateGaussDBBuilder) (r CreateResult) { 88 b, err := opts.ToInstancesCreateMap() 89 if err != nil { 90 r.Err = err 91 return 92 } 93 94 _, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{ 95 MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, 96 }) 97 return 98 } 99 100 type UpdateVolumeOptsBuilder interface { 101 ToVolumeUpdateMap() (map[string]interface{}, error) 102 } 103 104 type UpdateVolumeOpts struct { 105 Size int `json:"size" required:"true"` 106 } 107 108 func (opts UpdateVolumeOpts) ToVolumeUpdateMap() (map[string]interface{}, error) { 109 return golangsdk.BuildRequestBody(opts, "enlarge_volume") 110 } 111 112 func UpdateVolume(client *golangsdk.ServiceClient, opts UpdateVolumeOptsBuilder, id string) (r UpdateResult) { 113 b, err := opts.ToVolumeUpdateMap() 114 if err != nil { 115 r.Err = err 116 return 117 } 118 119 _, r.Err = client.Post(updateURL(client, id, "action"), b, &r.Body, &golangsdk.RequestOpts{ 120 MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, 121 }) 122 return 123 } 124 125 type UpdateClusterOptsBuilder interface { 126 ToClusterUpdateMap() (map[string]interface{}, error) 127 } 128 129 type Shard struct { 130 Count int `json:"count" required:"true"` 131 } 132 133 type Coordinator struct { 134 AzCode string `json:"az_code" required:"true"` 135 } 136 137 type UpdateClusterOpts struct { 138 Shard *Shard `json:"shard,omitempty"` 139 Coordinators []Coordinator `json:"coordinators,omitempty"` 140 } 141 142 func (opts UpdateClusterOpts) ToClusterUpdateMap() (map[string]interface{}, error) { 143 return golangsdk.BuildRequestBody(opts, "expand_cluster") 144 } 145 146 func UpdateCluster(client *golangsdk.ServiceClient, opts UpdateClusterOptsBuilder, id string) (r UpdateResult) { 147 b, err := opts.ToClusterUpdateMap() 148 if err != nil { 149 r.Err = err 150 return 151 } 152 153 _, r.Err = client.Post(updateURL(client, id, "action"), b, &r.Body, &golangsdk.RequestOpts{ 154 MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, 155 }) 156 return 157 } 158 159 // UpdateOpts is the structure that used to expand sharding number, coordinator number or volume size. 160 type UpdateOpts struct { 161 // Configuration required to expand sharding number or coordinator number. 162 ExpandCluster *UpdateClusterOpts `json:"expand_cluster,omitempty"` 163 // Configuration required to expand volume size. 164 EnlargeVolume *UpdateVolumeOpts `json:"enlarge_volume,omitempty"` 165 // Whether to automatically pay from the account, defaults to false. 166 IsAutoPay string `json:"is_auto_pay,omitempty"` 167 } 168 169 // Update is a method to update sharding number, coordinator number and volume configuration. 170 // Note: The sharding number and the coordinator number can be updated at the same time, but neither of them can be 171 // updated at the same time as volume 172 func Update(c *golangsdk.ServiceClient, instanceId string, opts UpdateOpts) (*UpdateResponse, error) { 173 b, err := golangsdk.BuildRequestBody(opts, "") 174 if err != nil { 175 return nil, err 176 } 177 178 var r UpdateResponse 179 _, err = c.Post(updateURL(c, instanceId, "action"), b, &r, &golangsdk.RequestOpts{ 180 MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, 181 }) 182 return &r, err 183 } 184 185 func Delete(client *golangsdk.ServiceClient, instanceId string) (r DeleteResult) { 186 url := deleteURL(client, instanceId) 187 188 _, r.Err = client.Delete(url, &golangsdk.RequestOpts{ 189 MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, 190 }) 191 192 return 193 } 194 195 type ListGaussDBInstanceOpts struct { 196 Id string `q:"id"` 197 Name string `q:"name"` 198 Type string `q:"type"` 199 DataStoreType string `q:"datastore_type"` 200 VpcId string `q:"vpc_id"` 201 SubnetId string `q:"subnet_id"` 202 Offset int `q:"offset"` 203 Limit int `q:"limit"` 204 } 205 206 type ListGaussDBBuilder interface { 207 ToGaussDBListDetailQuery() (string, error) 208 } 209 210 func (opts ListGaussDBInstanceOpts) ToGaussDBListDetailQuery() (string, error) { 211 q, err := golangsdk.BuildQueryString(opts) 212 if err != nil { 213 return "", err 214 } 215 return q.String(), err 216 } 217 218 func List(client *golangsdk.ServiceClient, opts ListGaussDBBuilder) pagination.Pager { 219 url := listURL(client) 220 if opts != nil { 221 query, err := opts.ToGaussDBListDetailQuery() 222 223 if err != nil { 224 return pagination.Pager{Err: err} 225 } 226 url += query 227 } 228 229 pageList := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { 230 return GaussDBPage{pagination.SinglePageBase(r)} 231 }) 232 // Headers supplies additional HTTP headers to populate on each paged request 233 pageList.Headers = map[string]string{"Content-Type": "application/json"} 234 235 return pageList 236 } 237 238 func GetInstanceByID(client *golangsdk.ServiceClient, instanceId string) (GaussDBInstance, error) { 239 var instance GaussDBInstance 240 241 opts := ListGaussDBInstanceOpts{ 242 Id: instanceId, 243 } 244 245 pages, err := List(client, &opts).AllPages() 246 if err != nil { 247 return instance, err 248 } 249 250 all, err := ExtractGaussDBInstances(pages) 251 if err != nil { 252 return instance, err 253 } 254 if all.TotalCount < 1 { 255 return instance, golangsdk.ErrDefault404{ 256 ErrUnexpectedResponseCode: golangsdk.ErrUnexpectedResponseCode{ 257 Body: []byte(fmt.Sprintf("the database instance (%s) does not exist", instanceId)), 258 }, 259 } 260 } 261 262 instance = all.Instances[0] 263 return instance, nil 264 } 265 266 func GetInstanceByName(client *golangsdk.ServiceClient, name string) (GaussDBInstance, error) { 267 var instance GaussDBInstance 268 269 opts := ListGaussDBInstanceOpts{ 270 Name: name, 271 } 272 273 pages, err := List(client, &opts).AllPages() 274 if err != nil { 275 return instance, err 276 } 277 278 all, err := ExtractGaussDBInstances(pages) 279 if err != nil { 280 return instance, err 281 } 282 if all.TotalCount < 1 { 283 return instance, golangsdk.ErrDefault404{ 284 ErrUnexpectedResponseCode: golangsdk.ErrUnexpectedResponseCode{ 285 Body: []byte(fmt.Sprintf("the database instance (%s) does not exist", name)), 286 }, 287 } 288 } 289 290 instance = all.Instances[0] 291 return instance, nil 292 } 293 294 type RenameOptsBuilder interface { 295 ToRenameMap() (map[string]interface{}, error) 296 } 297 298 type RenameOpts struct { 299 Name string `json:"name" required:"true"` 300 } 301 302 func (opts RenameOpts) ToRenameMap() (map[string]interface{}, error) { 303 return golangsdk.BuildRequestBody(opts, "") 304 } 305 306 func Rename(client *golangsdk.ServiceClient, opts RenameOptsBuilder, id string) (r RenameResult) { 307 b, err := opts.ToRenameMap() 308 if err != nil { 309 r.Err = err 310 return 311 } 312 313 _, r.Err = client.Put(updateURL(client, id, "name"), b, &r.Body, &golangsdk.RequestOpts{ 314 MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, 315 }) 316 return 317 } 318 319 type RestorePasswordOptsBuilder interface { 320 ToRestorePasswordMap() (map[string]interface{}, error) 321 } 322 323 type RestorePasswordOpts struct { 324 Password string `json:"password" required:"true"` 325 } 326 327 func (opts RestorePasswordOpts) ToRestorePasswordMap() (map[string]interface{}, error) { 328 return golangsdk.BuildRequestBody(opts, "") 329 } 330 331 func RestorePassword(client *golangsdk.ServiceClient, opts RestorePasswordOptsBuilder, id string) (r golangsdk.Result) { 332 b, err := opts.ToRestorePasswordMap() 333 if err != nil { 334 r.Err = err 335 return 336 } 337 338 _, r.Err = client.Post(updateURL(client, id, "password"), b, nil, &golangsdk.RequestOpts{ 339 MoreHeaders: map[string]string{"Content-Type": "application/json", "X-Language": "en-us"}, 340 }) 341 return 342 }