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