github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/bms/v1/baremetalservers/requests.go (about) 1 package baremetalservers 2 3 import ( 4 "encoding/base64" 5 6 "github.com/chnsz/golangsdk" 7 "github.com/chnsz/golangsdk/openstack/common/tags" 8 "github.com/chnsz/golangsdk/pagination" 9 ) 10 11 type CreateOpts struct { 12 ImageRef string `json:"imageRef" required:"true"` 13 14 FlavorRef string `json:"flavorRef" required:"true"` 15 16 Name string `json:"name" required:"true"` 17 18 MetaData MetaData `json:"metadata" required:"true"` 19 20 UserData []byte `json:"-"` 21 22 AdminPass string `json:"adminPass,omitempty"` 23 24 KeyName string `json:"key_name,omitempty"` 25 26 SecurityGroups []SecurityGroup `json:"security_groups,omitempty"` 27 28 Nics []Nic `json:"nics" required:"true"` 29 30 AvailabilityZone string `json:"availability_zone" required:"true"` 31 32 VpcId string `json:"vpcid" required:"true"` 33 34 PublicIp *PublicIp `json:"publicip,omitempty"` 35 36 Count int `json:"count,omitempty"` 37 38 RootVolume *RootVolume `json:"root_volume,omitempty"` 39 40 DataVolumes []DataVolume `json:"data_volumes,omitempty"` 41 42 ExtendParam ServerExtendParam `json:"extendparam" required:"true"` 43 44 SchedulerHints *SchedulerHints `json:"os:scheduler_hints,omitempty"` 45 46 ServerTags []tags.ResourceTag `json:"server_tags,omitempty"` 47 } 48 49 type MetaData struct { 50 OpSvcUserId string `json:"op_svc_userid" required:"true"` 51 BYOL string `json:"BYOL,omitempty"` 52 AdminPass string `json:"admin_pass,omitempty"` 53 AgencyName string `json:"agency_name,omitempty"` 54 } 55 56 type SecurityGroup struct { 57 ID string `json:"id" required:"true"` 58 } 59 60 type Nic struct { 61 SubnetId string `json:"subnet_id" required:"true"` 62 IpAddress string `json:"ip_address,omitempty"` 63 } 64 65 type DeleteNic struct { 66 ID string `json:"id" required:"true"` 67 } 68 69 type PublicIp struct { 70 Id string `json:"id,omitempty"` 71 Eip *Eip `json:"eip,omitempty"` 72 } 73 74 type RootVolume struct { 75 VolumeType string `json:"volumetype,omitempty"` 76 Size int `json:"size,omitempty"` 77 ClusterID string `json:"cluster_id,omitempty"` 78 ClusterType string `json:"cluster_type,omitempty"` 79 } 80 81 type DataVolume struct { 82 VolumeType string `json:"volumetype" required:"true"` 83 Size int `json:"size" required:"true"` 84 Shareable bool `json:"shareable,omitempty"` 85 ClusterID string `json:"cluster_id,omitempty"` 86 ClusterType string `json:"cluster_type,omitempty"` 87 } 88 89 type ServerExtendParam struct { 90 ChargingMode string `json:"chargingMode,omitempty"` 91 92 RegionID string `json:"regionID,omitempty"` 93 94 PeriodType string `json:"periodType,omitempty"` 95 96 PeriodNum int `json:"periodNum,omitempty"` 97 98 IsAutoRenew string `json:"isAutoRenew,omitempty"` 99 100 IsAutoPay string `json:"isAutoPay,omitempty"` 101 102 EnterpriseProjectId string `json:"enterprise_project_id,omitempty"` 103 } 104 105 type SchedulerHints struct { 106 DecBaremetal string `json:"dec_baremetal,omitempty"` 107 } 108 109 type Eip struct { 110 IpType string `json:"iptype" required:"true"` 111 BandWidth BandWidth `json:"bandwidth" required:"true"` 112 ExtendParam EipExtendParam `json:"extendparam" required:"true"` 113 } 114 115 type BandWidth struct { 116 Name string `json:"name,omitempty"` 117 ShareType string `json:"sharetype" required:"true"` 118 Id string `json:"id,omitempty"` 119 Size int `json:"size" required:"true"` 120 ChargeMode string `json:"chargemode,omitempty"` 121 } 122 123 type EipExtendParam struct { 124 ChargingMode string `json:"chargingMode" required:"true"` 125 } 126 127 // CreateOptsBuilder allows extensions to add additional parameters to the 128 // Create request. 129 type CreateOptsBuilder interface { 130 ToServerCreateMap() (map[string]interface{}, error) 131 } 132 133 // ToServerCreateMap assembles a request body based on the contents of a 134 // CreateOpts. 135 func (opts CreateOpts) ToServerCreateMap() (map[string]interface{}, error) { 136 b, err := golangsdk.BuildRequestBody(opts, "") 137 if err != nil { 138 return nil, err 139 } 140 141 if opts.UserData != nil { 142 var userData string 143 if _, err := base64.StdEncoding.DecodeString(string(opts.UserData)); err != nil { 144 userData = base64.StdEncoding.EncodeToString(opts.UserData) 145 } else { 146 userData = string(opts.UserData) 147 } 148 b["user_data"] = &userData 149 } 150 151 return map[string]interface{}{"server": b}, nil 152 } 153 154 // CreatePrePaid requests a server to be provisioned to the user in the current tenant. 155 func CreatePrePaid(client *golangsdk.ServiceClient, opts CreateOptsBuilder) (r OrderResult) { 156 reqBody, err := opts.ToServerCreateMap() 157 if err != nil { 158 r.Err = err 159 return 160 } 161 162 _, r.Err = client.Post(createURL(client), reqBody, &r.Body, &golangsdk.RequestOpts{OkCodes: []int{200}}) 163 return 164 } 165 166 // Get retrieves a particular Server based on its unique ID. 167 func Get(c *golangsdk.ServiceClient, id string) (r GetResult) { 168 _, r.Err = c.Get(getURL(c, id), &r.Body, &golangsdk.RequestOpts{ 169 OkCodes: []int{200}, 170 }) 171 return 172 } 173 174 type UpdateOpts struct { 175 Name string `json:"name,omitempty"` 176 } 177 178 type ListOpts struct { 179 // Specifies the ID of the BMS flavor. 180 FlavorId string `q:"flavor"` 181 // Specifies the BMS name. 182 Name string `q:"name"` 183 // Specifies the BMS status. 184 // The value can be: ACTIVE, BUILD, ERROR, HARD_REBOOT, REBOOT or SHUTOFF. 185 Status string `q:"status"` 186 // Number of records to be queried. 187 // The valid value is range from 25 to 1000, defaults to 25. 188 Limit int `q:"limit"` 189 // Specifies the index position, which starts from the next data record specified by offset. 190 Offset int `q:"offset"` 191 // Specifies the BMS tag. 192 Tags string `q:"tags"` 193 // Specifies the reserved ID, which can be used to query BMSs created in a batch. 194 ReservationId string `q:"reservation_id"` 195 // Specifies the level for details about BMS query results. 196 // A higher level indicates more details about BMS query results. 197 // Available levels include 4, 3, 2, and 1. The default level is 4. 198 Detail string `q:"detail"` 199 // Specifies the enterprise project ID of the BMS instance. 200 EnterpriseProjectId string `q:"enterprise_project_id"` 201 } 202 203 // List is a method to query the list of BMS instances with **pagination**. 204 func List(client *golangsdk.ServiceClient, opts ListOpts) ([]CloudServer, error) { 205 url := listURL(client) 206 query, err := golangsdk.BuildQueryString(opts) 207 if err != nil { 208 return nil, err 209 } 210 url += query.String() 211 212 pages, err := pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { 213 p := InstanceDetailPage{pagination.OffsetPageBase{PageResult: r}} 214 return p 215 }).AllPages() 216 if err != nil { 217 return nil, err 218 } 219 return ExtractServers(pages) 220 } 221 222 type DeleteNicsOpts struct { 223 Nics []DeleteNic `json:"nics" required:"true"` 224 } 225 226 type AddNicsOpts struct { 227 Nics []Nic `json:"nics" required:"true"` 228 } 229 230 type UpdateOptsBuilder interface { 231 ToServerUpdateMap() (map[string]interface{}, error) 232 } 233 234 type DeleteNicsOptsBuilder interface { 235 ToServerDeleteNicsMap() (map[string]interface{}, error) 236 } 237 238 type AddNicsOptsBuilder interface { 239 ToServerAddNicsMap() (map[string]interface{}, error) 240 } 241 242 func (opts StopServerOps) ToServerStopServerMap() (map[string]interface{}, error) { 243 return golangsdk.BuildRequestBody(opts, "os-stop") 244 } 245 246 func (opts StartServerOps) ToServerStartServerMap() (map[string]interface{}, error) { 247 return golangsdk.BuildRequestBody(opts, "os-start") 248 } 249 250 func (opts RebootServerOps) ToServerRebootServerMap() (map[string]interface{}, error) { 251 return golangsdk.BuildRequestBody(opts, "reboot") 252 } 253 254 type StartServerOps struct { 255 Servers []Servers `json:"servers" required:"true"` 256 } 257 258 type StopServerOps struct { 259 // The value can be: HARD and SOFT. Only HARD takes effect. 260 Type string `json:"type" required:"true"` 261 Servers []Servers `json:"servers" required:"true"` 262 } 263 264 type RebootServerOps struct { 265 // The value can be: HARD and SOFT. Only HARD takes effect. 266 Type string `json:"type" required:"true"` 267 Servers []Servers `json:"servers" required:"true"` 268 } 269 270 type Servers struct { 271 ID string `json:"id" required:"true"` 272 } 273 274 type RebootServerOpsBuilder interface { 275 ToServerRebootServerMap() (map[string]interface{}, error) 276 } 277 278 type StartServerOpsBuilder interface { 279 ToServerStartServerMap() (map[string]interface{}, error) 280 } 281 282 type StopServerOpsBuilder interface { 283 ToServerStopServerMap() (map[string]interface{}, error) 284 } 285 286 func (opts UpdateOpts) ToServerUpdateMap() (map[string]interface{}, error) { 287 b, err := golangsdk.BuildRequestBody(opts, "") 288 if err != nil { 289 return nil, err 290 } 291 292 return map[string]interface{}{"server": b}, nil 293 } 294 295 func Update(client *golangsdk.ServiceClient, id string, ops UpdateOptsBuilder) (r UpdateResult) { 296 b, err := ops.ToServerUpdateMap() 297 if err != nil { 298 r.Err = err 299 return 300 } 301 302 _, r.Err = client.Put(putURL(client, id), b, nil, &golangsdk.RequestOpts{ 303 OkCodes: []int{200}, 304 }) 305 return 306 } 307 308 // UpdateMetadata updates (or creates) all the metadata specified by opts for 309 // the given server ID. This operation does not affect already-existing metadata 310 // that is not specified by opts. 311 func UpdateMetadata(client *golangsdk.ServiceClient, id string, opts map[string]interface{}) (r UpdateMetadataResult) { 312 b := map[string]interface{}{"metadata": opts} 313 _, r.Err = client.Post(metadataURL(client, id), b, &r.Body, nil) 314 return 315 } 316 317 func (opts DeleteNicsOpts) ToServerDeleteNicsMap() (map[string]interface{}, error) { 318 return golangsdk.BuildRequestBody(opts, "") 319 } 320 321 func (opts AddNicsOpts) ToServerAddNicsMap() (map[string]interface{}, error) { 322 return golangsdk.BuildRequestBody(opts, "") 323 } 324 325 func DeleteNics(client *golangsdk.ServiceClient, id string, ops DeleteNicsOptsBuilder) (r JobResult) { 326 reqBody, err := ops.ToServerDeleteNicsMap() 327 if err != nil { 328 r.Err = err 329 return 330 } 331 332 _, r.Err = client.Post(deleteNicsURL(client, id), reqBody, &r.Body, nil) 333 return 334 } 335 336 func AddNics(client *golangsdk.ServiceClient, id string, ops AddNicsOptsBuilder) (r JobResult) { 337 reqBody, err := ops.ToServerAddNicsMap() 338 if err != nil { 339 r.Err = err 340 return 341 } 342 343 _, r.Err = client.Post(addNicsURL(client, id), reqBody, &r.Body, nil) 344 return 345 } 346 347 func GetJobDetail(client *golangsdk.ServiceClient, jobID string) (r JobResult) { 348 _, r.Err = client.Get(jobURL(client, jobID), &r.Body, nil) 349 return 350 } 351 352 func RebootServer(client *golangsdk.ServiceClient, ops RebootServerOpsBuilder) (r JobResult) { 353 reqBody, err := ops.ToServerRebootServerMap() 354 if err != nil { 355 r.Err = err 356 return 357 } 358 359 _, r.Err = client.Post(serverStatusPostURL(client), reqBody, &r.Body, nil) 360 return 361 } 362 363 func StartServer(client *golangsdk.ServiceClient, ops StartServerOpsBuilder) (r JobResult) { 364 reqBody, err := ops.ToServerStartServerMap() 365 if err != nil { 366 r.Err = err 367 return 368 } 369 370 _, r.Err = client.Post(serverStatusPostURL(client), reqBody, &r.Body, nil) 371 return 372 } 373 374 func StopServer(client *golangsdk.ServiceClient, ops StopServerOpsBuilder) (r JobResult) { 375 reqBody, err := ops.ToServerStopServerMap() 376 if err != nil { 377 r.Err = err 378 return 379 } 380 381 _, r.Err = client.Post(serverStatusPostURL(client), reqBody, &r.Body, nil) 382 return 383 }