1// This file was automatically generated. DO NOT EDIT. 2// If you have any remark or suggestion do not hesitate to open an issue. 3 4// Package baremetal provides methods and message types of the baremetal v1 API. 5package baremetal 6 7import ( 8 "bytes" 9 "encoding/json" 10 "fmt" 11 "net" 12 "net/http" 13 "net/url" 14 "strings" 15 "time" 16 17 "github.com/scaleway/scaleway-sdk-go/internal/errors" 18 "github.com/scaleway/scaleway-sdk-go/internal/marshaler" 19 "github.com/scaleway/scaleway-sdk-go/internal/parameter" 20 "github.com/scaleway/scaleway-sdk-go/namegenerator" 21 "github.com/scaleway/scaleway-sdk-go/scw" 22) 23 24// always import dependencies 25var ( 26 _ fmt.Stringer 27 _ json.Unmarshaler 28 _ url.URL 29 _ net.IP 30 _ http.Header 31 _ bytes.Reader 32 _ time.Time 33 _ = strings.Join 34 35 _ scw.ScalewayRequest 36 _ marshaler.Duration 37 _ scw.File 38 _ = parameter.AddToQuery 39 _ = namegenerator.GetRandomName 40) 41 42// API: this API allows to manage your Bare metal server 43type API struct { 44 client *scw.Client 45} 46 47// NewAPI returns a API object from a Scaleway client. 48func NewAPI(client *scw.Client) *API { 49 return &API{ 50 client: client, 51 } 52} 53 54type IPReverseStatus string 55 56const ( 57 // IPReverseStatusUnknown is [insert doc]. 58 IPReverseStatusUnknown = IPReverseStatus("unknown") 59 // IPReverseStatusPending is [insert doc]. 60 IPReverseStatusPending = IPReverseStatus("pending") 61 // IPReverseStatusActive is [insert doc]. 62 IPReverseStatusActive = IPReverseStatus("active") 63 // IPReverseStatusError is [insert doc]. 64 IPReverseStatusError = IPReverseStatus("error") 65) 66 67func (enum IPReverseStatus) String() string { 68 if enum == "" { 69 // return default value if empty 70 return "unknown" 71 } 72 return string(enum) 73} 74 75func (enum IPReverseStatus) MarshalJSON() ([]byte, error) { 76 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 77} 78 79func (enum *IPReverseStatus) UnmarshalJSON(data []byte) error { 80 tmp := "" 81 82 if err := json.Unmarshal(data, &tmp); err != nil { 83 return err 84 } 85 86 *enum = IPReverseStatus(IPReverseStatus(tmp).String()) 87 return nil 88} 89 90type IPVersion string 91 92const ( 93 // IPVersionIPv4 is [insert doc]. 94 IPVersionIPv4 = IPVersion("IPv4") 95 // IPVersionIPv6 is [insert doc]. 96 IPVersionIPv6 = IPVersion("IPv6") 97) 98 99func (enum IPVersion) String() string { 100 if enum == "" { 101 // return default value if empty 102 return "IPv4" 103 } 104 return string(enum) 105} 106 107func (enum IPVersion) MarshalJSON() ([]byte, error) { 108 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 109} 110 111func (enum *IPVersion) UnmarshalJSON(data []byte) error { 112 tmp := "" 113 114 if err := json.Unmarshal(data, &tmp); err != nil { 115 return err 116 } 117 118 *enum = IPVersion(IPVersion(tmp).String()) 119 return nil 120} 121 122type ListServerEventsRequestOrderBy string 123 124const ( 125 // ListServerEventsRequestOrderByCreatedAtAsc is [insert doc]. 126 ListServerEventsRequestOrderByCreatedAtAsc = ListServerEventsRequestOrderBy("created_at_asc") 127 // ListServerEventsRequestOrderByCreatedAtDesc is [insert doc]. 128 ListServerEventsRequestOrderByCreatedAtDesc = ListServerEventsRequestOrderBy("created_at_desc") 129) 130 131func (enum ListServerEventsRequestOrderBy) String() string { 132 if enum == "" { 133 // return default value if empty 134 return "created_at_asc" 135 } 136 return string(enum) 137} 138 139func (enum ListServerEventsRequestOrderBy) MarshalJSON() ([]byte, error) { 140 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 141} 142 143func (enum *ListServerEventsRequestOrderBy) UnmarshalJSON(data []byte) error { 144 tmp := "" 145 146 if err := json.Unmarshal(data, &tmp); err != nil { 147 return err 148 } 149 150 *enum = ListServerEventsRequestOrderBy(ListServerEventsRequestOrderBy(tmp).String()) 151 return nil 152} 153 154type ListServersRequestOrderBy string 155 156const ( 157 // ListServersRequestOrderByCreatedAtAsc is [insert doc]. 158 ListServersRequestOrderByCreatedAtAsc = ListServersRequestOrderBy("created_at_asc") 159 // ListServersRequestOrderByCreatedAtDesc is [insert doc]. 160 ListServersRequestOrderByCreatedAtDesc = ListServersRequestOrderBy("created_at_desc") 161) 162 163func (enum ListServersRequestOrderBy) String() string { 164 if enum == "" { 165 // return default value if empty 166 return "created_at_asc" 167 } 168 return string(enum) 169} 170 171func (enum ListServersRequestOrderBy) MarshalJSON() ([]byte, error) { 172 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 173} 174 175func (enum *ListServersRequestOrderBy) UnmarshalJSON(data []byte) error { 176 tmp := "" 177 178 if err := json.Unmarshal(data, &tmp); err != nil { 179 return err 180 } 181 182 *enum = ListServersRequestOrderBy(ListServersRequestOrderBy(tmp).String()) 183 return nil 184} 185 186type OfferStock string 187 188const ( 189 // OfferStockEmpty is [insert doc]. 190 OfferStockEmpty = OfferStock("empty") 191 // OfferStockLow is [insert doc]. 192 OfferStockLow = OfferStock("low") 193 // OfferStockAvailable is [insert doc]. 194 OfferStockAvailable = OfferStock("available") 195) 196 197func (enum OfferStock) String() string { 198 if enum == "" { 199 // return default value if empty 200 return "empty" 201 } 202 return string(enum) 203} 204 205func (enum OfferStock) MarshalJSON() ([]byte, error) { 206 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 207} 208 209func (enum *OfferStock) UnmarshalJSON(data []byte) error { 210 tmp := "" 211 212 if err := json.Unmarshal(data, &tmp); err != nil { 213 return err 214 } 215 216 *enum = OfferStock(OfferStock(tmp).String()) 217 return nil 218} 219 220type ServerBootType string 221 222const ( 223 // ServerBootTypeUnknownBootType is [insert doc]. 224 ServerBootTypeUnknownBootType = ServerBootType("unknown_boot_type") 225 // ServerBootTypeNormal is [insert doc]. 226 ServerBootTypeNormal = ServerBootType("normal") 227 // ServerBootTypeRescue is [insert doc]. 228 ServerBootTypeRescue = ServerBootType("rescue") 229) 230 231func (enum ServerBootType) String() string { 232 if enum == "" { 233 // return default value if empty 234 return "unknown_boot_type" 235 } 236 return string(enum) 237} 238 239func (enum ServerBootType) MarshalJSON() ([]byte, error) { 240 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 241} 242 243func (enum *ServerBootType) UnmarshalJSON(data []byte) error { 244 tmp := "" 245 246 if err := json.Unmarshal(data, &tmp); err != nil { 247 return err 248 } 249 250 *enum = ServerBootType(ServerBootType(tmp).String()) 251 return nil 252} 253 254type ServerInstallStatus string 255 256const ( 257 // ServerInstallStatusUnknown is [insert doc]. 258 ServerInstallStatusUnknown = ServerInstallStatus("unknown") 259 // ServerInstallStatusToInstall is [insert doc]. 260 ServerInstallStatusToInstall = ServerInstallStatus("to_install") 261 // ServerInstallStatusInstalling is [insert doc]. 262 ServerInstallStatusInstalling = ServerInstallStatus("installing") 263 // ServerInstallStatusCompleted is [insert doc]. 264 ServerInstallStatusCompleted = ServerInstallStatus("completed") 265 // ServerInstallStatusError is [insert doc]. 266 ServerInstallStatusError = ServerInstallStatus("error") 267) 268 269func (enum ServerInstallStatus) String() string { 270 if enum == "" { 271 // return default value if empty 272 return "unknown" 273 } 274 return string(enum) 275} 276 277func (enum ServerInstallStatus) MarshalJSON() ([]byte, error) { 278 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 279} 280 281func (enum *ServerInstallStatus) UnmarshalJSON(data []byte) error { 282 tmp := "" 283 284 if err := json.Unmarshal(data, &tmp); err != nil { 285 return err 286 } 287 288 *enum = ServerInstallStatus(ServerInstallStatus(tmp).String()) 289 return nil 290} 291 292type ServerPingStatus string 293 294const ( 295 // ServerPingStatusPingStatusUnknown is [insert doc]. 296 ServerPingStatusPingStatusUnknown = ServerPingStatus("ping_status_unknown") 297 // ServerPingStatusPingStatusUp is [insert doc]. 298 ServerPingStatusPingStatusUp = ServerPingStatus("ping_status_up") 299 // ServerPingStatusPingStatusDown is [insert doc]. 300 ServerPingStatusPingStatusDown = ServerPingStatus("ping_status_down") 301) 302 303func (enum ServerPingStatus) String() string { 304 if enum == "" { 305 // return default value if empty 306 return "ping_status_unknown" 307 } 308 return string(enum) 309} 310 311func (enum ServerPingStatus) MarshalJSON() ([]byte, error) { 312 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 313} 314 315func (enum *ServerPingStatus) UnmarshalJSON(data []byte) error { 316 tmp := "" 317 318 if err := json.Unmarshal(data, &tmp); err != nil { 319 return err 320 } 321 322 *enum = ServerPingStatus(ServerPingStatus(tmp).String()) 323 return nil 324} 325 326type ServerStatus string 327 328const ( 329 // ServerStatusUnknown is [insert doc]. 330 ServerStatusUnknown = ServerStatus("unknown") 331 // ServerStatusDelivering is [insert doc]. 332 ServerStatusDelivering = ServerStatus("delivering") 333 // ServerStatusReady is [insert doc]. 334 ServerStatusReady = ServerStatus("ready") 335 // ServerStatusStopping is [insert doc]. 336 ServerStatusStopping = ServerStatus("stopping") 337 // ServerStatusStopped is [insert doc]. 338 ServerStatusStopped = ServerStatus("stopped") 339 // ServerStatusStarting is [insert doc]. 340 ServerStatusStarting = ServerStatus("starting") 341 // ServerStatusError is [insert doc]. 342 ServerStatusError = ServerStatus("error") 343 // ServerStatusDeleting is [insert doc]. 344 ServerStatusDeleting = ServerStatus("deleting") 345 // ServerStatusLocked is [insert doc]. 346 ServerStatusLocked = ServerStatus("locked") 347 // ServerStatusOutOfStock is [insert doc]. 348 ServerStatusOutOfStock = ServerStatus("out_of_stock") 349) 350 351func (enum ServerStatus) String() string { 352 if enum == "" { 353 // return default value if empty 354 return "unknown" 355 } 356 return string(enum) 357} 358 359func (enum ServerStatus) MarshalJSON() ([]byte, error) { 360 return []byte(fmt.Sprintf(`"%s"`, enum)), nil 361} 362 363func (enum *ServerStatus) UnmarshalJSON(data []byte) error { 364 tmp := "" 365 366 if err := json.Unmarshal(data, &tmp); err != nil { 367 return err 368 } 369 370 *enum = ServerStatus(ServerStatus(tmp).String()) 371 return nil 372} 373 374// BMCAccess: bmc access 375type BMCAccess struct { 376 // URL: URL to access to the server console 377 URL string `json:"url"` 378 // Login: the login to use for the BMC (Baseboard Management Controller) access authentification 379 Login string `json:"login"` 380 // Password: the password to use for the BMC (Baseboard Management Controller) access authentification 381 Password string `json:"password"` 382 // ExpiresAt: the date after which the BMC (Baseboard Management Controller) access will be closed 383 ExpiresAt *time.Time `json:"expires_at"` 384} 385 386// CPU: cpu 387type CPU struct { 388 // Name: name of the CPU 389 Name string `json:"name"` 390 // CoreCount: number of cores of the CPU 391 CoreCount uint32 `json:"core_count"` 392 // ThreadCount: number of threads of the CPU 393 ThreadCount uint32 `json:"thread_count"` 394 395 Frequency uint32 `json:"frequency"` 396} 397 398type CreateServerRequestInstall struct { 399 OsID string `json:"os_id"` 400 401 Hostname string `json:"hostname"` 402 403 SSHKeyIDs []string `json:"ssh_key_ids"` 404} 405 406// Disk: disk 407type Disk struct { 408 // Capacity: capacity of the disk in bytes 409 Capacity scw.Size `json:"capacity"` 410 // Type: type of the disk 411 Type string `json:"type"` 412} 413 414// GetServerMetricsResponse: get server metrics response 415type GetServerMetricsResponse struct { 416 // Pings: timeseries of ping on the server 417 Pings *scw.TimeSeries `json:"pings"` 418} 419 420// IP: ip 421type IP struct { 422 // ID: ID of the IP 423 ID string `json:"id"` 424 // Address: address of the IP 425 Address net.IP `json:"address"` 426 // Reverse: reverse IP value 427 Reverse string `json:"reverse"` 428 // Version: version of IP (v4 or v6) 429 // 430 // Default value: IPv4 431 Version IPVersion `json:"version"` 432 // ReverseStatus: status of the reverse 433 // 434 // Default value: unknown 435 ReverseStatus IPReverseStatus `json:"reverse_status"` 436 // ReverseStatusMessage: a message related to the reverse status, in case of an error for example 437 ReverseStatusMessage string `json:"reverse_status_message"` 438} 439 440// ListOSResponse: list os response 441type ListOSResponse struct { 442 // TotalCount: total count of matching OS 443 TotalCount uint32 `json:"total_count"` 444 // Os: oS that match filters 445 Os []*OS `json:"os"` 446} 447 448// ListOffersResponse: list offers response 449type ListOffersResponse struct { 450 // TotalCount: total count of matching offers 451 TotalCount uint32 `json:"total_count"` 452 // Offers: offers that match filters 453 Offers []*Offer `json:"offers"` 454} 455 456// ListServerEventsResponse: list server events response 457type ListServerEventsResponse struct { 458 // TotalCount: total count of matching events 459 TotalCount uint32 `json:"total_count"` 460 // Events: server events that match filters 461 Events []*ServerEvent `json:"events"` 462} 463 464// ListServersResponse: list servers response 465type ListServersResponse struct { 466 // TotalCount: total count of matching servers 467 TotalCount uint32 `json:"total_count"` 468 // Servers: servers that match filters 469 Servers []*Server `json:"servers"` 470} 471 472// Memory: memory 473type Memory struct { 474 Capacity scw.Size `json:"capacity"` 475 476 Type string `json:"type"` 477 478 Frequency uint32 `json:"frequency"` 479 480 IsEcc bool `json:"is_ecc"` 481} 482 483// OS: os 484type OS struct { 485 // ID: ID of the OS 486 ID string `json:"id"` 487 // Name: name of the OS 488 Name string `json:"name"` 489 // Version: version of the OS 490 Version string `json:"version"` 491} 492 493// Offer: offer 494type Offer struct { 495 // ID: ID of the offer 496 ID string `json:"id"` 497 // Name: name of the offer 498 Name string `json:"name"` 499 // Stock: stock level 500 // 501 // Default value: empty 502 Stock OfferStock `json:"stock"` 503 // Bandwidth: bandwidth available in bits/s with the offer 504 Bandwidth uint64 `json:"bandwidth"` 505 // CommercialRange: commercial range of the offer 506 CommercialRange string `json:"commercial_range"` 507 // PricePerHour: price of the offer for the next 60 minutes (a server order at 11h32 will be payed until 12h32) 508 PricePerHour *scw.Money `json:"price_per_hour"` 509 // PricePerMonth: price of the offer per months 510 PricePerMonth *scw.Money `json:"price_per_month"` 511 // Disks: disks specifications of the offer 512 Disks []*Disk `json:"disks"` 513 // Enable: true if the offer is currently available 514 Enable bool `json:"enable"` 515 // CPUs: CPU specifications of the offer 516 CPUs []*CPU `json:"cpus"` 517 // Memories: memory specifications of the offer 518 Memories []*Memory `json:"memories"` 519 // QuotaName: name of the quota associated to the offer 520 QuotaName string `json:"quota_name"` 521 // PersistentMemories: persistent memory specifications of the offer 522 PersistentMemories []*PersistentMemory `json:"persistent_memories"` 523 // RaidControllers: raid controller specifications of the offer 524 RaidControllers []*RaidController `json:"raid_controllers"` 525} 526 527type PersistentMemory struct { 528 Capacity scw.Size `json:"capacity"` 529 530 Type string `json:"type"` 531 532 Frequency uint32 `json:"frequency"` 533} 534 535type RaidController struct { 536 Model string `json:"model"` 537 538 RaidLevel []string `json:"raid_level"` 539} 540 541// Server: server 542type Server struct { 543 // ID: ID of the server 544 ID string `json:"id"` 545 // OrganizationID: organization ID the server is attached to 546 OrganizationID string `json:"organization_id"` 547 // ProjectID: project ID the server is attached to 548 ProjectID string `json:"project_id"` 549 // Name: name of the server 550 Name string `json:"name"` 551 // Description: description of the server 552 Description string `json:"description"` 553 // UpdatedAt: date of last modification of the server 554 UpdatedAt *time.Time `json:"updated_at"` 555 // CreatedAt: date of creation of the server 556 CreatedAt *time.Time `json:"created_at"` 557 // Status: status of the server 558 // 559 // Default value: unknown 560 Status ServerStatus `json:"status"` 561 // OfferID: offer ID of the server 562 OfferID string `json:"offer_id"` 563 // Tags: array of customs tags attached to the server 564 Tags []string `json:"tags"` 565 // IPs: array of IPs attached to the server 566 IPs []*IP `json:"ips"` 567 // Domain: domain of the server 568 Domain string `json:"domain"` 569 // BootType: boot type of the server 570 // 571 // Default value: unknown_boot_type 572 BootType ServerBootType `json:"boot_type"` 573 // Zone: the zone in which is the server 574 Zone scw.Zone `json:"zone"` 575 // Install: configuration of installation 576 Install *ServerInstall `json:"install"` 577 // PingStatus: server status of ping 578 // 579 // Default value: ping_status_unknown 580 PingStatus ServerPingStatus `json:"ping_status"` 581} 582 583// ServerEvent: server event 584type ServerEvent struct { 585 // ID: ID of the server for whom the action will be applied 586 ID string `json:"id"` 587 // Action: the action that will be applied to the server 588 Action string `json:"action"` 589 // UpdatedAt: date of last modification of the action 590 UpdatedAt *time.Time `json:"updated_at"` 591 // CreatedAt: date of creation of the action 592 CreatedAt *time.Time `json:"created_at"` 593} 594 595type ServerInstall struct { 596 OsID string `json:"os_id"` 597 598 Hostname string `json:"hostname"` 599 600 SSHKeyIDs []string `json:"ssh_key_ids"` 601 // Status: 602 // 603 // Default value: unknown 604 Status ServerInstallStatus `json:"status"` 605} 606 607// Service API 608 609type ListServersRequest struct { 610 Zone scw.Zone `json:"-"` 611 // Page: page number 612 Page *int32 `json:"-"` 613 // PageSize: number of server per page 614 PageSize *uint32 `json:"-"` 615 // OrderBy: order of the servers 616 // 617 // Default value: created_at_asc 618 OrderBy ListServersRequestOrderBy `json:"-"` 619 // Tags: filter servers by tags 620 Tags []string `json:"-"` 621 // Status: filter servers by status 622 Status []string `json:"-"` 623 // Name: filter servers by name 624 Name *string `json:"-"` 625 // OrganizationID: filter servers by organization ID 626 OrganizationID *string `json:"-"` 627 // ProjectID: filter servers by project ID 628 ProjectID *string `json:"-"` 629} 630 631// ListServers: list baremetal servers for organization 632// 633// List baremetal servers for organization. 634func (s *API) ListServers(req *ListServersRequest, opts ...scw.RequestOption) (*ListServersResponse, error) { 635 var err error 636 637 if req.Zone == "" { 638 defaultZone, _ := s.client.GetDefaultZone() 639 req.Zone = defaultZone 640 } 641 642 defaultPageSize, exist := s.client.GetDefaultPageSize() 643 if (req.PageSize == nil || *req.PageSize == 0) && exist { 644 req.PageSize = &defaultPageSize 645 } 646 647 query := url.Values{} 648 parameter.AddToQuery(query, "page", req.Page) 649 parameter.AddToQuery(query, "page_size", req.PageSize) 650 parameter.AddToQuery(query, "order_by", req.OrderBy) 651 parameter.AddToQuery(query, "tags", req.Tags) 652 parameter.AddToQuery(query, "status", req.Status) 653 parameter.AddToQuery(query, "name", req.Name) 654 parameter.AddToQuery(query, "organization_id", req.OrganizationID) 655 parameter.AddToQuery(query, "project_id", req.ProjectID) 656 657 if fmt.Sprint(req.Zone) == "" { 658 return nil, errors.New("field Zone cannot be empty in request") 659 } 660 661 scwReq := &scw.ScalewayRequest{ 662 Method: "GET", 663 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers", 664 Query: query, 665 Headers: http.Header{}, 666 } 667 668 var resp ListServersResponse 669 670 err = s.client.Do(scwReq, &resp, opts...) 671 if err != nil { 672 return nil, err 673 } 674 return &resp, nil 675} 676 677// UnsafeGetTotalCount should not be used 678// Internal usage only 679func (r *ListServersResponse) UnsafeGetTotalCount() uint32 { 680 return r.TotalCount 681} 682 683// UnsafeAppend should not be used 684// Internal usage only 685func (r *ListServersResponse) UnsafeAppend(res interface{}) (uint32, error) { 686 results, ok := res.(*ListServersResponse) 687 if !ok { 688 return 0, errors.New("%T type cannot be appended to type %T", res, r) 689 } 690 691 r.Servers = append(r.Servers, results.Servers...) 692 r.TotalCount += uint32(len(results.Servers)) 693 return uint32(len(results.Servers)), nil 694} 695 696type GetServerRequest struct { 697 Zone scw.Zone `json:"-"` 698 // ServerID: ID of the server 699 ServerID string `json:"-"` 700} 701 702// GetServer: get a specific baremetal server 703// 704// Get the server associated with the given ID. 705func (s *API) GetServer(req *GetServerRequest, opts ...scw.RequestOption) (*Server, error) { 706 var err error 707 708 if req.Zone == "" { 709 defaultZone, _ := s.client.GetDefaultZone() 710 req.Zone = defaultZone 711 } 712 713 if fmt.Sprint(req.Zone) == "" { 714 return nil, errors.New("field Zone cannot be empty in request") 715 } 716 717 if fmt.Sprint(req.ServerID) == "" { 718 return nil, errors.New("field ServerID cannot be empty in request") 719 } 720 721 scwReq := &scw.ScalewayRequest{ 722 Method: "GET", 723 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "", 724 Headers: http.Header{}, 725 } 726 727 var resp Server 728 729 err = s.client.Do(scwReq, &resp, opts...) 730 if err != nil { 731 return nil, err 732 } 733 return &resp, nil 734} 735 736type CreateServerRequest struct { 737 Zone scw.Zone `json:"-"` 738 // OfferID: offer ID of the new server 739 OfferID string `json:"offer_id"` 740 // Deprecated: OrganizationID: organization ID with which the server will be created 741 // Precisely one of OrganizationID, ProjectID must be set. 742 OrganizationID *string `json:"organization_id,omitempty"` 743 // ProjectID: project ID with which the server will be created 744 // Precisely one of OrganizationID, ProjectID must be set. 745 ProjectID *string `json:"project_id,omitempty"` 746 // Name: name of the server (≠hostname) 747 Name string `json:"name"` 748 // Description: description associated to the server, max 255 characters 749 Description string `json:"description"` 750 // Tags: tags to associate to the server 751 Tags []string `json:"tags"` 752 753 Install *CreateServerRequestInstall `json:"install"` 754} 755 756// CreateServer: create a baremetal server 757// 758// Create a new baremetal server. Once the server is created, you probably want to install an OS. 759func (s *API) CreateServer(req *CreateServerRequest, opts ...scw.RequestOption) (*Server, error) { 760 var err error 761 762 defaultProjectID, exist := s.client.GetDefaultProjectID() 763 if exist && req.OrganizationID == nil && req.ProjectID == nil { 764 req.ProjectID = &defaultProjectID 765 } 766 767 defaultOrganizationID, exist := s.client.GetDefaultOrganizationID() 768 if exist && req.OrganizationID == nil && req.ProjectID == nil { 769 req.OrganizationID = &defaultOrganizationID 770 } 771 772 if req.Zone == "" { 773 defaultZone, _ := s.client.GetDefaultZone() 774 req.Zone = defaultZone 775 } 776 777 if fmt.Sprint(req.Zone) == "" { 778 return nil, errors.New("field Zone cannot be empty in request") 779 } 780 781 scwReq := &scw.ScalewayRequest{ 782 Method: "POST", 783 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers", 784 Headers: http.Header{}, 785 } 786 787 err = scwReq.SetBody(req) 788 if err != nil { 789 return nil, err 790 } 791 792 var resp Server 793 794 err = s.client.Do(scwReq, &resp, opts...) 795 if err != nil { 796 return nil, err 797 } 798 return &resp, nil 799} 800 801type UpdateServerRequest struct { 802 Zone scw.Zone `json:"-"` 803 // ServerID: ID of the server to update 804 ServerID string `json:"-"` 805 // Name: name of the server (≠hostname), not updated if null 806 Name *string `json:"name"` 807 // Description: description associated to the server, max 255 characters, not updated if null 808 Description *string `json:"description"` 809 // Tags: tags associated to the server, not updated if null 810 Tags *[]string `json:"tags"` 811} 812 813// UpdateServer: update a baremetal server 814// 815// Update the server associated with the given ID. 816func (s *API) UpdateServer(req *UpdateServerRequest, opts ...scw.RequestOption) (*Server, error) { 817 var err error 818 819 if req.Zone == "" { 820 defaultZone, _ := s.client.GetDefaultZone() 821 req.Zone = defaultZone 822 } 823 824 if fmt.Sprint(req.Zone) == "" { 825 return nil, errors.New("field Zone cannot be empty in request") 826 } 827 828 if fmt.Sprint(req.ServerID) == "" { 829 return nil, errors.New("field ServerID cannot be empty in request") 830 } 831 832 scwReq := &scw.ScalewayRequest{ 833 Method: "PATCH", 834 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "", 835 Headers: http.Header{}, 836 } 837 838 err = scwReq.SetBody(req) 839 if err != nil { 840 return nil, err 841 } 842 843 var resp Server 844 845 err = s.client.Do(scwReq, &resp, opts...) 846 if err != nil { 847 return nil, err 848 } 849 return &resp, nil 850} 851 852type InstallServerRequest struct { 853 Zone scw.Zone `json:"-"` 854 // ServerID: server ID to install 855 ServerID string `json:"-"` 856 // OsID: ID of the OS to install on the server 857 OsID string `json:"os_id"` 858 // Hostname: hostname of the server 859 Hostname string `json:"hostname"` 860 // SSHKeyIDs: SSH key IDs authorized on the server 861 SSHKeyIDs []string `json:"ssh_key_ids"` 862} 863 864// InstallServer: install a baremetal server 865// 866// Install an OS on the server associated with the given ID. 867func (s *API) InstallServer(req *InstallServerRequest, opts ...scw.RequestOption) (*Server, error) { 868 var err error 869 870 if req.Zone == "" { 871 defaultZone, _ := s.client.GetDefaultZone() 872 req.Zone = defaultZone 873 } 874 875 if fmt.Sprint(req.Zone) == "" { 876 return nil, errors.New("field Zone cannot be empty in request") 877 } 878 879 if fmt.Sprint(req.ServerID) == "" { 880 return nil, errors.New("field ServerID cannot be empty in request") 881 } 882 883 scwReq := &scw.ScalewayRequest{ 884 Method: "POST", 885 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/install", 886 Headers: http.Header{}, 887 } 888 889 err = scwReq.SetBody(req) 890 if err != nil { 891 return nil, err 892 } 893 894 var resp Server 895 896 err = s.client.Do(scwReq, &resp, opts...) 897 if err != nil { 898 return nil, err 899 } 900 return &resp, nil 901} 902 903type GetServerMetricsRequest struct { 904 Zone scw.Zone `json:"-"` 905 // ServerID: server ID to get the metrics 906 ServerID string `json:"-"` 907} 908 909// GetServerMetrics: return server metrics 910// 911// Give the ping status on the server associated with the given ID. 912func (s *API) GetServerMetrics(req *GetServerMetricsRequest, opts ...scw.RequestOption) (*GetServerMetricsResponse, error) { 913 var err error 914 915 if req.Zone == "" { 916 defaultZone, _ := s.client.GetDefaultZone() 917 req.Zone = defaultZone 918 } 919 920 if fmt.Sprint(req.Zone) == "" { 921 return nil, errors.New("field Zone cannot be empty in request") 922 } 923 924 if fmt.Sprint(req.ServerID) == "" { 925 return nil, errors.New("field ServerID cannot be empty in request") 926 } 927 928 scwReq := &scw.ScalewayRequest{ 929 Method: "GET", 930 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/metrics", 931 Headers: http.Header{}, 932 } 933 934 var resp GetServerMetricsResponse 935 936 err = s.client.Do(scwReq, &resp, opts...) 937 if err != nil { 938 return nil, err 939 } 940 return &resp, nil 941} 942 943type DeleteServerRequest struct { 944 Zone scw.Zone `json:"-"` 945 // ServerID: ID of the server to delete 946 ServerID string `json:"-"` 947} 948 949// DeleteServer: delete a baremetal server 950// 951// Delete the server associated with the given ID. 952func (s *API) DeleteServer(req *DeleteServerRequest, opts ...scw.RequestOption) (*Server, error) { 953 var err error 954 955 if req.Zone == "" { 956 defaultZone, _ := s.client.GetDefaultZone() 957 req.Zone = defaultZone 958 } 959 960 if fmt.Sprint(req.Zone) == "" { 961 return nil, errors.New("field Zone cannot be empty in request") 962 } 963 964 if fmt.Sprint(req.ServerID) == "" { 965 return nil, errors.New("field ServerID cannot be empty in request") 966 } 967 968 scwReq := &scw.ScalewayRequest{ 969 Method: "DELETE", 970 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "", 971 Headers: http.Header{}, 972 } 973 974 var resp Server 975 976 err = s.client.Do(scwReq, &resp, opts...) 977 if err != nil { 978 return nil, err 979 } 980 return &resp, nil 981} 982 983type RebootServerRequest struct { 984 Zone scw.Zone `json:"-"` 985 // ServerID: ID of the server to reboot 986 ServerID string `json:"-"` 987 // BootType: the type of boot 988 // 989 // Default value: unknown_boot_type 990 BootType ServerBootType `json:"boot_type"` 991} 992 993// RebootServer: reboot a baremetal server 994// 995// Reboot the server associated with the given ID, use boot param to reboot in rescue. 996func (s *API) RebootServer(req *RebootServerRequest, opts ...scw.RequestOption) (*Server, error) { 997 var err error 998 999 if req.Zone == "" { 1000 defaultZone, _ := s.client.GetDefaultZone() 1001 req.Zone = defaultZone 1002 } 1003 1004 if fmt.Sprint(req.Zone) == "" { 1005 return nil, errors.New("field Zone cannot be empty in request") 1006 } 1007 1008 if fmt.Sprint(req.ServerID) == "" { 1009 return nil, errors.New("field ServerID cannot be empty in request") 1010 } 1011 1012 scwReq := &scw.ScalewayRequest{ 1013 Method: "POST", 1014 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/reboot", 1015 Headers: http.Header{}, 1016 } 1017 1018 err = scwReq.SetBody(req) 1019 if err != nil { 1020 return nil, err 1021 } 1022 1023 var resp Server 1024 1025 err = s.client.Do(scwReq, &resp, opts...) 1026 if err != nil { 1027 return nil, err 1028 } 1029 return &resp, nil 1030} 1031 1032type StartServerRequest struct { 1033 Zone scw.Zone `json:"-"` 1034 // ServerID: ID of the server to start 1035 ServerID string `json:"-"` 1036 // BootType: the type of boot 1037 // 1038 // Default value: unknown_boot_type 1039 BootType ServerBootType `json:"boot_type"` 1040} 1041 1042// StartServer: start a baremetal server 1043// 1044// Start the server associated with the given ID. 1045func (s *API) StartServer(req *StartServerRequest, opts ...scw.RequestOption) (*Server, error) { 1046 var err error 1047 1048 if req.Zone == "" { 1049 defaultZone, _ := s.client.GetDefaultZone() 1050 req.Zone = defaultZone 1051 } 1052 1053 if fmt.Sprint(req.Zone) == "" { 1054 return nil, errors.New("field Zone cannot be empty in request") 1055 } 1056 1057 if fmt.Sprint(req.ServerID) == "" { 1058 return nil, errors.New("field ServerID cannot be empty in request") 1059 } 1060 1061 scwReq := &scw.ScalewayRequest{ 1062 Method: "POST", 1063 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/start", 1064 Headers: http.Header{}, 1065 } 1066 1067 err = scwReq.SetBody(req) 1068 if err != nil { 1069 return nil, err 1070 } 1071 1072 var resp Server 1073 1074 err = s.client.Do(scwReq, &resp, opts...) 1075 if err != nil { 1076 return nil, err 1077 } 1078 return &resp, nil 1079} 1080 1081type StopServerRequest struct { 1082 Zone scw.Zone `json:"-"` 1083 // ServerID: ID of the server to stop 1084 ServerID string `json:"-"` 1085} 1086 1087// StopServer: stop a baremetal server 1088// 1089// Stop the server associated with the given ID. 1090func (s *API) StopServer(req *StopServerRequest, opts ...scw.RequestOption) (*Server, error) { 1091 var err error 1092 1093 if req.Zone == "" { 1094 defaultZone, _ := s.client.GetDefaultZone() 1095 req.Zone = defaultZone 1096 } 1097 1098 if fmt.Sprint(req.Zone) == "" { 1099 return nil, errors.New("field Zone cannot be empty in request") 1100 } 1101 1102 if fmt.Sprint(req.ServerID) == "" { 1103 return nil, errors.New("field ServerID cannot be empty in request") 1104 } 1105 1106 scwReq := &scw.ScalewayRequest{ 1107 Method: "POST", 1108 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/stop", 1109 Headers: http.Header{}, 1110 } 1111 1112 err = scwReq.SetBody(req) 1113 if err != nil { 1114 return nil, err 1115 } 1116 1117 var resp Server 1118 1119 err = s.client.Do(scwReq, &resp, opts...) 1120 if err != nil { 1121 return nil, err 1122 } 1123 return &resp, nil 1124} 1125 1126type ListServerEventsRequest struct { 1127 Zone scw.Zone `json:"-"` 1128 // ServerID: ID of the server events searched 1129 ServerID string `json:"-"` 1130 // Page: page number 1131 Page *int32 `json:"-"` 1132 // PageSize: number of server events per page 1133 PageSize *uint32 `json:"-"` 1134 // OrderBy: order of the server events 1135 // 1136 // Default value: created_at_asc 1137 OrderBy ListServerEventsRequestOrderBy `json:"-"` 1138} 1139 1140// ListServerEvents: list server events 1141// 1142// List events associated to the given server ID. 1143func (s *API) ListServerEvents(req *ListServerEventsRequest, opts ...scw.RequestOption) (*ListServerEventsResponse, error) { 1144 var err error 1145 1146 if req.Zone == "" { 1147 defaultZone, _ := s.client.GetDefaultZone() 1148 req.Zone = defaultZone 1149 } 1150 1151 defaultPageSize, exist := s.client.GetDefaultPageSize() 1152 if (req.PageSize == nil || *req.PageSize == 0) && exist { 1153 req.PageSize = &defaultPageSize 1154 } 1155 1156 query := url.Values{} 1157 parameter.AddToQuery(query, "page", req.Page) 1158 parameter.AddToQuery(query, "page_size", req.PageSize) 1159 parameter.AddToQuery(query, "order_by", req.OrderBy) 1160 1161 if fmt.Sprint(req.Zone) == "" { 1162 return nil, errors.New("field Zone cannot be empty in request") 1163 } 1164 1165 if fmt.Sprint(req.ServerID) == "" { 1166 return nil, errors.New("field ServerID cannot be empty in request") 1167 } 1168 1169 scwReq := &scw.ScalewayRequest{ 1170 Method: "GET", 1171 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/events", 1172 Query: query, 1173 Headers: http.Header{}, 1174 } 1175 1176 var resp ListServerEventsResponse 1177 1178 err = s.client.Do(scwReq, &resp, opts...) 1179 if err != nil { 1180 return nil, err 1181 } 1182 return &resp, nil 1183} 1184 1185// UnsafeGetTotalCount should not be used 1186// Internal usage only 1187func (r *ListServerEventsResponse) UnsafeGetTotalCount() uint32 { 1188 return r.TotalCount 1189} 1190 1191// UnsafeAppend should not be used 1192// Internal usage only 1193func (r *ListServerEventsResponse) UnsafeAppend(res interface{}) (uint32, error) { 1194 results, ok := res.(*ListServerEventsResponse) 1195 if !ok { 1196 return 0, errors.New("%T type cannot be appended to type %T", res, r) 1197 } 1198 1199 r.Events = append(r.Events, results.Events...) 1200 r.TotalCount += uint32(len(results.Events)) 1201 return uint32(len(results.Events)), nil 1202} 1203 1204type StartBMCAccessRequest struct { 1205 Zone scw.Zone `json:"-"` 1206 // ServerID: ID of the server 1207 ServerID string `json:"-"` 1208 // IP: the IP authorized to connect to the given server 1209 IP net.IP `json:"ip"` 1210} 1211 1212// StartBMCAccess: start BMC (Baseboard Management Controller) access for a given baremetal server 1213// 1214// Start BMC (Baseboard Management Controller) access associated with the given ID. 1215// The BMC (Baseboard Management Controller) access is available one hour after the installation of the server. 1216// 1217func (s *API) StartBMCAccess(req *StartBMCAccessRequest, opts ...scw.RequestOption) (*BMCAccess, error) { 1218 var err error 1219 1220 if req.Zone == "" { 1221 defaultZone, _ := s.client.GetDefaultZone() 1222 req.Zone = defaultZone 1223 } 1224 1225 if fmt.Sprint(req.Zone) == "" { 1226 return nil, errors.New("field Zone cannot be empty in request") 1227 } 1228 1229 if fmt.Sprint(req.ServerID) == "" { 1230 return nil, errors.New("field ServerID cannot be empty in request") 1231 } 1232 1233 scwReq := &scw.ScalewayRequest{ 1234 Method: "POST", 1235 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/bmc-access", 1236 Headers: http.Header{}, 1237 } 1238 1239 err = scwReq.SetBody(req) 1240 if err != nil { 1241 return nil, err 1242 } 1243 1244 var resp BMCAccess 1245 1246 err = s.client.Do(scwReq, &resp, opts...) 1247 if err != nil { 1248 return nil, err 1249 } 1250 return &resp, nil 1251} 1252 1253type GetBMCAccessRequest struct { 1254 Zone scw.Zone `json:"-"` 1255 // ServerID: ID of the server 1256 ServerID string `json:"-"` 1257} 1258 1259// GetBMCAccess: get BMC (Baseboard Management Controller) access for a given baremetal server 1260// 1261// Get the BMC (Baseboard Management Controller) access associated with the given ID. 1262func (s *API) GetBMCAccess(req *GetBMCAccessRequest, opts ...scw.RequestOption) (*BMCAccess, error) { 1263 var err error 1264 1265 if req.Zone == "" { 1266 defaultZone, _ := s.client.GetDefaultZone() 1267 req.Zone = defaultZone 1268 } 1269 1270 if fmt.Sprint(req.Zone) == "" { 1271 return nil, errors.New("field Zone cannot be empty in request") 1272 } 1273 1274 if fmt.Sprint(req.ServerID) == "" { 1275 return nil, errors.New("field ServerID cannot be empty in request") 1276 } 1277 1278 scwReq := &scw.ScalewayRequest{ 1279 Method: "GET", 1280 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/bmc-access", 1281 Headers: http.Header{}, 1282 } 1283 1284 var resp BMCAccess 1285 1286 err = s.client.Do(scwReq, &resp, opts...) 1287 if err != nil { 1288 return nil, err 1289 } 1290 return &resp, nil 1291} 1292 1293type StopBMCAccessRequest struct { 1294 Zone scw.Zone `json:"-"` 1295 // ServerID: ID of the server 1296 ServerID string `json:"-"` 1297} 1298 1299// StopBMCAccess: stop BMC (Baseboard Management Controller) access for a given baremetal server 1300// 1301// Stop BMC (Baseboard Management Controller) access associated with the given ID. 1302func (s *API) StopBMCAccess(req *StopBMCAccessRequest, opts ...scw.RequestOption) error { 1303 var err error 1304 1305 if req.Zone == "" { 1306 defaultZone, _ := s.client.GetDefaultZone() 1307 req.Zone = defaultZone 1308 } 1309 1310 if fmt.Sprint(req.Zone) == "" { 1311 return errors.New("field Zone cannot be empty in request") 1312 } 1313 1314 if fmt.Sprint(req.ServerID) == "" { 1315 return errors.New("field ServerID cannot be empty in request") 1316 } 1317 1318 scwReq := &scw.ScalewayRequest{ 1319 Method: "DELETE", 1320 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/bmc-access", 1321 Headers: http.Header{}, 1322 } 1323 1324 err = s.client.Do(scwReq, nil, opts...) 1325 if err != nil { 1326 return err 1327 } 1328 return nil 1329} 1330 1331type UpdateIPRequest struct { 1332 Zone scw.Zone `json:"-"` 1333 // ServerID: ID of the server 1334 ServerID string `json:"-"` 1335 // IPID: ID of the IP to update 1336 IPID string `json:"-"` 1337 // Reverse: new reverse IP to update, not updated if null 1338 Reverse *string `json:"reverse"` 1339} 1340 1341// UpdateIP: update IP 1342// 1343// Configure ip associated with the given server ID and ipID. You can use this method to set a reverse dns for an IP. 1344func (s *API) UpdateIP(req *UpdateIPRequest, opts ...scw.RequestOption) (*IP, error) { 1345 var err error 1346 1347 if req.Zone == "" { 1348 defaultZone, _ := s.client.GetDefaultZone() 1349 req.Zone = defaultZone 1350 } 1351 1352 if fmt.Sprint(req.Zone) == "" { 1353 return nil, errors.New("field Zone cannot be empty in request") 1354 } 1355 1356 if fmt.Sprint(req.ServerID) == "" { 1357 return nil, errors.New("field ServerID cannot be empty in request") 1358 } 1359 1360 if fmt.Sprint(req.IPID) == "" { 1361 return nil, errors.New("field IPID cannot be empty in request") 1362 } 1363 1364 scwReq := &scw.ScalewayRequest{ 1365 Method: "PATCH", 1366 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/ips/" + fmt.Sprint(req.IPID) + "", 1367 Headers: http.Header{}, 1368 } 1369 1370 err = scwReq.SetBody(req) 1371 if err != nil { 1372 return nil, err 1373 } 1374 1375 var resp IP 1376 1377 err = s.client.Do(scwReq, &resp, opts...) 1378 if err != nil { 1379 return nil, err 1380 } 1381 return &resp, nil 1382} 1383 1384type ListOffersRequest struct { 1385 Zone scw.Zone `json:"-"` 1386 // Page: page number 1387 Page *int32 `json:"-"` 1388 // PageSize: number of offers per page 1389 PageSize *uint32 `json:"-"` 1390} 1391 1392// ListOffers: list offers 1393// 1394// List all available server offers. 1395func (s *API) ListOffers(req *ListOffersRequest, opts ...scw.RequestOption) (*ListOffersResponse, error) { 1396 var err error 1397 1398 if req.Zone == "" { 1399 defaultZone, _ := s.client.GetDefaultZone() 1400 req.Zone = defaultZone 1401 } 1402 1403 defaultPageSize, exist := s.client.GetDefaultPageSize() 1404 if (req.PageSize == nil || *req.PageSize == 0) && exist { 1405 req.PageSize = &defaultPageSize 1406 } 1407 1408 query := url.Values{} 1409 parameter.AddToQuery(query, "page", req.Page) 1410 parameter.AddToQuery(query, "page_size", req.PageSize) 1411 1412 if fmt.Sprint(req.Zone) == "" { 1413 return nil, errors.New("field Zone cannot be empty in request") 1414 } 1415 1416 scwReq := &scw.ScalewayRequest{ 1417 Method: "GET", 1418 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/offers", 1419 Query: query, 1420 Headers: http.Header{}, 1421 } 1422 1423 var resp ListOffersResponse 1424 1425 err = s.client.Do(scwReq, &resp, opts...) 1426 if err != nil { 1427 return nil, err 1428 } 1429 return &resp, nil 1430} 1431 1432// UnsafeGetTotalCount should not be used 1433// Internal usage only 1434func (r *ListOffersResponse) UnsafeGetTotalCount() uint32 { 1435 return r.TotalCount 1436} 1437 1438// UnsafeAppend should not be used 1439// Internal usage only 1440func (r *ListOffersResponse) UnsafeAppend(res interface{}) (uint32, error) { 1441 results, ok := res.(*ListOffersResponse) 1442 if !ok { 1443 return 0, errors.New("%T type cannot be appended to type %T", res, r) 1444 } 1445 1446 r.Offers = append(r.Offers, results.Offers...) 1447 r.TotalCount += uint32(len(results.Offers)) 1448 return uint32(len(results.Offers)), nil 1449} 1450 1451type GetOfferRequest struct { 1452 Zone scw.Zone `json:"-"` 1453 // OfferID: ID of the researched Offer 1454 OfferID string `json:"-"` 1455} 1456 1457// GetOffer: get offer 1458// 1459// Return specific offer for the given ID. 1460func (s *API) GetOffer(req *GetOfferRequest, opts ...scw.RequestOption) (*Offer, error) { 1461 var err error 1462 1463 if req.Zone == "" { 1464 defaultZone, _ := s.client.GetDefaultZone() 1465 req.Zone = defaultZone 1466 } 1467 1468 if fmt.Sprint(req.Zone) == "" { 1469 return nil, errors.New("field Zone cannot be empty in request") 1470 } 1471 1472 if fmt.Sprint(req.OfferID) == "" { 1473 return nil, errors.New("field OfferID cannot be empty in request") 1474 } 1475 1476 scwReq := &scw.ScalewayRequest{ 1477 Method: "GET", 1478 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/offers/" + fmt.Sprint(req.OfferID) + "", 1479 Headers: http.Header{}, 1480 } 1481 1482 var resp Offer 1483 1484 err = s.client.Do(scwReq, &resp, opts...) 1485 if err != nil { 1486 return nil, err 1487 } 1488 return &resp, nil 1489} 1490 1491type ListOSRequest struct { 1492 Zone scw.Zone `json:"-"` 1493 // Page: page number 1494 Page *int32 `json:"-"` 1495 // PageSize: number of OS per page 1496 PageSize *uint32 `json:"-"` 1497 // OfferID: filter OS by offer ID 1498 OfferID *string `json:"-"` 1499} 1500 1501// ListOS: list all available OS that can be install on a baremetal server 1502// 1503// List all available OS that can be install on a baremetal server. 1504func (s *API) ListOS(req *ListOSRequest, opts ...scw.RequestOption) (*ListOSResponse, error) { 1505 var err error 1506 1507 if req.Zone == "" { 1508 defaultZone, _ := s.client.GetDefaultZone() 1509 req.Zone = defaultZone 1510 } 1511 1512 defaultPageSize, exist := s.client.GetDefaultPageSize() 1513 if (req.PageSize == nil || *req.PageSize == 0) && exist { 1514 req.PageSize = &defaultPageSize 1515 } 1516 1517 query := url.Values{} 1518 parameter.AddToQuery(query, "page", req.Page) 1519 parameter.AddToQuery(query, "page_size", req.PageSize) 1520 parameter.AddToQuery(query, "offer_id", req.OfferID) 1521 1522 if fmt.Sprint(req.Zone) == "" { 1523 return nil, errors.New("field Zone cannot be empty in request") 1524 } 1525 1526 scwReq := &scw.ScalewayRequest{ 1527 Method: "GET", 1528 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/os", 1529 Query: query, 1530 Headers: http.Header{}, 1531 } 1532 1533 var resp ListOSResponse 1534 1535 err = s.client.Do(scwReq, &resp, opts...) 1536 if err != nil { 1537 return nil, err 1538 } 1539 return &resp, nil 1540} 1541 1542// UnsafeGetTotalCount should not be used 1543// Internal usage only 1544func (r *ListOSResponse) UnsafeGetTotalCount() uint32 { 1545 return r.TotalCount 1546} 1547 1548// UnsafeAppend should not be used 1549// Internal usage only 1550func (r *ListOSResponse) UnsafeAppend(res interface{}) (uint32, error) { 1551 results, ok := res.(*ListOSResponse) 1552 if !ok { 1553 return 0, errors.New("%T type cannot be appended to type %T", res, r) 1554 } 1555 1556 r.Os = append(r.Os, results.Os...) 1557 r.TotalCount += uint32(len(results.Os)) 1558 return uint32(len(results.Os)), nil 1559} 1560 1561type GetOSRequest struct { 1562 Zone scw.Zone `json:"-"` 1563 // OsID: ID of the OS 1564 OsID string `json:"-"` 1565} 1566 1567// GetOS: get an OS with a given ID 1568// 1569// Return specific OS for the given ID. 1570func (s *API) GetOS(req *GetOSRequest, opts ...scw.RequestOption) (*OS, error) { 1571 var err error 1572 1573 if req.Zone == "" { 1574 defaultZone, _ := s.client.GetDefaultZone() 1575 req.Zone = defaultZone 1576 } 1577 1578 if fmt.Sprint(req.Zone) == "" { 1579 return nil, errors.New("field Zone cannot be empty in request") 1580 } 1581 1582 if fmt.Sprint(req.OsID) == "" { 1583 return nil, errors.New("field OsID cannot be empty in request") 1584 } 1585 1586 scwReq := &scw.ScalewayRequest{ 1587 Method: "GET", 1588 Path: "/baremetal/v1/zones/" + fmt.Sprint(req.Zone) + "/os/" + fmt.Sprint(req.OsID) + "", 1589 Headers: http.Header{}, 1590 } 1591 1592 var resp OS 1593 1594 err = s.client.Do(scwReq, &resp, opts...) 1595 if err != nil { 1596 return nil, err 1597 } 1598 return &resp, nil 1599} 1600