From bc4faebb9002e6bf5ceca009e66b06ab5b7395e6 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 27 Sep 2024 12:00:56 +0200 Subject: [PATCH 001/163] feat(billing): add support for exclude in DiscountFilter (#2224) --- api/billing/v2alpha1/billing_sdk.go | 3 +++ api/billing/v2beta1/billing_sdk.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/api/billing/v2alpha1/billing_sdk.go b/api/billing/v2alpha1/billing_sdk.go index b2665b4ba..8ebde39b9 100644 --- a/api/billing/v2alpha1/billing_sdk.go +++ b/api/billing/v2alpha1/billing_sdk.go @@ -326,6 +326,9 @@ type DiscountFilter struct { // Value: value of filter, it can be a product/range/region/zone value. Value string `json:"value"` + + // Exclude: boolean to describe if filter is an excluding filter. + Exclude bool `json:"exclude"` } // GetConsumptionResponseConsumption: get consumption response consumption. diff --git a/api/billing/v2beta1/billing_sdk.go b/api/billing/v2beta1/billing_sdk.go index 563f29921..29551b3e7 100644 --- a/api/billing/v2beta1/billing_sdk.go +++ b/api/billing/v2beta1/billing_sdk.go @@ -512,6 +512,9 @@ type DiscountFilter struct { // Value: value of filter. Value string `json:"value"` + + // Exclude: boolean to describe if filter is an excluding filter. + Exclude bool `json:"exclude"` } // ListConsumptionsResponseConsumption: list consumptions response consumption. From 1d725e74ecf22e428043c9114f986e17a7090f57 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 27 Sep 2024 12:01:17 +0200 Subject: [PATCH 002/163] feat(k8s): add temporary feature flag for VPCv3 (#2225) --- api/k8s/v1/k8s_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index a634ae72f..4dc3bf0a1 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -1152,6 +1152,9 @@ type Cluster struct { // Deprecated: SbsCsiEnabled: defines whether the SBS-enabled CSI starting from v0.3 is installed on the cluster. SbsCsiEnabled *bool `json:"sbs_csi_enabled,omitempty"` + + // Deprecated: FullVpcIntegratonEnabled: defines whether VPC is fully integrated on the cluster. + FullVpcIntegratonEnabled *bool `json:"full_vpc_integraton_enabled,omitempty"` } // Node: node. From 7e8c4604d3a11a2b03073c35bd0e0a0c0f15ec47 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 27 Sep 2024 12:01:37 +0200 Subject: [PATCH 003/163] feat(edge_services): add plan endpoints (#2226) --- .../v1alpha1/edge_services_sdk.go | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index 42a30c342..057412692 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -612,6 +612,47 @@ func (enum *PipelineStatus) UnmarshalJSON(data []byte) error { return nil } +type PlanName string + +const ( + PlanNameUnknownName = PlanName("unknown_name") + PlanNameStarter = PlanName("starter") + PlanNameProfessional = PlanName("professional") + PlanNameAdvanced = PlanName("advanced") +) + +func (enum PlanName) String() string { + if enum == "" { + // return default value if empty + return "unknown_name" + } + return string(enum) +} + +func (enum PlanName) Values() []PlanName { + return []PlanName{ + "unknown_name", + "starter", + "professional", + "advanced", + } +} + +func (enum PlanName) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *PlanName) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = PlanName(PlanName(tmp).String()) + return nil +} + type PurgeRequestStatus string const ( @@ -846,6 +887,16 @@ type Pipeline struct { DNSStageID *string `json:"dns_stage_id,omitempty"` } +// PlanDetails: plan details. +type PlanDetails struct { + // PlanName: default value: unknown_name + PlanName PlanName `json:"plan_name"` + + PackageGb uint64 `json:"package_gb"` + + PipelineLimit uint32 `json:"pipeline_limit"` +} + // PurgeRequest: purge request. type PurgeRequest struct { // ID: ID of the purge request. @@ -1069,6 +1120,11 @@ type DeleteCacheStageRequest struct { CacheStageID string `json:"-"` } +// DeleteCurrentPlanRequest: delete current plan request. +type DeleteCurrentPlanRequest struct { + ProjectID string `json:"-"` +} + // DeleteDNSStageRequest: delete dns stage request. type DeleteDNSStageRequest struct { // DNSStageID: ID of the DNS stage to delete. @@ -1099,6 +1155,11 @@ type GetCacheStageRequest struct { CacheStageID string `json:"-"` } +// GetCurrentPlanRequest: get current plan request. +type GetCurrentPlanRequest struct { + ProjectID string `json:"-"` +} + // GetDNSStageRequest: get dns stage request. type GetDNSStageRequest struct { // DNSStageID: ID of the requested DNS stage. @@ -1329,6 +1390,32 @@ func (r *ListPipelinesResponse) UnsafeAppend(res interface{}) (uint64, error) { return uint64(len(results.Pipelines)), nil } +// ListPlansResponse: list plans response. +type ListPlansResponse struct { + TotalCount uint64 `json:"total_count"` + + Plans []*PlanDetails `json:"plans"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListPlansResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListPlansResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListPlansResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Plans = append(r.Plans, results.Plans...) + r.TotalCount += uint64(len(results.Plans)) + return uint64(len(results.Plans)), nil +} + // ListPurgeRequestsRequest: list purge requests request. type ListPurgeRequestsRequest struct { // OrderBy: sort order of purge requests in the response. @@ -1432,6 +1519,20 @@ func (r *ListTLSStagesResponse) UnsafeAppend(res interface{}) (uint64, error) { return uint64(len(results.Stages)), nil } +// Plan: plan. +type Plan struct { + // PlanName: default value: unknown_name + PlanName PlanName `json:"plan_name"` +} + +// SelectPlanRequest: select plan request. +type SelectPlanRequest struct { + ProjectID string `json:"project_id"` + + // PlanName: default value: unknown_name + PlanName PlanName `json:"plan_name"` +} + // UpdateBackendStageRequest: update backend stage request. type UpdateBackendStageRequest struct { // BackendStageID: ID of the backend stage to update. @@ -2330,3 +2431,101 @@ func (s *API) CheckLBOrigin(req *CheckLBOriginRequest, opts ...scw.RequestOption } return &resp, nil } + +// ListPlans: +func (s *API) ListPlans(opts ...scw.RequestOption) (*ListPlansResponse, error) { + var err error + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/edge-services/v1alpha1/plans", + } + + var resp ListPlansResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// SelectPlan: +func (s *API) SelectPlan(req *SelectPlanRequest, opts ...scw.RequestOption) (*Plan, error) { + var err error + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/edge-services/v1alpha1/current-plan", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Plan + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetCurrentPlan: +func (s *API) GetCurrentPlan(req *GetCurrentPlanRequest, opts ...scw.RequestOption) (*Plan, error) { + var err error + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + query := url.Values{} + parameter.AddToQuery(query, "project_id", req.ProjectID) + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/edge-services/v1alpha1/current-plan", + Query: query, + } + + var resp Plan + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteCurrentPlan: +func (s *API) DeleteCurrentPlan(req *DeleteCurrentPlanRequest, opts ...scw.RequestOption) error { + var err error + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + query := url.Values{} + parameter.AddToQuery(query, "project_id", req.ProjectID) + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/edge-services/v1alpha1/current-plan", + Query: query, + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From ce615b456689298741c639f3a4c65ec4ce457ecd Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 30 Sep 2024 12:00:56 +0200 Subject: [PATCH 004/163] feat(edge_services): add GetPipelineStages endpoint (#2228) --- .../v1alpha1/edge_services_sdk.go | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index 057412692..cd5f21e91 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -760,13 +760,6 @@ type TLSSecret struct { Region scw.Region `json:"region"` } -// CheckPEMChainRequestSecretChain: check pem chain request secret chain. -type CheckPEMChainRequestSecretChain struct { - SecretID string `json:"secret_id"` - - SecretRegion string `json:"secret_region"` -} - // BackendStage: backend stage. type BackendStage struct { // ID: ID of the backend stage. @@ -887,6 +880,48 @@ type Pipeline struct { DNSStageID *string `json:"dns_stage_id,omitempty"` } +// TLSStage: tls stage. +type TLSStage struct { + // ID: ID of the TLS stage. + ID string `json:"id"` + + // Secrets: secret (from Scaleway Secret Manager) containing your custom certificate. + Secrets []*TLSSecret `json:"secrets"` + + // ManagedCertificate: true when Scaleway generates and manages a Let's Encrypt certificate for the TLS stage/custom endpoint. + ManagedCertificate bool `json:"managed_certificate"` + + // PipelineID: pipeline ID the TLS stage belongs to. + PipelineID *string `json:"pipeline_id"` + + // ProjectID: project ID of the TLS stage. + ProjectID string `json:"project_id"` + + // CertificateExpiresAt: expiration date of the certificate. + CertificateExpiresAt *time.Time `json:"certificate_expires_at"` + + // CreatedAt: date the TLS stage was created. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: date the TLS stage was last updated. + UpdatedAt *time.Time `json:"updated_at"` + + // CacheStageID: cache stage ID the TLS stage is linked to. + // Precisely one of CacheStageID, BackendStageID must be set. + CacheStageID *string `json:"cache_stage_id,omitempty"` + + // BackendStageID: backend stage ID the TLS stage is linked to. + // Precisely one of CacheStageID, BackendStageID must be set. + BackendStageID *string `json:"backend_stage_id,omitempty"` +} + +// CheckPEMChainRequestSecretChain: check pem chain request secret chain. +type CheckPEMChainRequestSecretChain struct { + SecretID string `json:"secret_id"` + + SecretRegion string `json:"secret_region"` +} + // PlanDetails: plan details. type PlanDetails struct { // PlanName: default value: unknown_name @@ -924,41 +959,6 @@ type PurgeRequest struct { UpdatedAt *time.Time `json:"updated_at"` } -// TLSStage: tls stage. -type TLSStage struct { - // ID: ID of the TLS stage. - ID string `json:"id"` - - // Secrets: secret (from Scaleway Secret Manager) containing your custom certificate. - Secrets []*TLSSecret `json:"secrets"` - - // ManagedCertificate: true when Scaleway generates and manages a Let's Encrypt certificate for the TLS stage/custom endpoint. - ManagedCertificate bool `json:"managed_certificate"` - - // PipelineID: pipeline ID the TLS stage belongs to. - PipelineID *string `json:"pipeline_id"` - - // ProjectID: project ID of the TLS stage. - ProjectID string `json:"project_id"` - - // CertificateExpiresAt: expiration date of the certificate. - CertificateExpiresAt *time.Time `json:"certificate_expires_at"` - - // CreatedAt: date the TLS stage was created. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: date the TLS stage was last updated. - UpdatedAt *time.Time `json:"updated_at"` - - // CacheStageID: cache stage ID the TLS stage is linked to. - // Precisely one of CacheStageID, BackendStageID must be set. - CacheStageID *string `json:"cache_stage_id,omitempty"` - - // BackendStageID: backend stage ID the TLS stage is linked to. - // Precisely one of CacheStageID, BackendStageID must be set. - BackendStageID *string `json:"backend_stage_id,omitempty"` -} - // TLSSecretsConfig: tls secrets config. type TLSSecretsConfig struct { // TLSSecrets: secret information (from Secret Manager). From c3abf300c91124c41a4be67941cc85c84545cb3d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 1 Oct 2024 10:57:44 +0200 Subject: [PATCH 005/163] fix(edge_services): fix plan endpoints (#2229) --- api/edge_services/v1alpha1/edge_services_sdk.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index cd5f21e91..76d56c620 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -2487,13 +2487,13 @@ func (s *API) GetCurrentPlan(req *GetCurrentPlanRequest, opts ...scw.RequestOpti req.ProjectID = defaultProjectID } - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) + if fmt.Sprint(req.ProjectID) == "" { + return nil, errors.New("field ProjectID cannot be empty in request") + } scwReq := &scw.ScalewayRequest{ Method: "GET", - Path: "/edge-services/v1alpha1/current-plan", - Query: query, + Path: "/edge-services/v1alpha1/current-plan/" + fmt.Sprint(req.ProjectID) + "", } var resp Plan @@ -2514,13 +2514,13 @@ func (s *API) DeleteCurrentPlan(req *DeleteCurrentPlanRequest, opts ...scw.Reque req.ProjectID = defaultProjectID } - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) + if fmt.Sprint(req.ProjectID) == "" { + return errors.New("field ProjectID cannot be empty in request") + } scwReq := &scw.ScalewayRequest{ Method: "DELETE", - Path: "/edge-services/v1alpha1/current-plan", - Query: query, + Path: "/edge-services/v1alpha1/current-plan/" + fmt.Sprint(req.ProjectID) + "", } err = s.client.Do(scwReq, nil, opts...) From 526fc672d97670080417a1ce07861ca9fd9a01cb Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 2 Oct 2024 08:32:01 +0200 Subject: [PATCH 006/163] chore(baremetal): remove lvm from partitioning (#2230) --- api/baremetal/v1/baremetal_sdk.go | 81 ------------------------------- 1 file changed, 81 deletions(-) diff --git a/api/baremetal/v1/baremetal_sdk.go b/api/baremetal/v1/baremetal_sdk.go index 4cfe0422e..8dcc693c1 100644 --- a/api/baremetal/v1/baremetal_sdk.go +++ b/api/baremetal/v1/baremetal_sdk.go @@ -390,55 +390,6 @@ func (enum *SchemaFilesystemFormat) UnmarshalJSON(data []byte) error { return nil } -type SchemaLogicalVolumeType string - -const ( - SchemaLogicalVolumeTypeUnknownRaidType = SchemaLogicalVolumeType("unknown_raid_type") - SchemaLogicalVolumeTypeStriped = SchemaLogicalVolumeType("striped") - SchemaLogicalVolumeTypeMirror = SchemaLogicalVolumeType("mirror") - SchemaLogicalVolumeTypeRaid0 = SchemaLogicalVolumeType("raid0") - SchemaLogicalVolumeTypeRaid1 = SchemaLogicalVolumeType("raid1") - SchemaLogicalVolumeTypeRaid5 = SchemaLogicalVolumeType("raid5") - SchemaLogicalVolumeTypeRaid6 = SchemaLogicalVolumeType("raid6") - SchemaLogicalVolumeTypeRaid10 = SchemaLogicalVolumeType("raid10") -) - -func (enum SchemaLogicalVolumeType) String() string { - if enum == "" { - // return default value if empty - return "unknown_raid_type" - } - return string(enum) -} - -func (enum SchemaLogicalVolumeType) Values() []SchemaLogicalVolumeType { - return []SchemaLogicalVolumeType{ - "unknown_raid_type", - "striped", - "mirror", - "raid0", - "raid1", - "raid5", - "raid6", - "raid10", - } -} - -func (enum SchemaLogicalVolumeType) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *SchemaLogicalVolumeType) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = SchemaLogicalVolumeType(SchemaLogicalVolumeType(tmp).String()) - return nil -} - type SchemaPartitionLabel string const ( @@ -451,7 +402,6 @@ const ( SchemaPartitionLabelData = SchemaPartitionLabel("data") SchemaPartitionLabelHome = SchemaPartitionLabel("home") SchemaPartitionLabelRaid = SchemaPartitionLabel("raid") - SchemaPartitionLabelLvm = SchemaPartitionLabel("lvm") SchemaPartitionLabelZfs = SchemaPartitionLabel("zfs") ) @@ -474,7 +424,6 @@ func (enum SchemaPartitionLabel) Values() []SchemaPartitionLabel { "data", "home", "raid", - "lvm", "zfs", } } @@ -885,20 +834,6 @@ func (enum *SettingType) UnmarshalJSON(data []byte) error { return nil } -// SchemaLogicalVolume: schema logical volume. -type SchemaLogicalVolume struct { - Name string `json:"name"` - - // Type: default value: unknown_raid_type - Type SchemaLogicalVolumeType `json:"type"` - - Size scw.Size `json:"size"` - - StripedNumber int32 `json:"striped_number"` - - MirrorNumber int32 `json:"mirror_number"` -} - // SchemaPartition: schema partition. type SchemaPartition struct { // Label: default value: unknown_partition_label @@ -909,15 +844,6 @@ type SchemaPartition struct { Size scw.Size `json:"size"` } -// SchemaVolumeGroup: schema volume group. -type SchemaVolumeGroup struct { - VolumeGroupName string `json:"volume_group_name"` - - PhysicalVolumes []string `json:"physical_volumes"` - - LogicalVolumes []*SchemaLogicalVolume `json:"logical_volumes"` -} - // SchemaPool: schema pool. type SchemaPool struct { Name string `json:"name"` @@ -949,11 +875,6 @@ type SchemaFilesystem struct { Mountpoint string `json:"mountpoint"` } -// SchemaLVM: schema lvm. -type SchemaLVM struct { - VolumeGroups []*SchemaVolumeGroup `json:"volume_groups"` -} - // SchemaRAID: schema raid. type SchemaRAID struct { Name string `json:"name"` @@ -999,8 +920,6 @@ type Schema struct { Filesystems []*SchemaFilesystem `json:"filesystems"` - Lvm *SchemaLVM `json:"lvm"` - Zfs *SchemaZFS `json:"zfs"` } From 2958268b47e491c13ff0e532d5ce35f7f4d7869f Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 2 Oct 2024 08:32:43 +0200 Subject: [PATCH 007/163] feat(baremetal): add support for XFS (#2231) --- api/baremetal/v1/baremetal_sdk.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/baremetal/v1/baremetal_sdk.go b/api/baremetal/v1/baremetal_sdk.go index 8dcc693c1..92ae72685 100644 --- a/api/baremetal/v1/baremetal_sdk.go +++ b/api/baremetal/v1/baremetal_sdk.go @@ -355,6 +355,7 @@ const ( SchemaFilesystemFormatExt4 = SchemaFilesystemFormat("ext4") SchemaFilesystemFormatSwap = SchemaFilesystemFormat("swap") SchemaFilesystemFormatZfs = SchemaFilesystemFormat("zfs") + SchemaFilesystemFormatXfs = SchemaFilesystemFormat("xfs") ) func (enum SchemaFilesystemFormat) String() string { @@ -372,6 +373,7 @@ func (enum SchemaFilesystemFormat) Values() []SchemaFilesystemFormat { "ext4", "swap", "zfs", + "xfs", } } From a8ef3b17d259d0c66d21fe277cac114d454af1c1 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 3 Oct 2024 15:05:08 +0200 Subject: [PATCH 008/163] docs(instance): change server terminate documentation (#2232) --- api/instance/v1/instance_sdk.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index adfc29221..3be7c4c59 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -4576,12 +4576,11 @@ func (s *API) ListServerActions(req *ListServerActionsRequest, opts ...scw.Reque // * `stop_in_place`: Stop the Instance, but keep the slot on the hypervisor. // * `reboot`: Stop the instance and restart it. // * `backup`: Create an image with all the volumes of an Instance. -// * `terminate`: Delete the Instance along with all attached volumes. +// * `terminate`: Delete the Instance along with its attached volumes, except for SBS volumes. // * `enable_routed_ip`: Migrate the Instance to the new network stack. // -// Keep in mind that terminating an Instance will result in the deletion of all attached volumes, including local and block storage. -// If you want to preserve your local volumes, you should use the `archive` action instead of `terminate`. Similarly, if you want to keep your block storage volumes, you must first detach them before issuing the `terminate` command. -// For more information, read the [Volumes](#path-volumes-list-volumes) documentation. +// Keep in mind that `terminate` an Instance will result in the deletion of `l_ssd`, `b_ssd` and `scratch` volumes types, `sbs_volume` volumes type will only be detached. +// If you want to preserve your volumes, you should detach them before the Instance deletion or `terminate` action. func (s *API) ServerAction(req *ServerActionRequest, opts ...scw.RequestOption) (*ServerActionResponse, error) { var err error From a80efc7ba22246f26fc1011b048b519a5f340ff5 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 3 Oct 2024 15:52:37 +0200 Subject: [PATCH 009/163] chore(baremetal): remove exclude on partitioning schema type (#2234) --- api/baremetal/v1/baremetal_sdk.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/api/baremetal/v1/baremetal_sdk.go b/api/baremetal/v1/baremetal_sdk.go index 92ae72685..d63b03dc1 100644 --- a/api/baremetal/v1/baremetal_sdk.go +++ b/api/baremetal/v1/baremetal_sdk.go @@ -1087,6 +1087,9 @@ type ServerInstall struct { // ServiceURL: address of the installed service. ServiceURL string `json:"service_url"` + + // PartitioningSchema: partitioning schema. + PartitioningSchema *Schema `json:"partitioning_schema"` } // ServerOption: server option. @@ -1159,6 +1162,9 @@ type CreateServerRequestInstall struct { // ServicePassword: password used for the service to install. ServicePassword *string `json:"service_password"` + + // PartitioningSchema: partitioning schema. + PartitioningSchema *Schema `json:"partitioning_schema"` } // OS: os. @@ -1614,6 +1620,9 @@ type InstallServerRequest struct { // ServicePassword: password used for the service to install. ServicePassword *string `json:"service_password,omitempty"` + + // PartitioningSchema: partitioning schema. + PartitioningSchema *Schema `json:"partitioning_schema,omitempty"` } // ListOSRequest: list os request. From 36a8266bfdcbeafed82260e62da5e891c688aeff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jules=20Cast=C3=A9ran?= Date: Fri, 4 Oct 2024 11:09:18 +0200 Subject: [PATCH 010/163] fix(scw): decimal json representation (#2235) --- scw/custom_types.go | 21 +++++++++++++++++++++ scw/custom_types_test.go | 17 +++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/scw/custom_types.go b/scw/custom_types.go index e39bd71d7..40fe23a0f 100644 --- a/scw/custom_types.go +++ b/scw/custom_types.go @@ -460,3 +460,24 @@ var _ fmt.Stringer = (*Decimal)(nil) func (d Decimal) String() string { return string(d) } + +func (d Decimal) MarshalJSON() ([]byte, error) { + return json.Marshal(map[string]interface{}{ + "value": d.String(), + }) +} + +func (d *Decimal) UnmarshalJSON(b []byte) error { + m := struct { + Value string `json:"value"` + }{} + + err := json.Unmarshal(b, &m) + if err != nil { + return err + } + + *d = Decimal(m.Value) + + return nil +} diff --git a/scw/custom_types_test.go b/scw/custom_types_test.go index d8efcd19d..5f86fb0f3 100644 --- a/scw/custom_types_test.go +++ b/scw/custom_types_test.go @@ -841,3 +841,20 @@ func TestDecimal(t *testing.T) { *dPtr = "1.22" testhelpers.Equals(t, "1.22", dPtr.String()) } + +func TestDecimal_MarshalJSON(t *testing.T) { + d := Decimal("1.22") + testhelpers.Equals(t, "1.22", d.String()) + + value, err := json.Marshal(d) + testhelpers.AssertNoError(t, err) + testhelpers.Equals(t, "{\"value\":\"1.22\"}", string(value)) +} + +func TestDecimal_UnmarshalJSON(t *testing.T) { + value := "{\"value\":\"1.22\"}" + d := new(Decimal) + err := json.Unmarshal([]byte(value), d) + testhelpers.AssertNoError(t, err) + testhelpers.Equals(t, "1.22", d.String()) +} From 341bb81754f85d5f76f14d863970c1acef350c19 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 4 Oct 2024 15:41:57 +0200 Subject: [PATCH 011/163] feat(baremetal): enable bmaas pn v3 (#2236) --- api/baremetal/v3/baremetal_sdk.go | 421 ++++++++++++++++++++++++++++++ 1 file changed, 421 insertions(+) create mode 100644 api/baremetal/v3/baremetal_sdk.go diff --git a/api/baremetal/v3/baremetal_sdk.go b/api/baremetal/v3/baremetal_sdk.go new file mode 100644 index 000000000..a1a96f533 --- /dev/null +++ b/api/baremetal/v3/baremetal_sdk.go @@ -0,0 +1,421 @@ +// This file was automatically generated. DO NOT EDIT. +// If you have any remark or suggestion do not hesitate to open an issue. + +// Package baremetal provides methods and message types of the baremetal v3 API. +package baremetal + +import ( + "bytes" + "encoding/json" + "fmt" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/scaleway/scaleway-sdk-go/errors" + "github.com/scaleway/scaleway-sdk-go/marshaler" + "github.com/scaleway/scaleway-sdk-go/namegenerator" + "github.com/scaleway/scaleway-sdk-go/parameter" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +// always import dependencies +var ( + _ fmt.Stringer + _ json.Unmarshaler + _ url.URL + _ net.IP + _ http.Header + _ bytes.Reader + _ time.Time + _ = strings.Join + + _ scw.ScalewayRequest + _ marshaler.Duration + _ scw.File + _ = parameter.AddToQuery + _ = namegenerator.GetRandomName +) + +type ListServerPrivateNetworksRequestOrderBy string + +const ( + ListServerPrivateNetworksRequestOrderByCreatedAtAsc = ListServerPrivateNetworksRequestOrderBy("created_at_asc") + ListServerPrivateNetworksRequestOrderByCreatedAtDesc = ListServerPrivateNetworksRequestOrderBy("created_at_desc") + ListServerPrivateNetworksRequestOrderByUpdatedAtAsc = ListServerPrivateNetworksRequestOrderBy("updated_at_asc") + ListServerPrivateNetworksRequestOrderByUpdatedAtDesc = ListServerPrivateNetworksRequestOrderBy("updated_at_desc") +) + +func (enum ListServerPrivateNetworksRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListServerPrivateNetworksRequestOrderBy) Values() []ListServerPrivateNetworksRequestOrderBy { + return []ListServerPrivateNetworksRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "updated_at_asc", + "updated_at_desc", + } +} + +func (enum ListServerPrivateNetworksRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListServerPrivateNetworksRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListServerPrivateNetworksRequestOrderBy(ListServerPrivateNetworksRequestOrderBy(tmp).String()) + return nil +} + +type ServerPrivateNetworkStatus string + +const ( + ServerPrivateNetworkStatusUnknownStatus = ServerPrivateNetworkStatus("unknown_status") + ServerPrivateNetworkStatusAttaching = ServerPrivateNetworkStatus("attaching") + ServerPrivateNetworkStatusAttached = ServerPrivateNetworkStatus("attached") + ServerPrivateNetworkStatusError = ServerPrivateNetworkStatus("error") + ServerPrivateNetworkStatusDetaching = ServerPrivateNetworkStatus("detaching") + ServerPrivateNetworkStatusLocked = ServerPrivateNetworkStatus("locked") +) + +func (enum ServerPrivateNetworkStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum ServerPrivateNetworkStatus) Values() []ServerPrivateNetworkStatus { + return []ServerPrivateNetworkStatus{ + "unknown_status", + "attaching", + "attached", + "error", + "detaching", + "locked", + } +} + +func (enum ServerPrivateNetworkStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ServerPrivateNetworkStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ServerPrivateNetworkStatus(ServerPrivateNetworkStatus(tmp).String()) + return nil +} + +// ServerPrivateNetwork: server private network. +type ServerPrivateNetwork struct { + // ID: UUID of the Server-to-Private Network mapping. + ID string `json:"id"` + + // ProjectID: private Network Project UUID. + ProjectID string `json:"project_id"` + + // ServerID: server UUID. + ServerID string `json:"server_id"` + + // PrivateNetworkID: private Network UUID. + PrivateNetworkID string `json:"private_network_id"` + + // Vlan: vLAN UUID associated with the Private Network. + Vlan *uint32 `json:"vlan"` + + // Status: configuration status of the Private Network. + // Default value: unknown_status + Status ServerPrivateNetworkStatus `json:"status"` + + // CreatedAt: private Network creation date. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: date the Private Network was last modified. + UpdatedAt *time.Time `json:"updated_at"` + + // IpamIPIDs: iPAM IP IDs of the server, if it has any. + IpamIPIDs []string `json:"ipam_ip_ids"` +} + +// ListServerPrivateNetworksResponse: list server private networks response. +type ListServerPrivateNetworksResponse struct { + ServerPrivateNetworks []*ServerPrivateNetwork `json:"server_private_networks"` + + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListServerPrivateNetworksResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListServerPrivateNetworksResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListServerPrivateNetworksResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.ServerPrivateNetworks = append(r.ServerPrivateNetworks, results.ServerPrivateNetworks...) + r.TotalCount += uint64(len(results.ServerPrivateNetworks)) + return uint64(len(results.ServerPrivateNetworks)), nil +} + +// PrivateNetworkAPIAddServerPrivateNetworkRequest: private network api add server private network request. +type PrivateNetworkAPIAddServerPrivateNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ServerID: UUID of the server. + ServerID string `json:"-"` + + // PrivateNetworkID: UUID of the Private Network. + PrivateNetworkID string `json:"private_network_id"` + + // IpamIPIDs: iPAM IDs of an IPs to attach to the server. + IpamIPIDs []string `json:"ipam_ip_ids"` +} + +// PrivateNetworkAPIDeleteServerPrivateNetworkRequest: private network api delete server private network request. +type PrivateNetworkAPIDeleteServerPrivateNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ServerID: UUID of the server. + ServerID string `json:"-"` + + // PrivateNetworkID: UUID of the Private Network. + PrivateNetworkID string `json:"-"` +} + +// PrivateNetworkAPIListServerPrivateNetworksRequest: private network api list server private networks request. +type PrivateNetworkAPIListServerPrivateNetworksRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // OrderBy: sort order for the returned Private Networks. + // Default value: created_at_asc + OrderBy ListServerPrivateNetworksRequestOrderBy `json:"-"` + + // Page: page number for the returned Private Networks. + Page *int32 `json:"-"` + + // PageSize: maximum number of Private Networks per page. + PageSize *uint32 `json:"-"` + + // ServerID: filter Private Networks by server UUID. + ServerID *string `json:"-"` + + // PrivateNetworkID: filter Private Networks by Private Network UUID. + PrivateNetworkID *string `json:"-"` + + // OrganizationID: filter Private Networks by organization UUID. + OrganizationID *string `json:"-"` + + // ProjectID: filter Private Networks by project UUID. + ProjectID *string `json:"-"` + + // IpamIPIDs: filter Private Networks by IPAM IP UUIDs. + IpamIPIDs []string `json:"-"` +} + +// PrivateNetworkAPISetServerPrivateNetworksRequest: private network api set server private networks request. +type PrivateNetworkAPISetServerPrivateNetworksRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ServerID: UUID of the server. + ServerID string `json:"-"` + + // PerPrivateNetworkIpamIPIDs: object where the keys are the UUIDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Elastic Metal server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + PerPrivateNetworkIpamIPIDs map[string]*[]string `json:"per_private_network_ipam_ip_ids"` +} + +// SetServerPrivateNetworksResponse: set server private networks response. +type SetServerPrivateNetworksResponse struct { + ServerPrivateNetworks []*ServerPrivateNetwork `json:"server_private_networks"` +} + +// Elastic Metal - Private Networks API. +type PrivateNetworkAPI struct { + client *scw.Client +} + +// NewPrivateNetworkAPI returns a PrivateNetworkAPI object from a Scaleway client. +func NewPrivateNetworkAPI(client *scw.Client) *PrivateNetworkAPI { + return &PrivateNetworkAPI{ + client: client, + } +} +func (s *PrivateNetworkAPI) Zones() []scw.Zone { + return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar2, scw.ZoneNlAms1, scw.ZoneNlAms2, scw.ZonePlWaw2, scw.ZonePlWaw3} +} + +// AddServerPrivateNetwork: Add an Elastic Metal server to a Private Network. +func (s *PrivateNetworkAPI) AddServerPrivateNetwork(req *PrivateNetworkAPIAddServerPrivateNetworkRequest, opts ...scw.RequestOption) (*ServerPrivateNetwork, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.ServerID) == "" { + return nil, errors.New("field ServerID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/baremetal/v3/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/private-networks", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp ServerPrivateNetwork + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// SetServerPrivateNetworks: Configure multiple Private Networks on an Elastic Metal server. +func (s *PrivateNetworkAPI) SetServerPrivateNetworks(req *PrivateNetworkAPISetServerPrivateNetworksRequest, opts ...scw.RequestOption) (*SetServerPrivateNetworksResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.ServerID) == "" { + return nil, errors.New("field ServerID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PUT", + Path: "/baremetal/v3/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/private-networks", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp SetServerPrivateNetworksResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListServerPrivateNetworks: List the Private Networks of an Elastic Metal server. +func (s *PrivateNetworkAPI) ListServerPrivateNetworks(req *PrivateNetworkAPIListServerPrivateNetworksRequest, opts ...scw.RequestOption) (*ListServerPrivateNetworksResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "server_id", req.ServerID) + parameter.AddToQuery(query, "private_network_id", req.PrivateNetworkID) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "ipam_ip_ids", req.IpamIPIDs) + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/baremetal/v3/zones/" + fmt.Sprint(req.Zone) + "/server-private-networks", + Query: query, + } + + var resp ListServerPrivateNetworksResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteServerPrivateNetwork: Delete a Private Network. +func (s *PrivateNetworkAPI) DeleteServerPrivateNetwork(req *PrivateNetworkAPIDeleteServerPrivateNetworkRequest, opts ...scw.RequestOption) error { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.ServerID) == "" { + return errors.New("field ServerID cannot be empty in request") + } + + if fmt.Sprint(req.PrivateNetworkID) == "" { + return errors.New("field PrivateNetworkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/baremetal/v3/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/private-networks/" + fmt.Sprint(req.PrivateNetworkID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From a30a4505441d8110e68a9a150b10a4ecf2e50252 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 4 Oct 2024 16:32:48 +0200 Subject: [PATCH 012/163] feat(tem): add auto-configuration state in domain validation (#2237) --- api/tem/v1alpha1/tem_sdk.go | 62 +++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/api/tem/v1alpha1/tem_sdk.go b/api/tem/v1alpha1/tem_sdk.go index 4fffc7116..b43fabacf 100644 --- a/api/tem/v1alpha1/tem_sdk.go +++ b/api/tem/v1alpha1/tem_sdk.go @@ -39,6 +39,48 @@ var ( _ = namegenerator.GetRandomName ) +type DomainLastStatusAutoconfigStateReason string + +const ( + // If not specified, the auto-configuration state is unknown by default. + DomainLastStatusAutoconfigStateReasonUnknownReason = DomainLastStatusAutoconfigStateReason("unknown_reason") + // The token doesn't have the necessary permissions to manage the domain's DNS records. + DomainLastStatusAutoconfigStateReasonPermissionDenied = DomainLastStatusAutoconfigStateReason("permission_denied") + // The domain does not exist or isn't manageable by the token. + DomainLastStatusAutoconfigStateReasonDomainNotFound = DomainLastStatusAutoconfigStateReason("domain_not_found") +) + +func (enum DomainLastStatusAutoconfigStateReason) String() string { + if enum == "" { + // return default value if empty + return "unknown_reason" + } + return string(enum) +} + +func (enum DomainLastStatusAutoconfigStateReason) Values() []DomainLastStatusAutoconfigStateReason { + return []DomainLastStatusAutoconfigStateReason{ + "unknown_reason", + "permission_denied", + "domain_not_found", + } +} + +func (enum DomainLastStatusAutoconfigStateReason) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *DomainLastStatusAutoconfigStateReason) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = DomainLastStatusAutoconfigStateReason(DomainLastStatusAutoconfigStateReason(tmp).String()) + return nil +} + type DomainLastStatusRecordStatus string const ( @@ -769,6 +811,19 @@ type Email struct { Flags []EmailFlag `json:"flags"` } +// DomainLastStatusAutoconfigState: domain last status autoconfig state. +type DomainLastStatusAutoconfigState struct { + // Enabled: enable or disable the auto-configuration of domain DNS records. + Enabled bool `json:"enabled"` + + // Autoconfigurable: whether the domain can be auto-configured or not. + Autoconfigurable bool `json:"autoconfigurable"` + + // Reason: the reason that the domain cannot be auto-configurable. + // Default value: unknown_reason + Reason *DomainLastStatusAutoconfigStateReason `json:"reason"` +} + // DomainLastStatusDkimRecord: domain last status dkim record. type DomainLastStatusDkimRecord struct { // Status: status of the DKIM record's configuration. @@ -952,11 +1007,11 @@ type UpdateProjectSettingsRequestUpdatePeriodicReport struct { // Enabled: (Optional) Enable or disable periodic report notifications. Enabled *bool `json:"enabled"` - // Frequency: (Optional) At which frequency you receive periodic report notifications. + // Frequency: (Optional) Frequency at which you receive periodic report notifications. // Default value: unknown_frequency Frequency *ProjectSettingsPeriodicReportFrequency `json:"frequency"` - // SendingHour: (Optional) At which hour you receive periodic report notifications. + // SendingHour: (Optional) Hour at which you receive periodic report notifications. SendingHour *uint32 `json:"sending_hour"` // SendingDay: (Optional) On which day you receive periodic report notifications (1-7 weekly, 1-28 monthly). @@ -1090,6 +1145,9 @@ type DomainLastStatus struct { // DmarcRecord: the DMARC record verification data. DmarcRecord *DomainLastStatusDmarcRecord `json:"dmarc_record"` + + // AutoconfigState: the verification state of domain auto-configuration. + AutoconfigState *DomainLastStatusAutoconfigState `json:"autoconfig_state"` } // GetDomainLastStatusRequest: get domain last status request. From 951a53eb32210ace0e560781cd427a58c01051f8 Mon Sep 17 00:00:00 2001 From: Yacine Fodil <105779815+yfodil@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:23:43 +0200 Subject: [PATCH 013/163] feat(baremetal): add private networks waiter (#2240) --- api/baremetal/v3/server_utils.go | 69 ++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 api/baremetal/v3/server_utils.go diff --git a/api/baremetal/v3/server_utils.go b/api/baremetal/v3/server_utils.go new file mode 100644 index 000000000..57f8e3b1b --- /dev/null +++ b/api/baremetal/v3/server_utils.go @@ -0,0 +1,69 @@ +package baremetal + +import ( + "time" + + "github.com/scaleway/scaleway-sdk-go/errors" + "github.com/scaleway/scaleway-sdk-go/internal/async" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +const ( + defaultRetryInterval = 15 * time.Second + defaultTimeout = 2 * time.Hour +) + +// WaitForServerPrivateNetworksRequest is used by WaitForServerPrivateNetworks method. +type WaitForServerPrivateNetworksRequest struct { + ServerID string + Zone scw.Zone + Timeout *time.Duration + RetryInterval *time.Duration +} + +// WaitForServerPrivateNetworks wait for all server private networks to be in a "terminal state" before returning. +// This function can be used to wait for all server private networks to be set. +func (s *PrivateNetworkAPI) WaitForServerPrivateNetworks(req *WaitForServerPrivateNetworksRequest, opts ...scw.RequestOption) ([]*ServerPrivateNetwork, error) { + timeout := defaultTimeout + if req.Timeout != nil { + timeout = *req.Timeout + } + retryInterval := defaultRetryInterval + if req.RetryInterval != nil { + retryInterval = *req.RetryInterval + } + + terminalStatus := map[ServerPrivateNetworkStatus]struct{}{ + ServerPrivateNetworkStatusAttached: {}, + ServerPrivateNetworkStatusError: {}, + ServerPrivateNetworkStatusUnknownStatus: {}, + ServerPrivateNetworkStatusLocked: {}, + } + + serverPrivateNetwork, err := async.WaitSync(&async.WaitSyncConfig{ + Get: func() (interface{}, bool, error) { + res, err := s.ListServerPrivateNetworks(&PrivateNetworkAPIListServerPrivateNetworksRequest{ + ServerID: &req.ServerID, + Zone: req.Zone, + }, opts...) + if err != nil { + return nil, false, err + } + + for i := range res.ServerPrivateNetworks { + _, isTerminal := terminalStatus[res.ServerPrivateNetworks[i].Status] + if !isTerminal { + return res.ServerPrivateNetworks, isTerminal, nil + } + } + return res.ServerPrivateNetworks, true, err + }, + Timeout: timeout, + IntervalStrategy: async.LinearIntervalStrategy(retryInterval), + }) + if err != nil { + return nil, errors.Wrap(err, "waiting for server private networks failed") + } + + return serverPrivateNetwork.([]*ServerPrivateNetwork), nil +} From 1d96f07b04252aa464969a1a1323a70bf2bea0e5 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 7 Oct 2024 17:24:13 +0200 Subject: [PATCH 014/163] feat(serverless_jobs): enable sdk for secrets (#2239) --- api/jobs/v1alpha1/jobs_sdk.go | 302 ++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) diff --git a/api/jobs/v1alpha1/jobs_sdk.go b/api/jobs/v1alpha1/jobs_sdk.go index 8153dd570..38dc2cb77 100644 --- a/api/jobs/v1alpha1/jobs_sdk.go +++ b/api/jobs/v1alpha1/jobs_sdk.go @@ -162,6 +162,16 @@ func (enum *ListJobRunsRequestOrderBy) UnmarshalJSON(data []byte) error { return nil } +// SecretEnvVar: secret env var. +type SecretEnvVar struct { + Name string `json:"name"` +} + +// SecretFile: secret file. +type SecretFile struct { + Path string `json:"path"` +} + // CronSchedule: cron schedule. type CronSchedule struct { // Schedule: uNIX cron schedule to run job (e.g., '* * * * *'). @@ -178,6 +188,34 @@ type CreateJobDefinitionRequestCronScheduleConfig struct { Timezone string `json:"timezone"` } +// CreateJobDefinitionSecretsRequestSecretConfig: create job definition secrets request secret config. +type CreateJobDefinitionSecretsRequestSecretConfig struct { + SecretManagerID string `json:"secret_manager_id"` + + SecretManagerVersion string `json:"secret_manager_version"` + + // Precisely one of Path, EnvVarName must be set. + Path *string `json:"path,omitempty"` + + // Precisely one of Path, EnvVarName must be set. + EnvVarName *string `json:"env_var_name,omitempty"` +} + +// Secret: secret. +type Secret struct { + SecretID string `json:"secret_id"` + + SecretManagerID string `json:"secret_manager_id"` + + SecretManagerVersion string `json:"secret_manager_version"` + + // Precisely one of File, EnvVar must be set. + File *SecretFile `json:"file,omitempty"` + + // Precisely one of File, EnvVar must be set. + EnvVar *SecretEnvVar `json:"env_var,omitempty"` +} + // JobDefinition: job definition. type JobDefinition struct { ID string `json:"id"` @@ -302,6 +340,23 @@ type CreateJobDefinitionRequest struct { CronSchedule *CreateJobDefinitionRequestCronScheduleConfig `json:"cron_schedule,omitempty"` } +// CreateJobDefinitionSecretsRequest: create job definition secrets request. +type CreateJobDefinitionSecretsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // JobDefinitionID: UUID of the job definition to get. + JobDefinitionID string `json:"-"` + + // Secrets: secrets to inject into the job. + Secrets []*CreateJobDefinitionSecretsRequestSecretConfig `json:"secrets"` +} + +// CreateJobDefinitionSecretsResponse: create job definition secrets response. +type CreateJobDefinitionSecretsResponse struct { + Secrets []*Secret `json:"secrets"` +} + // DeleteJobDefinitionRequest: delete job definition request. type DeleteJobDefinitionRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -311,6 +366,16 @@ type DeleteJobDefinitionRequest struct { JobDefinitionID string `json:"-"` } +// DeleteJobDefinitionSecretRequest: delete job definition secret request. +type DeleteJobDefinitionSecretRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + JobDefinitionID string `json:"-"` + + SecretID string `json:"-"` +} + // GetJobDefinitionRequest: get job definition request. type GetJobDefinitionRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -320,6 +385,16 @@ type GetJobDefinitionRequest struct { JobDefinitionID string `json:"-"` } +// GetJobDefinitionSecretRequest: get job definition secret request. +type GetJobDefinitionSecretRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + JobDefinitionID string `json:"-"` + + SecretID string `json:"-"` +} + // GetJobRunRequest: get job run request. type GetJobRunRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -329,6 +404,40 @@ type GetJobRunRequest struct { JobRunID string `json:"-"` } +// ListJobDefinitionSecretsRequest: list job definition secrets request. +type ListJobDefinitionSecretsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + JobDefinitionID string `json:"-"` +} + +// ListJobDefinitionSecretsResponse: list job definition secrets response. +type ListJobDefinitionSecretsResponse struct { + Secrets []*Secret `json:"secrets"` + + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListJobDefinitionSecretsResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListJobDefinitionSecretsResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListJobDefinitionSecretsResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Secrets = append(r.Secrets, results.Secrets...) + r.TotalCount += uint64(len(results.Secrets)) + return uint64(len(results.Secrets)), nil +} + // ListJobDefinitionsRequest: list job definitions request. type ListJobDefinitionsRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -498,6 +607,24 @@ type UpdateJobDefinitionRequest struct { CronSchedule *UpdateJobDefinitionRequestCronScheduleConfig `json:"cron_schedule,omitempty"` } +// UpdateJobDefinitionSecretRequest: update job definition secret request. +type UpdateJobDefinitionSecretRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + JobDefinitionID string `json:"-"` + + SecretID string `json:"-"` + + SecretManagerVersion *string `json:"secret_manager_version,omitempty"` + + // Precisely one of Path, EnvVarName must be set. + Path *string `json:"path,omitempty"` + + // Precisely one of Path, EnvVarName must be set. + EnvVarName *string `json:"env_var_name,omitempty"` +} + // This API allows you to manage your Serverless Jobs. type API struct { client *scw.Client @@ -726,6 +853,181 @@ func (s *API) StartJobDefinition(req *StartJobDefinitionRequest, opts ...scw.Req return &resp, nil } +// CreateJobDefinitionSecrets: +func (s *API) CreateJobDefinitionSecrets(req *CreateJobDefinitionSecretsRequest, opts ...scw.RequestOption) (*CreateJobDefinitionSecretsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.JobDefinitionID) == "" { + return nil, errors.New("field JobDefinitionID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/serverless-jobs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/job-definitions/" + fmt.Sprint(req.JobDefinitionID) + "/secrets", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp CreateJobDefinitionSecretsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetJobDefinitionSecret: +func (s *API) GetJobDefinitionSecret(req *GetJobDefinitionSecretRequest, opts ...scw.RequestOption) (*Secret, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.JobDefinitionID) == "" { + return nil, errors.New("field JobDefinitionID cannot be empty in request") + } + + if fmt.Sprint(req.SecretID) == "" { + return nil, errors.New("field SecretID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/serverless-jobs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/job-definitions/" + fmt.Sprint(req.JobDefinitionID) + "/secrets/" + fmt.Sprint(req.SecretID) + "", + } + + var resp Secret + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListJobDefinitionSecrets: +func (s *API) ListJobDefinitionSecrets(req *ListJobDefinitionSecretsRequest, opts ...scw.RequestOption) (*ListJobDefinitionSecretsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.JobDefinitionID) == "" { + return nil, errors.New("field JobDefinitionID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/serverless-jobs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/job-definitions/" + fmt.Sprint(req.JobDefinitionID) + "/secrets", + } + + var resp ListJobDefinitionSecretsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateJobDefinitionSecret: +func (s *API) UpdateJobDefinitionSecret(req *UpdateJobDefinitionSecretRequest, opts ...scw.RequestOption) (*Secret, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.JobDefinitionID) == "" { + return nil, errors.New("field JobDefinitionID cannot be empty in request") + } + + if fmt.Sprint(req.SecretID) == "" { + return nil, errors.New("field SecretID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/serverless-jobs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/job-definitions/" + fmt.Sprint(req.JobDefinitionID) + "/secrets/" + fmt.Sprint(req.SecretID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Secret + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteJobDefinitionSecret: +func (s *API) DeleteJobDefinitionSecret(req *DeleteJobDefinitionSecretRequest, opts ...scw.RequestOption) error { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.JobDefinitionID) == "" { + return errors.New("field JobDefinitionID cannot be empty in request") + } + + if fmt.Sprint(req.SecretID) == "" { + return errors.New("field SecretID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/serverless-jobs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/job-definitions/" + fmt.Sprint(req.JobDefinitionID) + "/secrets/" + fmt.Sprint(req.SecretID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} + // GetJobRun: Get a job run by its unique identifier. func (s *API) GetJobRun(req *GetJobRunRequest, opts ...scw.RequestOption) (*JobRun, error) { var err error From b464c29947f7c1cede36054cafb998be971ba43f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:24:34 +0200 Subject: [PATCH 015/163] chore(deps): bump golang.org/x/text from 0.18.0 to 0.19.0 (#2238) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ff521b750..cdb9a1f34 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,6 @@ go 1.17 require ( github.com/dnaeon/go-vcr v1.2.0 - golang.org/x/text v0.18.0 + golang.org/x/text v0.19.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 347b4021e..a295c9d77 100644 --- a/go.sum +++ b/go.sum @@ -54,8 +54,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= From db8df6f16e97aadcb29a1bef0e6c2f1bbed90a99 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 9 Oct 2024 10:21:45 +0200 Subject: [PATCH 016/163] feat(iam): add support for Managed, Deletable and Editable property (#2241) --- api/iam/v1alpha1/iam_sdk.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 23ba86043..a21f3d238 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -881,6 +881,9 @@ type APIKey struct { // Editable: defines whether or not the API key is editable. Editable bool `json:"editable"` + // Managed: defines whether or not the API key is managed. + Managed bool `json:"managed"` + // CreationIP: IP address of the device that created the API key. CreationIP string `json:"creation_ip"` } @@ -908,6 +911,12 @@ type Application struct { // Editable: defines whether or not the application is editable. Editable bool `json:"editable"` + // Deletable: defines whether or not the application is deletable. + Deletable bool `json:"deletable"` + + // Managed: defines whether or not the application is managed. + Managed bool `json:"managed"` + // NbAPIKeys: number of API keys attributed to the application. NbAPIKeys uint32 `json:"nb_api_keys"` @@ -943,6 +952,15 @@ type Group struct { // Tags: tags associated to the group. Tags []string `json:"tags"` + + // Editable: defines whether or not the group is editable. + Editable bool `json:"editable"` + + // Deletable: defines whether or not the group is deletable. + Deletable bool `json:"deletable"` + + // Managed: defines whether or not the group is managed. + Managed bool `json:"managed"` } // Log: log. @@ -1019,6 +1037,12 @@ type Policy struct { // Editable: defines whether or not a policy is editable. Editable bool `json:"editable"` + // Deletable: defines whether or not a policy is deletable. + Deletable bool `json:"deletable"` + + // Managed: defines whether or not a policy is managed. + Managed bool `json:"managed"` + // NbRules: number of rules of the policy. NbRules uint32 `json:"nb_rules"` From 3d425c15e092ac2f0c72733aadfaf7f96132e6c8 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 9 Oct 2024 10:22:05 +0200 Subject: [PATCH 017/163] feat(edge_services): add GetCurrentBilling endpoint (#2242) --- .../v1alpha1/edge_services_sdk.go | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index 76d56c620..61daa2528 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -924,11 +924,14 @@ type CheckPEMChainRequestSecretChain struct { // PlanDetails: plan details. type PlanDetails struct { - // PlanName: default value: unknown_name + // PlanName: subscription plan name. + // Default value: unknown_name PlanName PlanName `json:"plan_name"` + // PackageGb: amount of egress data from cache included in subscription plan. PackageGb uint64 `json:"package_gb"` + // PipelineLimit: number of pipeline included in subscription plan. PipelineLimit uint32 `json:"pipeline_limit"` } @@ -1149,6 +1152,38 @@ type GetBackendStageRequest struct { BackendStageID string `json:"-"` } +// GetBillingRequest: get billing request. +type GetBillingRequest struct { + ProjectID string `json:"-"` +} + +// GetBillingResponse: get billing response. +type GetBillingResponse struct { + // CurrentPlan: information on the current edge-service subscription plan. + CurrentPlan *PlanDetails `json:"current_plan"` + + // PlanCost: price of the current subscription plan. + PlanCost *scw.Money `json:"plan_cost"` + + // PipelineNumber: total number of pipeline currently configured. + PipelineNumber uint32 `json:"pipeline_number"` + + // ExtraPipelinesCost: cost to date of the pipelines not included in the plans. + ExtraPipelinesCost *scw.Money `json:"extra_pipelines_cost"` + + // CurrentPlanCacheUsage: total amount of data egressed from cache in current subscription plan. + CurrentPlanCacheUsage uint64 `json:"current_plan_cache_usage"` + + // ExtraCacheUsage: total amount of data egressed from cache not included in the plans. + ExtraCacheUsage uint64 `json:"extra_cache_usage"` + + // ExtraCacheCost: cost to date of the data egressed from cache not included in the plans. + ExtraCacheCost *scw.Money `json:"extra_cache_cost"` + + // TotalCost: total cost to date of edge-service product for the month including current plan, previous plans, extra pipelines and extra egress cache data. + TotalCost *scw.Money `json:"total_cost"` +} + // GetCacheStageRequest: get cache stage request. type GetCacheStageRequest struct { // CacheStageID: ID of the requested cache stage. @@ -2529,3 +2564,30 @@ func (s *API) DeleteCurrentPlan(req *DeleteCurrentPlanRequest, opts ...scw.Reque } return nil } + +// GetBilling: Gives information on current edge-services subscription plan and used resources with associated price. +func (s *API) GetBilling(req *GetBillingRequest, opts ...scw.RequestOption) (*GetBillingResponse, error) { + var err error + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + if fmt.Sprint(req.ProjectID) == "" { + return nil, errors.New("field ProjectID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/edge-services/v1alpha1/billing/" + fmt.Sprint(req.ProjectID) + "", + } + + var resp GetBillingResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From b221f1c40e8282ad8a54ae17ac1fb45ba313aa90 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 15 Oct 2024 11:27:11 +0200 Subject: [PATCH 018/163] feat(dedibox): add new memory type (#2243) --- api/dedibox/v1/dedibox_sdk.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/dedibox/v1/dedibox_sdk.go b/api/dedibox/v1/dedibox_sdk.go index 592950f0e..670b3fd18 100644 --- a/api/dedibox/v1/dedibox_sdk.go +++ b/api/dedibox/v1/dedibox_sdk.go @@ -1506,6 +1506,7 @@ const ( MemoryTypeDdr2 = MemoryType("ddr2") MemoryTypeDdr3 = MemoryType("ddr3") MemoryTypeDdr4 = MemoryType("ddr4") + MemoryTypeDdr5 = MemoryType("ddr5") ) func (enum MemoryType) String() string { @@ -1521,6 +1522,7 @@ func (enum MemoryType) Values() []MemoryType { "ddr2", "ddr3", "ddr4", + "ddr5", } } From 2e7705e87253a10d4969077837fb7c285dc87ff4 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 15 Oct 2024 16:44:41 +0200 Subject: [PATCH 019/163] feat(iam): add deletable on api keys (#2244) --- api/iam/v1alpha1/iam_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index a21f3d238..0c686faf4 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -881,6 +881,9 @@ type APIKey struct { // Editable: defines whether or not the API key is editable. Editable bool `json:"editable"` + // Deletable: defines whether or not the API key is deletable. + Deletable bool `json:"deletable"` + // Managed: defines whether or not the API key is managed. Managed bool `json:"managed"` From d2c643ed031fd588c2a0509506ad3b7d7cda567f Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 15 Oct 2024 17:02:28 +0200 Subject: [PATCH 020/163] feat(apple_silicon): add public flag for server delivery (#2251) Co-authored-by: Jonathan R. --- api/applesilicon/v1alpha1/applesilicon_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/applesilicon/v1alpha1/applesilicon_sdk.go b/api/applesilicon/v1alpha1/applesilicon_sdk.go index 973987d2f..0973f6158 100644 --- a/api/applesilicon/v1alpha1/applesilicon_sdk.go +++ b/api/applesilicon/v1alpha1/applesilicon_sdk.go @@ -314,6 +314,9 @@ type Server struct { // Zone: zone of the server. Zone scw.Zone `json:"zone"` + + // Delivered: set to true once the server has completed its provisioning steps and is ready to use. Some OS configurations might require a reinstallation of the server before delivery depending on the available stock. A reinstallation after the initial delivery will not change this flag and can be tracked using the server status. + Delivered bool `json:"delivered"` } // CreateServerRequest: create server request. From 0916311bf757492a314f4e0c5f19dedc9f5e86d0 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 16 Oct 2024 09:38:27 +0200 Subject: [PATCH 021/163] fix(instance): remove deprecated bootscript documentation (#2245) Co-authored-by: Jules Casteran --- api/instance/v1/instance_sdk.go | 162 +----------------------------- api/instance/v1/instance_utils.go | 6 -- 2 files changed, 5 insertions(+), 163 deletions(-) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index 3be7c4c59..c75f29fc7 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -1204,41 +1204,30 @@ type ServerSummary struct { // Bootscript: bootscript. type Bootscript struct { - // Bootcmdargs: bootscript arguments. + // Architecture: default value: unknown_arch + Architecture Arch `json:"architecture"` + Bootcmdargs string `json:"bootcmdargs"` - // Default: display if the bootscript is the default bootscript (if no other boot option is configured). Default bool `json:"default"` - // Dtb: provide information regarding a Device Tree Binary (DTB) for use with C1 servers. Dtb string `json:"dtb"` - // ID: bootscript ID. ID string `json:"id"` - // Initrd: initrd (initial ramdisk) configuration. Initrd string `json:"initrd"` - // Kernel: instance kernel version. Kernel string `json:"kernel"` - // Organization: bootscript Organization ID. Organization string `json:"organization"` - // Project: bootscript Project ID. - Project string `json:"project"` - - // Public: provide information if the bootscript is public. Public bool `json:"public"` - // Title: bootscript title. Title string `json:"title"` - // Architecture: bootscript architecture. - // Default value: unknown_arch - Architecture Arch `json:"architecture"` + Project string `json:"project"` - // Zone: zone in which the bootscript is located. + // Zone: zone to target. If none is passed will use default zone from the config. Zone scw.Zone `json:"zone"` } @@ -1635,9 +1624,6 @@ type Server struct { // Deprecated: IPv6: instance IPv6 address (deprecated when `routed_ip_enabled` is `True`). IPv6 *ServerIPv6 `json:"ipv6"` - // Deprecated: Bootscript: instance bootscript. - Bootscript *Bootscript `json:"bootscript"` - // BootType: instance boot type. // Default value: local BootType BootType `json:"boot_type"` @@ -2164,9 +2150,6 @@ type CreateImageRequest struct { // Default value: unknown_arch Arch Arch `json:"arch,omitempty"` - // Deprecated: DefaultBootscript: default bootscript of the image. - DefaultBootscript *string `json:"default_bootscript,omitempty"` - // ExtraVolumes: additional volumes of the image. ExtraVolumes map[string]*VolumeTemplate `json:"extra_volumes,omitempty"` @@ -2372,9 +2355,6 @@ type CreateServerRequest struct { // Default value: local BootType *BootType `json:"boot_type,omitempty"` - // Deprecated: Bootscript: bootscript ID to use when `boot_type` is set to `bootscript`. - Bootscript *string `json:"bootscript,omitempty"` - // Deprecated: Organization: instance Organization ID. // Precisely one of Project, Organization must be set. Organization *string `json:"organization,omitempty"` @@ -2613,19 +2593,6 @@ type ExportSnapshotResponse struct { Task *Task `json:"task"` } -// GetBootscriptRequest: get bootscript request. -type GetBootscriptRequest struct { - // Zone: zone to target. If none is passed will use default zone from the config. - Zone scw.Zone `json:"-"` - - BootscriptID string `json:"-"` -} - -// GetBootscriptResponse: get bootscript response. -type GetBootscriptResponse struct { - Bootscript *Bootscript `json:"bootscript"` -} - // GetDashboardRequest: get dashboard request. type GetDashboardRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -2830,52 +2797,6 @@ type GetVolumeResponse struct { Volume *Volume `json:"volume"` } -// ListBootscriptsRequest: list bootscripts request. -type ListBootscriptsRequest struct { - // Zone: zone to target. If none is passed will use default zone from the config. - Zone scw.Zone `json:"-"` - - Arch *string `json:"-"` - - Title *string `json:"-"` - - Default *bool `json:"-"` - - Public *bool `json:"-"` - - PerPage *uint32 `json:"-"` - - Page *int32 `json:"-"` -} - -// ListBootscriptsResponse: list bootscripts response. -type ListBootscriptsResponse struct { - // TotalCount: total number of bootscripts. - TotalCount uint32 `json:"total_count"` - - // Bootscripts: list of bootscripts. - Bootscripts []*Bootscript `json:"bootscripts"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListBootscriptsResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListBootscriptsResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListBootscriptsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Bootscripts = append(r.Bootscripts, results.Bootscripts...) - r.TotalCount += uint32(len(results.Bootscripts)) - return uint32(len(results.Bootscripts)), nil -} - // ListDefaultSecurityGroupRulesRequest: list default security group rules request. type ListDefaultSecurityGroupRulesRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -3860,9 +3781,6 @@ type UpdateServerRequest struct { Volumes *map[string]*VolumeServerTemplate `json:"volumes,omitempty"` - // Deprecated - Bootscript *string `json:"bootscript,omitempty"` - DynamicIPRequired *bool `json:"dynamic_ip_required,omitempty"` // Deprecated: RoutedIPEnabled: true to configure the instance so it uses the new routed IP mode (once this is set to True you cannot set it back to False). @@ -4111,9 +4029,6 @@ type setServerRequest struct { // Deprecated: IPv6: instance IPv6 address (deprecated when `routed_ip_enabled` is `True`). IPv6 *ServerIPv6 `json:"ipv6,omitempty"` - // Deprecated: Bootscript: instance bootscript. - Bootscript *Bootscript `json:"bootscript,omitempty"` - // BootType: instance boot type. // Default value: local BootType BootType `json:"boot_type"` @@ -6619,73 +6534,6 @@ func (s *API) DeletePrivateNIC(req *DeletePrivateNICRequest, opts ...scw.Request return nil } -// Deprecated: ListBootscripts: List bootscripts. -func (s *API) ListBootscripts(req *ListBootscriptsRequest, opts ...scw.RequestOption) (*ListBootscriptsResponse, error) { - var err error - - if req.Zone == "" { - defaultZone, _ := s.client.GetDefaultZone() - req.Zone = defaultZone - } - - query := url.Values{} - parameter.AddToQuery(query, "arch", req.Arch) - parameter.AddToQuery(query, "title", req.Title) - parameter.AddToQuery(query, "default", req.Default) - parameter.AddToQuery(query, "public", req.Public) - parameter.AddToQuery(query, "per_page", req.PerPage) - parameter.AddToQuery(query, "page", req.Page) - - if fmt.Sprint(req.Zone) == "" { - return nil, errors.New("field Zone cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/instance/v1/zones/" + fmt.Sprint(req.Zone) + "/bootscripts", - Query: query, - } - - var resp ListBootscriptsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: GetBootscript: Get details of a bootscript with the specified ID. -func (s *API) GetBootscript(req *GetBootscriptRequest, opts ...scw.RequestOption) (*GetBootscriptResponse, error) { - var err error - - if req.Zone == "" { - defaultZone, _ := s.client.GetDefaultZone() - req.Zone = defaultZone - } - - if fmt.Sprint(req.Zone) == "" { - return nil, errors.New("field Zone cannot be empty in request") - } - - if fmt.Sprint(req.BootscriptID) == "" { - return nil, errors.New("field BootscriptID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/instance/v1/zones/" + fmt.Sprint(req.Zone) + "/bootscripts/" + fmt.Sprint(req.BootscriptID) + "", - } - - var resp GetBootscriptResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - // GetDashboard: func (s *API) GetDashboard(req *GetDashboardRequest, opts ...scw.RequestOption) (*GetDashboardResponse, error) { var err error diff --git a/api/instance/v1/instance_utils.go b/api/instance/v1/instance_utils.go index d4c90523c..f7e5657b5 100644 --- a/api/instance/v1/instance_utils.go +++ b/api/instance/v1/instance_utils.go @@ -187,12 +187,6 @@ func (r *ListServersResponse) UnsafeSetTotalCount(totalCount int) { r.TotalCount = uint32(totalCount) } -// UnsafeSetTotalCount should not be used -// Internal usage only -func (r *ListBootscriptsResponse) UnsafeSetTotalCount(totalCount int) { - r.TotalCount = uint32(totalCount) -} - // UnsafeSetTotalCount should not be used // Internal usage only func (r *ListIPsResponse) UnsafeSetTotalCount(totalCount int) { From c0de89f245a4e17bcc9dc18602e2d6c121876780 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 16 Oct 2024 09:47:15 +0200 Subject: [PATCH 022/163] fix(edge_services): review billing wording (#2252) --- .../v1alpha1/edge_services_sdk.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index 61daa2528..38aafaa4b 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -931,7 +931,7 @@ type PlanDetails struct { // PackageGb: amount of egress data from cache included in subscription plan. PackageGb uint64 `json:"package_gb"` - // PipelineLimit: number of pipeline included in subscription plan. + // PipelineLimit: number of pipelines included in subscription plan. PipelineLimit uint32 `json:"pipeline_limit"` } @@ -1159,28 +1159,28 @@ type GetBillingRequest struct { // GetBillingResponse: get billing response. type GetBillingResponse struct { - // CurrentPlan: information on the current edge-service subscription plan. + // CurrentPlan: information on the currently-selected, active Edge Services subscription plan. CurrentPlan *PlanDetails `json:"current_plan"` // PlanCost: price of the current subscription plan. PlanCost *scw.Money `json:"plan_cost"` - // PipelineNumber: total number of pipeline currently configured. + // PipelineNumber: total number of pipelines currently configured. PipelineNumber uint32 `json:"pipeline_number"` - // ExtraPipelinesCost: cost to date of the pipelines not included in the plans. + // ExtraPipelinesCost: cost to date (this month) of pipelines not included in the subscription plan. ExtraPipelinesCost *scw.Money `json:"extra_pipelines_cost"` - // CurrentPlanCacheUsage: total amount of data egressed from cache in current subscription plan. + // CurrentPlanCacheUsage: total amount of data egressed from the cache (this month), included in the active subscription plan. CurrentPlanCacheUsage uint64 `json:"current_plan_cache_usage"` - // ExtraCacheUsage: total amount of data egressed from cache not included in the plans. + // ExtraCacheUsage: total amount of data egressed from cache (this month), not included in the active subscription plan. ExtraCacheUsage uint64 `json:"extra_cache_usage"` - // ExtraCacheCost: cost to date of the data egressed from cache not included in the plans. + // ExtraCacheCost: cost to date (this month) of the data egressed from the cache that is not included in the active subscription plan. ExtraCacheCost *scw.Money `json:"extra_cache_cost"` - // TotalCost: total cost to date of edge-service product for the month including current plan, previous plans, extra pipelines and extra egress cache data. + // TotalCost: total cost to date (this month) of all Edge Services resources including active subscription plan, previously active plans, extra pipelines and extra egress cache data. TotalCost *scw.Money `json:"total_cost"` } @@ -2565,7 +2565,7 @@ func (s *API) DeleteCurrentPlan(req *DeleteCurrentPlanRequest, opts ...scw.Reque return nil } -// GetBilling: Gives information on current edge-services subscription plan and used resources with associated price. +// GetBilling: Gives information on the currently selected Edge Services subscription plan, resource usage and associated billing information for this calendar month (including whether consumption falls within or exceeds the currently selected subscription plan.). func (s *API) GetBilling(req *GetBillingRequest, opts ...scw.RequestOption) (*GetBillingResponse, error) { var err error From cfe16eadece2d92d59d470eb41f21febaf63c8de Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 16 Oct 2024 09:49:15 +0200 Subject: [PATCH 023/163] feat(edge_services): add ListPipelinesWithStages (#2253) --- .../v1alpha1/edge_services_sdk.go | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index 38aafaa4b..ff0ceadd9 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -283,6 +283,47 @@ func (enum *ListPipelinesRequestOrderBy) UnmarshalJSON(data []byte) error { return nil } +type ListPipelinesWithStagesRequestOrderBy string + +const ( + ListPipelinesWithStagesRequestOrderByCreatedAtAsc = ListPipelinesWithStagesRequestOrderBy("created_at_asc") + ListPipelinesWithStagesRequestOrderByCreatedAtDesc = ListPipelinesWithStagesRequestOrderBy("created_at_desc") + ListPipelinesWithStagesRequestOrderByNameAsc = ListPipelinesWithStagesRequestOrderBy("name_asc") + ListPipelinesWithStagesRequestOrderByNameDesc = ListPipelinesWithStagesRequestOrderBy("name_desc") +) + +func (enum ListPipelinesWithStagesRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListPipelinesWithStagesRequestOrderBy) Values() []ListPipelinesWithStagesRequestOrderBy { + return []ListPipelinesWithStagesRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "name_asc", + "name_desc", + } +} + +func (enum ListPipelinesWithStagesRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListPipelinesWithStagesRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListPipelinesWithStagesRequestOrderBy(ListPipelinesWithStagesRequestOrderBy(tmp).String()) + return nil +} + type ListPurgeRequestsRequestOrderBy string const ( @@ -935,6 +976,19 @@ type PlanDetails struct { PipelineLimit uint32 `json:"pipeline_limit"` } +// PipelineStages: pipeline stages. +type PipelineStages struct { + Pipeline *Pipeline `json:"pipeline"` + + DNSStages []*DNSStage `json:"dns_stages"` + + TLSStages []*TLSStage `json:"tls_stages"` + + CacheStages []*CacheStage `json:"cache_stages"` + + BackendStages []*BackendStage `json:"backend_stages"` +} + // PurgeRequest: purge request. type PurgeRequest struct { // ID: ID of the purge request. @@ -1425,6 +1479,48 @@ func (r *ListPipelinesResponse) UnsafeAppend(res interface{}) (uint64, error) { return uint64(len(results.Pipelines)), nil } +// ListPipelinesWithStagesRequest: list pipelines with stages request. +type ListPipelinesWithStagesRequest struct { + // OrderBy: default value: created_at_asc + OrderBy ListPipelinesWithStagesRequestOrderBy `json:"-"` + + Page *int32 `json:"-"` + + PageSize *uint32 `json:"-"` + + Name *string `json:"-"` + + OrganizationID *string `json:"-"` + + ProjectID *string `json:"-"` +} + +// ListPipelinesWithStagesResponse: list pipelines with stages response. +type ListPipelinesWithStagesResponse struct { + Pipelines []*PipelineStages `json:"pipelines"` + + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListPipelinesWithStagesResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListPipelinesWithStagesResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListPipelinesWithStagesResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Pipelines = append(r.Pipelines, results.Pipelines...) + r.TotalCount += uint64(len(results.Pipelines)) + return uint64(len(results.Pipelines)), nil +} + // ListPlansResponse: list plans response. type ListPlansResponse struct { TotalCount uint64 `json:"total_count"` @@ -1746,6 +1842,38 @@ func (s *API) GetPipeline(req *GetPipelineRequest, opts ...scw.RequestOption) (* return &resp, nil } +// ListPipelinesWithStages: +func (s *API) ListPipelinesWithStages(req *ListPipelinesWithStagesRequest, opts ...scw.RequestOption) (*ListPipelinesWithStagesResponse, error) { + var err error + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "project_id", req.ProjectID) + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/edge-services/v1alpha1/pipelines-stages", + Query: query, + } + + var resp ListPipelinesWithStagesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // UpdatePipeline: Update the parameters of an existing pipeline, specified by its `pipeline_id`. Parameters which can be updated include the `name`, `description` and `dns_stage_id`. func (s *API) UpdatePipeline(req *UpdatePipelineRequest, opts ...scw.RequestOption) (*Pipeline, error) { var err error From f3191a9f88a1dcee3448690df03e39e72e4407ae Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 16 Oct 2024 11:07:20 +0200 Subject: [PATCH 024/163] feat: update generated APIs (#2257) --- api/iam/v1alpha1/iam_sdk.go | 54 ++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 0c686faf4..b8c6fa85c 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -788,6 +788,33 @@ func (enum *UserType) UnmarshalJSON(data []byte) error { return nil } +// JWT: jwt. +type JWT struct { + // Jti: jWT ID. + Jti string `json:"jti"` + + // IssuerID: ID of the user who issued the JWT. + IssuerID string `json:"issuer_id"` + + // AudienceID: ID of the user targeted by the JWT. + AudienceID string `json:"audience_id"` + + // CreatedAt: creation date of the JWT. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last update date of the JWT. + UpdatedAt *time.Time `json:"updated_at"` + + // ExpiresAt: expiration date of the JWT. + ExpiresAt *time.Time `json:"expires_at"` + + // IP: IP address used during the creation of the JWT. + IP net.IP `json:"ip"` + + // UserAgent: user-agent used during the creation of the JWT. + UserAgent string `json:"user_agent"` +} + // RuleSpecs: rule specs. type RuleSpecs struct { // PermissionSetNames: names of permission sets bound to the rule. @@ -820,33 +847,6 @@ type CreateUserRequestMember struct { Password string `json:"password"` } -// JWT: jwt. -type JWT struct { - // Jti: jWT ID. - Jti string `json:"jti"` - - // IssuerID: ID of the user who issued the JWT. - IssuerID string `json:"issuer_id"` - - // AudienceID: ID of the user targeted by the JWT. - AudienceID string `json:"audience_id"` - - // CreatedAt: creation date of the JWT. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: last update date of the JWT. - UpdatedAt *time.Time `json:"updated_at"` - - // ExpiresAt: expiration date of the JWT. - ExpiresAt *time.Time `json:"expires_at"` - - // IP: IP address used during the creation of the JWT. - IP net.IP `json:"ip"` - - // UserAgent: user-agent used during the creation of the JWT. - UserAgent string `json:"user_agent"` -} - // APIKey: api key. type APIKey struct { // AccessKey: access key of the API key. From 4f7cff3157e3702966d3530963517079dda63661 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 16 Oct 2024 11:20:11 +0200 Subject: [PATCH 025/163] feat(mongodb): add v1alpha1 api (#2258) --- api/mongodb/v1alpha1/mongodb_sdk.go | 1670 +++++++++++++++++++++++++++ 1 file changed, 1670 insertions(+) create mode 100644 api/mongodb/v1alpha1/mongodb_sdk.go diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go new file mode 100644 index 000000000..e4c08dd85 --- /dev/null +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -0,0 +1,1670 @@ +// This file was automatically generated. DO NOT EDIT. +// If you have any remark or suggestion do not hesitate to open an issue. + +// Package mongodb provides methods and message types of the mongodb v1alpha1 API. +package mongodb + +import ( + "bytes" + "encoding/json" + "fmt" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/scaleway/scaleway-sdk-go/errors" + "github.com/scaleway/scaleway-sdk-go/marshaler" + "github.com/scaleway/scaleway-sdk-go/namegenerator" + "github.com/scaleway/scaleway-sdk-go/parameter" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +// always import dependencies +var ( + _ fmt.Stringer + _ json.Unmarshaler + _ url.URL + _ net.IP + _ http.Header + _ bytes.Reader + _ time.Time + _ = strings.Join + + _ scw.ScalewayRequest + _ marshaler.Duration + _ scw.File + _ = parameter.AddToQuery + _ = namegenerator.GetRandomName +) + +type InstanceStatus string + +const ( + InstanceStatusUnknownStatus = InstanceStatus("unknown_status") + InstanceStatusReady = InstanceStatus("ready") + InstanceStatusProvisioning = InstanceStatus("provisioning") + InstanceStatusConfiguring = InstanceStatus("configuring") + InstanceStatusDeleting = InstanceStatus("deleting") + InstanceStatusError = InstanceStatus("error") + InstanceStatusInitializing = InstanceStatus("initializing") + InstanceStatusLocked = InstanceStatus("locked") + InstanceStatusSnapshotting = InstanceStatus("snapshotting") +) + +func (enum InstanceStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum InstanceStatus) Values() []InstanceStatus { + return []InstanceStatus{ + "unknown_status", + "ready", + "provisioning", + "configuring", + "deleting", + "error", + "initializing", + "locked", + "snapshotting", + } +} + +func (enum InstanceStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *InstanceStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = InstanceStatus(InstanceStatus(tmp).String()) + return nil +} + +type ListInstancesRequestOrderBy string + +const ( + ListInstancesRequestOrderByCreatedAtAsc = ListInstancesRequestOrderBy("created_at_asc") + ListInstancesRequestOrderByCreatedAtDesc = ListInstancesRequestOrderBy("created_at_desc") + ListInstancesRequestOrderByNameAsc = ListInstancesRequestOrderBy("name_asc") + ListInstancesRequestOrderByNameDesc = ListInstancesRequestOrderBy("name_desc") + ListInstancesRequestOrderByStatusAsc = ListInstancesRequestOrderBy("status_asc") + ListInstancesRequestOrderByStatusDesc = ListInstancesRequestOrderBy("status_desc") +) + +func (enum ListInstancesRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListInstancesRequestOrderBy) Values() []ListInstancesRequestOrderBy { + return []ListInstancesRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "name_asc", + "name_desc", + "status_asc", + "status_desc", + } +} + +func (enum ListInstancesRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListInstancesRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListInstancesRequestOrderBy(ListInstancesRequestOrderBy(tmp).String()) + return nil +} + +type ListSnapshotsRequestOrderBy string + +const ( + ListSnapshotsRequestOrderByCreatedAtAsc = ListSnapshotsRequestOrderBy("created_at_asc") + ListSnapshotsRequestOrderByCreatedAtDesc = ListSnapshotsRequestOrderBy("created_at_desc") + ListSnapshotsRequestOrderByNameAsc = ListSnapshotsRequestOrderBy("name_asc") + ListSnapshotsRequestOrderByNameDesc = ListSnapshotsRequestOrderBy("name_desc") + ListSnapshotsRequestOrderByExpiresAtAsc = ListSnapshotsRequestOrderBy("expires_at_asc") + ListSnapshotsRequestOrderByExpiresAtDesc = ListSnapshotsRequestOrderBy("expires_at_desc") +) + +func (enum ListSnapshotsRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListSnapshotsRequestOrderBy) Values() []ListSnapshotsRequestOrderBy { + return []ListSnapshotsRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "name_asc", + "name_desc", + "expires_at_asc", + "expires_at_desc", + } +} + +func (enum ListSnapshotsRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListSnapshotsRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListSnapshotsRequestOrderBy(ListSnapshotsRequestOrderBy(tmp).String()) + return nil +} + +type ListUsersRequestOrderBy string + +const ( + ListUsersRequestOrderByNameAsc = ListUsersRequestOrderBy("name_asc") + ListUsersRequestOrderByNameDesc = ListUsersRequestOrderBy("name_desc") +) + +func (enum ListUsersRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "name_asc" + } + return string(enum) +} + +func (enum ListUsersRequestOrderBy) Values() []ListUsersRequestOrderBy { + return []ListUsersRequestOrderBy{ + "name_asc", + "name_desc", + } +} + +func (enum ListUsersRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListUsersRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListUsersRequestOrderBy(ListUsersRequestOrderBy(tmp).String()) + return nil +} + +type NodeTypeStock string + +const ( + NodeTypeStockUnknownStock = NodeTypeStock("unknown_stock") + NodeTypeStockLowStock = NodeTypeStock("low_stock") + NodeTypeStockOutOfStock = NodeTypeStock("out_of_stock") + NodeTypeStockAvailable = NodeTypeStock("available") +) + +func (enum NodeTypeStock) String() string { + if enum == "" { + // return default value if empty + return "unknown_stock" + } + return string(enum) +} + +func (enum NodeTypeStock) Values() []NodeTypeStock { + return []NodeTypeStock{ + "unknown_stock", + "low_stock", + "out_of_stock", + "available", + } +} + +func (enum NodeTypeStock) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *NodeTypeStock) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = NodeTypeStock(NodeTypeStock(tmp).String()) + return nil +} + +type SettingPropertyType string + +const ( + SettingPropertyTypeBOOLEAN = SettingPropertyType("BOOLEAN") + SettingPropertyTypeINT = SettingPropertyType("INT") + SettingPropertyTypeSTRING = SettingPropertyType("STRING") + SettingPropertyTypeFLOAT = SettingPropertyType("FLOAT") +) + +func (enum SettingPropertyType) String() string { + if enum == "" { + // return default value if empty + return "BOOLEAN" + } + return string(enum) +} + +func (enum SettingPropertyType) Values() []SettingPropertyType { + return []SettingPropertyType{ + "BOOLEAN", + "INT", + "STRING", + "FLOAT", + } +} + +func (enum SettingPropertyType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *SettingPropertyType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = SettingPropertyType(SettingPropertyType(tmp).String()) + return nil +} + +type SnapshotStatus string + +const ( + SnapshotStatusUnknownStatus = SnapshotStatus("unknown_status") + SnapshotStatusCreating = SnapshotStatus("creating") + SnapshotStatusReady = SnapshotStatus("ready") + SnapshotStatusRestoring = SnapshotStatus("restoring") + SnapshotStatusDeleting = SnapshotStatus("deleting") + SnapshotStatusError = SnapshotStatus("error") + SnapshotStatusLocked = SnapshotStatus("locked") +) + +func (enum SnapshotStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum SnapshotStatus) Values() []SnapshotStatus { + return []SnapshotStatus{ + "unknown_status", + "creating", + "ready", + "restoring", + "deleting", + "error", + "locked", + } +} + +func (enum SnapshotStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *SnapshotStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = SnapshotStatus(SnapshotStatus(tmp).String()) + return nil +} + +type VolumeType string + +const ( + VolumeTypeUnknownType = VolumeType("unknown_type") + VolumeTypeSbs5k = VolumeType("sbs_5k") + VolumeTypeSbs15k = VolumeType("sbs_15k") +) + +func (enum VolumeType) String() string { + if enum == "" { + // return default value if empty + return "unknown_type" + } + return string(enum) +} + +func (enum VolumeType) Values() []VolumeType { + return []VolumeType{ + "unknown_type", + "sbs_5k", + "sbs_15k", + } +} + +func (enum VolumeType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *VolumeType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = VolumeType(VolumeType(tmp).String()) + return nil +} + +// EndpointPrivateNetworkDetails: Private Network details. +type EndpointPrivateNetworkDetails struct { + // PrivateNetworkID: UUID of the private network. + PrivateNetworkID string `json:"private_network_id"` +} + +// EndpointPublicDetails: endpoint public details. +type EndpointPublicDetails struct { +} + +// EndpointSpecPrivateNetworkDetails: endpoint spec private network details. +type EndpointSpecPrivateNetworkDetails struct { + // PrivateNetworkID: UUID of the private network. + PrivateNetworkID string `json:"private_network_id"` +} + +// EndpointSpecPublicDetails: endpoint spec public details. +type EndpointSpecPublicDetails struct { +} + +// Endpoint: endpoint. +type Endpoint struct { + // ID: UUID of the endpoint. + ID string `json:"id"` + + // IPs: list of IPv4 addresses of the endpoint. + IPs []net.IP `json:"ips"` + + // DNSRecords: list of DNS records of the endpoint. + DNSRecords []string `json:"dns_records"` + + // Port: TCP port of the endpoint. + Port uint32 `json:"port"` + + // PrivateNetwork: private Network endpoint details. + // Precisely one of PrivateNetwork, Public must be set. + PrivateNetwork *EndpointPrivateNetworkDetails `json:"private_network,omitempty"` + + // Public: public endpoint details. + // Precisely one of PrivateNetwork, Public must be set. + Public *EndpointPublicDetails `json:"public,omitempty"` +} + +// InstanceSetting: instance setting. +type InstanceSetting struct { + // Name: name of the settings. + Name string `json:"name"` + + // Value: value of the settings. + Value string `json:"value"` +} + +// Volume: volume. +type Volume struct { + // Type: type of volume where data is stored. + // Default value: unknown_type + Type VolumeType `json:"type"` + + // Size: volume size. + Size scw.Size `json:"size"` +} + +// NodeTypeVolumeType: node type volume type. +type NodeTypeVolumeType struct { + // Type: volume Type. + // Default value: unknown_type + Type VolumeType `json:"type"` + + // Description: the description of the Volume. + Description string `json:"description"` + + // MinSize: mimimum size required for the Volume. + MinSize scw.Size `json:"min_size"` + + // MaxSize: maximum size required for the Volume. + MaxSize scw.Size `json:"max_size"` + + // ChunkSize: minimum increment level for a Block Storage volume size. + ChunkSize scw.Size `json:"chunk_size"` +} + +// SnapshotVolumeType: snapshot volume type. +type SnapshotVolumeType struct { + // Type: default value: unknown_type + Type VolumeType `json:"type"` +} + +// Setting: setting. +type Setting struct { + // Name: setting name from the database engine. + Name string `json:"name"` + + // DefaultValue: value set when not specified. + DefaultValue string `json:"default_value"` + + // HotConfigurable: setting can be applied without restarting. + HotConfigurable bool `json:"hot_configurable"` + + // Description: setting description. + Description string `json:"description"` + + // PropertyType: setting type. + // Default value: BOOLEAN + PropertyType SettingPropertyType `json:"property_type"` + + // Unit: setting base unit. + Unit *string `json:"unit"` + + // StringConstraint: validation regex for string type settings. + StringConstraint *string `json:"string_constraint"` + + // IntMin: minimum value for int types. + IntMin *int32 `json:"int_min"` + + // IntMax: maximum value for int types. + IntMax *int32 `json:"int_max"` + + // FloatMin: minimum value for float types. + FloatMin *float32 `json:"float_min"` + + // FloatMax: maximum value for float types. + FloatMax *float32 `json:"float_max"` +} + +// CreateInstanceRequestVolumeDetails: create instance request volume details. +type CreateInstanceRequestVolumeDetails struct { + // VolumeSize: volume size. + VolumeSize scw.Size `json:"volume_size"` + + // VolumeType: type of volume where data is stored. + // Default value: unknown_type + VolumeType VolumeType `json:"volume_type"` +} + +// EndpointSpec: endpoint spec. +type EndpointSpec struct { + // Precisely one of Public, PrivateNetwork must be set. + Public *EndpointSpecPublicDetails `json:"public,omitempty"` + + // Precisely one of Public, PrivateNetwork must be set. + PrivateNetwork *EndpointSpecPrivateNetworkDetails `json:"private_network,omitempty"` +} + +// Instance: instance. +type Instance struct { + // ID: UUID of the Database Instance. + ID string `json:"id"` + + // Name: name of the Database Instance. + Name string `json:"name"` + + // ProjectID: project ID the Database Instance belongs to. + ProjectID string `json:"project_id"` + + // Status: status of the Database Instance. + // Default value: unknown_status + Status InstanceStatus `json:"status"` + + // Version: mongoDB™ engine version of the Database Instance. + Version string `json:"version"` + + // Tags: list of tags applied to the Database Instance. + Tags []string `json:"tags"` + + // Settings: advanced settings of the Database Instance. + Settings []*InstanceSetting `json:"settings"` + + // NodeNumber: number of node in the Database Instance. + NodeNumber uint32 `json:"node_number"` + + // NodeType: node type of the Database Instance. + NodeType string `json:"node_type"` + + // Volume: volumes of the Database Instance. + Volume *Volume `json:"volume"` + + // Endpoints: list of Database Instance endpoints. + Endpoints []*Endpoint `json:"endpoints"` + + // CreatedAt: creation date (must follow the ISO 8601 format). + CreatedAt *time.Time `json:"created_at"` + + // Region: region the Database Instance is in. + Region scw.Region `json:"region"` +} + +// NodeType: node type. +type NodeType struct { + // Name: node Type name identifier. + Name string `json:"name"` + + // StockStatus: current stock status for the Node Type. + // Default value: unknown_stock + StockStatus NodeTypeStock `json:"stock_status"` + + // Description: current specs of the offer. + Description string `json:"description"` + + // Vcpus: number of virtual CPUs. + Vcpus uint32 `json:"vcpus"` + + // Memory: quantity of RAM. + Memory scw.Size `json:"memory"` + + // AvailableVolumeTypes: available storage options for the Node Type. + AvailableVolumeTypes []*NodeTypeVolumeType `json:"available_volume_types"` + + // Disabled: the Node Type is currently disabled. + Disabled bool `json:"disabled"` + + // Beta: the Node Type is currently in beta. + Beta bool `json:"beta"` + + // InstanceRange: instance range associated with the NodeType offer. + InstanceRange string `json:"instance_range"` +} + +// Snapshot: snapshot. +type Snapshot struct { + // ID: UUID of the snapshot. + ID string `json:"id"` + + // InstanceID: UUID of the Database Instance. + InstanceID string `json:"instance_id"` + + // Name: name of the snapshot. + Name string `json:"name"` + + // Status: status of the snapshot. + // Default value: unknown_status + Status SnapshotStatus `json:"status"` + + // Size: size of the snapshot. + Size scw.Size `json:"size"` + + // ExpiresAt: expiration date (must follow the ISO 8601 format). + ExpiresAt *time.Time `json:"expires_at"` + + // CreatedAt: creation date (must follow the ISO 8601 format). + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: updated date (must follow the ISO 8601 format). + UpdatedAt *time.Time `json:"updated_at"` + + // InstanceName: name of the Database Instance of the snapshot. + InstanceName string `json:"instance_name"` + + // NodeType: source node type. + NodeType string `json:"node_type"` + + // VolumeType: type of volume where data is stored sbs_5k or sbs_15k. + VolumeType *SnapshotVolumeType `json:"volume_type"` + + // Region: region of this snapshot. + Region scw.Region `json:"region"` +} + +// User: user. +type User struct { + // Name: name of the user (Length must be between 1 and 63 characters. First character must be an alphabet character (a-zA-Z). Only a-zA-Z0-9_$- characters are accepted). + Name string `json:"name"` +} + +// Version: version. +type Version struct { + // Version: mongoDB™ engine version. + Version string `json:"version"` + + // EndOfLifeAt: date of End of Life. + EndOfLifeAt *time.Time `json:"end_of_life_at"` + + // AvailableSettings: instance settings available to be updated. + AvailableSettings []*Setting `json:"available_settings"` +} + +// RestoreSnapshotRequestVolumeDetails: restore snapshot request volume details. +type RestoreSnapshotRequestVolumeDetails struct { + // VolumeType: type of volume where data is stored. + // Default value: unknown_type + VolumeType VolumeType `json:"volume_type"` +} + +// CreateInstanceRequest: create instance request. +type CreateInstanceRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ProjectID: the Project ID on which the Database Instance will be created. + ProjectID string `json:"project_id"` + + // Name: name of the Database Instance. + Name string `json:"name"` + + // Version: version of the MongoDB™ engine. + Version string `json:"version"` + + // Tags: tags to apply to the Database Instance. + Tags []string `json:"tags"` + + // NodeNumber: number of node to use for the Database Instance. + NodeNumber uint32 `json:"node_number"` + + // NodeType: type of node to use for the Database Instance. + NodeType string `json:"node_type"` + + // UserName: username created when the Database Instance is created. + UserName string `json:"user_name"` + + // Password: password of the initial user. + Password string `json:"password"` + + // Volume: instance volume information. + Volume *CreateInstanceRequestVolumeDetails `json:"volume,omitempty"` + + // Endpoints: one or multiple EndpointSpec used to expose your Database Instance. + Endpoints []*EndpointSpec `json:"endpoints"` +} + +// CreateSnapshotRequest: create snapshot request. +type CreateSnapshotRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance to snapshot. + InstanceID string `json:"-"` + + // Name: name of the snapshot. + Name string `json:"name"` + + // ExpiresAt: expiration date of the snapshot (must follow the ISO 8601 format). + ExpiresAt *time.Time `json:"expires_at,omitempty"` +} + +// DeleteInstanceRequest: delete instance request. +type DeleteInstanceRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance to delete. + InstanceID string `json:"-"` +} + +// DeleteSnapshotRequest: delete snapshot request. +type DeleteSnapshotRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // SnapshotID: UUID of the snapshot. + SnapshotID string `json:"-"` +} + +// GetInstanceCertificateRequest: get instance certificate request. +type GetInstanceCertificateRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance. + InstanceID string `json:"-"` +} + +// GetInstanceRequest: get instance request. +type GetInstanceRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance. + InstanceID string `json:"-"` +} + +// ListInstancesRequest: list instances request. +type ListInstancesRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // Tags: list Database Instances that have a given tag. + Tags []string `json:"-"` + + // Name: lists Database Instances that match a name pattern. + Name *string `json:"-"` + + // OrderBy: criteria to use when ordering Database Instance listings. + // Default value: created_at_asc + OrderBy ListInstancesRequestOrderBy `json:"-"` + + // OrganizationID: organization ID the Database Instance belongs to. + OrganizationID *string `json:"-"` + + // ProjectID: project ID to list the Database Instance of. + ProjectID *string `json:"-"` + + Page *int32 `json:"-"` + + PageSize *uint32 `json:"-"` +} + +// ListInstancesResponse: list instances response. +type ListInstancesResponse struct { + // Instances: list of all Database Instances available in an Organization or Project. + Instances []*Instance `json:"instances"` + + // TotalCount: total count of Database Instances available in a Organization or Project. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListInstancesResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListInstancesResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListInstancesResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Instances = append(r.Instances, results.Instances...) + r.TotalCount += uint64(len(results.Instances)) + return uint64(len(results.Instances)), nil +} + +// ListNodeTypesRequest: list node types request. +type ListNodeTypesRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // IncludeDisabledTypes: defines whether or not to include disabled types. + IncludeDisabledTypes *bool `json:"-"` + + Page *int32 `json:"-"` + + PageSize *uint32 `json:"-"` +} + +// ListNodeTypesResponse: list node types response. +type ListNodeTypesResponse struct { + // NodeTypes: types of the node. + NodeTypes []*NodeType `json:"node_types"` + + // TotalCount: total count of node-types available. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListNodeTypesResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListNodeTypesResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListNodeTypesResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.NodeTypes = append(r.NodeTypes, results.NodeTypes...) + r.TotalCount += uint64(len(results.NodeTypes)) + return uint64(len(results.NodeTypes)), nil +} + +// ListSnapshotsRequest: list snapshots request. +type ListSnapshotsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: instance ID the snapshots belongs to. + InstanceID *string `json:"-"` + + // Name: lists Database snapshots that match a name pattern. + Name *string `json:"-"` + + // OrderBy: criteria to use when ordering snapshot listings. + // Default value: created_at_asc + OrderBy ListSnapshotsRequestOrderBy `json:"-"` + + // OrganizationID: organization ID the snapshots belongs to. + OrganizationID *string `json:"-"` + + // ProjectID: project ID to list the snapshots of. + ProjectID *string `json:"-"` + + Page *int32 `json:"-"` + + PageSize *uint32 `json:"-"` +} + +// ListSnapshotsResponse: list snapshots response. +type ListSnapshotsResponse struct { + // Snapshots: list of all Database Snapshots available in an Organization or Project. + Snapshots []*Snapshot `json:"snapshots"` + + // TotalCount: total count of Database Snapshots available in a Organization or Project. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListSnapshotsResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListSnapshotsResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListSnapshotsResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Snapshots = append(r.Snapshots, results.Snapshots...) + r.TotalCount += uint64(len(results.Snapshots)) + return uint64(len(results.Snapshots)), nil +} + +// ListUsersRequest: list users request. +type ListUsersRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance. + InstanceID string `json:"-"` + + // Name: name of the user. + Name *string `json:"-"` + + // OrderBy: criteria to use when requesting user listing. + // Default value: name_asc + OrderBy ListUsersRequestOrderBy `json:"-"` + + Page *int32 `json:"-"` + + PageSize *uint32 `json:"-"` +} + +// ListUsersResponse: list users response. +type ListUsersResponse struct { + // Users: list of users in a Database Instance. + Users []*User `json:"users"` + + // TotalCount: total count of users present on a Database Instance. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListUsersResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListUsersResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListUsersResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Users = append(r.Users, results.Users...) + r.TotalCount += uint64(len(results.Users)) + return uint64(len(results.Users)), nil +} + +// ListVersionsRequest: list versions request. +type ListVersionsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + Version *string `json:"-"` + + Page *int32 `json:"-"` + + PageSize *uint32 `json:"-"` +} + +// ListVersionsResponse: list versions response. +type ListVersionsResponse struct { + // Versions: available MongoDB™ engine version. + Versions []*Version `json:"versions"` + + // TotalCount: total count of MongoDB™ engine version available. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListVersionsResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListVersionsResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListVersionsResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Versions = append(r.Versions, results.Versions...) + r.TotalCount += uint64(len(results.Versions)) + return uint64(len(results.Versions)), nil +} + +// RestoreSnapshotRequest: restore snapshot request. +type RestoreSnapshotRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // SnapshotID: UUID of the snapshot. + SnapshotID string `json:"-"` + + // InstanceName: name of the new Database Instance. + InstanceName string `json:"instance_name"` + + // NodeType: node type to use for the new Database Instance. + NodeType string `json:"node_type"` + + // NodeNumber: number of nodes to use for the new Database Instance. + NodeNumber uint32 `json:"node_number"` + + // Volume: instance volume information. + Volume *RestoreSnapshotRequestVolumeDetails `json:"volume"` +} + +// UpdateInstanceRequest: update instance request. +type UpdateInstanceRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance to update. + InstanceID string `json:"-"` + + // Name: name of the Database Instance. + Name *string `json:"name,omitempty"` + + // Tags: tags of a Database Instance. + Tags *[]string `json:"tags,omitempty"` +} + +// UpdateSnapshotRequest: update snapshot request. +type UpdateSnapshotRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // SnapshotID: UUID of the Snapshot. + SnapshotID string `json:"-"` + + // Name: name of the snapshot. + Name *string `json:"name,omitempty"` + + // ExpiresAt: expiration date of the snapshot (must follow the ISO 8601 format). + ExpiresAt *time.Time `json:"expires_at,omitempty"` +} + +// UpdateUserRequest: update user request. +type UpdateUserRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance the user belongs to. + InstanceID string `json:"-"` + + // Name: name of the database user. + Name string `json:"-"` + + // Password: password of the database user. + Password *string `json:"password,omitempty"` +} + +// UpgradeInstanceRequest: upgrade instance request. +type UpgradeInstanceRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance you want to upgrade. + InstanceID string `json:"-"` + + // VolumeSize: increase your block storage volume size. + // Precisely one of VolumeSize must be set. + VolumeSize *scw.Size `json:"volume_size,omitempty"` +} + +// This API allows you to manage your Managed Databases for MongoDB. +type API struct { + client *scw.Client +} + +// NewAPI returns a API object from a Scaleway client. +func NewAPI(client *scw.Client) *API { + return &API{ + client: client, + } +} +func (s *API) Regions() []scw.Region { + return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} +} + +// ListNodeTypes: List available node types. +func (s *API) ListNodeTypes(req *ListNodeTypesRequest, opts ...scw.RequestOption) (*ListNodeTypesResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "include_disabled_types", req.IncludeDisabledTypes) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/node-types", + Query: query, + } + + var resp ListNodeTypesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListVersions: List available MongoDB™ versions. +func (s *API) ListVersions(req *ListVersionsRequest, opts ...scw.RequestOption) (*ListVersionsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "version", req.Version) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/versions", + Query: query, + } + + var resp ListVersionsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListInstances: List all MongoDB™ Database Instances in the specified region, for a given Scaleway Project. By default, the MongoDB™ Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags` and `name`. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. +func (s *API) ListInstances(req *ListInstancesRequest, opts ...scw.RequestOption) (*ListInstancesResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "tags", req.Tags) + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances", + Query: query, + } + + var resp ListInstancesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetInstance: Retrieve information about a given MongoDB™ Database Instance, specified by the `region` and `instance_id` parameters. Its full details, including name, status, IP address and port, are returned in the response object. +func (s *API) GetInstance(req *GetInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "", + } + + var resp Instance + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateInstance: Create a new MongoDB™ Database Instance. +func (s *API) CreateInstance(req *CreateInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Instance + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateInstance: Update the parameters of a MongoDB™ Database Instance. +func (s *API) UpdateInstance(req *UpdateInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Instance + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteInstance: Delete a given MongoDB™ Database Instance, specified by the `region` and `instance_id` parameters. Deleting a MongoDB™ Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. +func (s *API) DeleteInstance(req *DeleteInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "", + } + + var resp Instance + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpgradeInstance: Upgrade your current Database Instance specifications like volume size. +func (s *API) UpgradeInstance(req *UpgradeInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/upgrade", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Instance + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetInstanceCertificate: Retrieve the certificate of a given Database Instance, specified by the `instance_id` parameter. +func (s *API) GetInstanceCertificate(req *GetInstanceCertificateRequest, opts ...scw.RequestOption) (*scw.File, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/certificate", + } + + var resp scw.File + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateSnapshot: Create a new snapshot of a Database Instance. You must define the `name` and `instance_id` parameters in the request. +func (s *API) CreateSnapshot(req *CreateSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/snapshots", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Snapshot + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateSnapshot: +func (s *API) UpdateSnapshot(req *UpdateSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.SnapshotID) == "" { + return nil, errors.New("field SnapshotID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/snapshots/" + fmt.Sprint(req.SnapshotID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Snapshot + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// RestoreSnapshot: Restore a given snapshot of a Database Instance. You must specify, in the endpoint, the `snapshot_id` parameter of the snapshot you want to restore, the `instance_name` of the new Database Instance, `node_type` of the new Database Instance and `node_number` of the new Database Instance. +func (s *API) RestoreSnapshot(req *RestoreSnapshotRequest, opts ...scw.RequestOption) (*Instance, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.SnapshotID) == "" { + return nil, errors.New("field SnapshotID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/snapshots/" + fmt.Sprint(req.SnapshotID) + "/restore", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Instance + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListSnapshots: List snapshots. You can include the `instance_id` or `project_id` in your query to get the list of snapshots for specific Database Instances and/or Projects. By default, the details returned in the list are ordered by creation date in ascending order, though this can be modified via the `order_by` field. +func (s *API) ListSnapshots(req *ListSnapshotsRequest, opts ...scw.RequestOption) (*ListSnapshotsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "instance_id", req.InstanceID) + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/snapshots", + Query: query, + } + + var resp ListSnapshotsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteSnapshot: Delete a given snapshot of a Database Instance. You must specify, in the endpoint, the `snapshot_id` parameter of the snapshot you want to delete. +func (s *API) DeleteSnapshot(req *DeleteSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.SnapshotID) == "" { + return nil, errors.New("field SnapshotID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/snapshots/" + fmt.Sprint(req.SnapshotID) + "", + } + + var resp Snapshot + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListUsers: List all users of a given Database Instance. +func (s *API) ListUsers(req *ListUsersRequest, opts ...scw.RequestOption) (*ListUsersResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/users", + Query: query, + } + + var resp ListUsersResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateUser: Update the parameters of a user on a Database Instance. You can update the `password` parameter, but you cannot change the name of the user. +func (s *API) UpdateUser(req *UpdateUserRequest, opts ...scw.RequestOption) (*User, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + if fmt.Sprint(req.Name) == "" { + return nil, errors.New("field Name cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/users/" + fmt.Sprint(req.Name) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp User + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From 71e46305b9a0e9f6c90e417d86da51862f8986ff Mon Sep 17 00:00:00 2001 From: "Jonathan R." Date: Wed, 16 Oct 2024 14:15:47 +0200 Subject: [PATCH 026/163] feat(mongodb): add waiters for mongodb api (#2259) --- api/mongodb/v1alpha1/mongodb_utils.go | 117 ++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 api/mongodb/v1alpha1/mongodb_utils.go diff --git a/api/mongodb/v1alpha1/mongodb_utils.go b/api/mongodb/v1alpha1/mongodb_utils.go new file mode 100644 index 000000000..7d3950714 --- /dev/null +++ b/api/mongodb/v1alpha1/mongodb_utils.go @@ -0,0 +1,117 @@ +package mongodb + +import ( + "time" + + "github.com/scaleway/scaleway-sdk-go/errors" + "github.com/scaleway/scaleway-sdk-go/internal/async" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +const ( + defaultInstanceRetryInterval = 15 * time.Second + defaultInstanceTimeout = 15 * time.Minute +) + +// WaitForInstanceRequest is used by WaitForInstance method. +type WaitForInstanceRequest struct { + InstanceID string + Region scw.Region + Timeout *time.Duration + RetryInterval *time.Duration +} + +type WaitForSnapshotRequest struct { + InstanceID string + SnapshotID string + Region scw.Region + Timeout *time.Duration + RetryInterval *time.Duration +} + +// WaitForInstance waits for the instance to be in a "terminal state" before returning. +// This function can be used to wait for an instance to be ready or in another final state. +func (s *API) WaitForInstance(req *WaitForInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { + timeout := defaultInstanceTimeout + if req.Timeout != nil { + timeout = *req.Timeout + } + retryInterval := defaultInstanceRetryInterval + if req.RetryInterval != nil { + retryInterval = *req.RetryInterval + } + + terminalStatus := map[InstanceStatus]struct{}{ + InstanceStatusReady: {}, + InstanceStatusLocked: {}, + InstanceStatusError: {}, + } + + instance, err := async.WaitSync(&async.WaitSyncConfig{ + Get: func() (interface{}, bool, error) { + res, err := s.GetInstance(&GetInstanceRequest{ + Region: req.Region, + InstanceID: req.InstanceID, + }, opts...) + if err != nil { + return nil, false, err + } + + // Check if the instance has reached a terminal state + _, isTerminal := terminalStatus[res.Status] + + return res, isTerminal, nil + }, + Timeout: timeout, + IntervalStrategy: async.LinearIntervalStrategy(retryInterval), + }) + if err != nil { + return nil, errors.Wrap(err, "waiting for instance failed") + } + return instance.(*Instance), nil +} + +// WaitForSnapshot waits for the snapshot to reach a "terminal state" before returning. +func (s *API) WaitForSnapshot(req *WaitForSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { + timeout := defaultInstanceTimeout + if req.Timeout != nil { + timeout = *req.Timeout + } + retryInterval := defaultInstanceRetryInterval + if req.RetryInterval != nil { + retryInterval = *req.RetryInterval + } + + terminalStatus := map[SnapshotStatus]struct{}{ + SnapshotStatusReady: {}, + SnapshotStatusError: {}, + SnapshotStatusLocked: {}, + } + + snapshot, err := async.WaitSync(&async.WaitSyncConfig{ + Get: func() (interface{}, bool, error) { + opts = append(opts, scw.WithAllPages()) + listSnapshotResponse, err := s.ListSnapshots(&ListSnapshotsRequest{ + Region: req.Region, + InstanceID: &req.InstanceID, + }, opts...) + if err != nil { + return nil, false, err + } + + for _, snapshot := range listSnapshotResponse.Snapshots { + if snapshot.ID == req.SnapshotID { + _, isTerminal := terminalStatus[snapshot.Status] + return snapshot, isTerminal, nil + } + } + return nil, false, nil + }, + Timeout: timeout, + IntervalStrategy: async.LinearIntervalStrategy(retryInterval), + }) + if err != nil { + return nil, errors.Wrap(err, "waiting for snapshot failed") + } + return snapshot.(*Snapshot), nil +} From 6dca01fa4c80daa939ac39a9067c002a8aabc959 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 17 Oct 2024 15:17:48 +0200 Subject: [PATCH 027/163] feat(instance): set CreateServerRequest.image as optional (#2260) Co-authored-by: Jules Casteran --- api/instance/v1/image_utils_test.go | 3 ++- api/instance/v1/instance_sdk.go | 2 +- api/instance/v1/instance_sdk_server_test.go | 6 +++--- api/instance/v1/instance_utils_test.go | 4 ++-- api/instance/v1/server_utils.go | 6 +++--- api/instance/v1/server_utils_test.go | 6 +++--- api/instance/v1/snapshot_utils_test.go | 2 +- example_test.go | 2 +- 8 files changed, 16 insertions(+), 15 deletions(-) diff --git a/api/instance/v1/image_utils_test.go b/api/instance/v1/image_utils_test.go index 42e7982eb..8177ab537 100644 --- a/api/instance/v1/image_utils_test.go +++ b/api/instance/v1/image_utils_test.go @@ -6,6 +6,7 @@ import ( "github.com/scaleway/scaleway-sdk-go/internal/testhelpers" "github.com/scaleway/scaleway-sdk-go/internal/testhelpers/httprecorder" + "github.com/scaleway/scaleway-sdk-go/scw" ) func TestWaitForImage(t *testing.T) { @@ -36,7 +37,7 @@ func createImage(t *testing.T, instanceAPI *API, imageName string) (*Image, func t.Helper() serverRes, err := instanceAPI.CreateServer(&CreateServerRequest{ CommercialType: "DEV1-M", - Image: "ubuntu_focal", + Image: scw.StringPtr("ubuntu_focal"), }) testhelpers.AssertNoError(t, err) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index c75f29fc7..643d23232 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -2337,7 +2337,7 @@ type CreateServerRequest struct { CommercialType string `json:"commercial_type,omitempty"` // Image: instance image ID or label. - Image string `json:"image,omitempty"` + Image *string `json:"image,omitempty"` // Volumes: volumes attached to the server. Volumes map[string]*VolumeServerTemplate `json:"volumes,omitempty"` diff --git a/api/instance/v1/instance_sdk_server_test.go b/api/instance/v1/instance_sdk_server_test.go index e8e1cf4e8..7e43fb692 100644 --- a/api/instance/v1/instance_sdk_server_test.go +++ b/api/instance/v1/instance_sdk_server_test.go @@ -24,7 +24,7 @@ func TestServerUpdate(t *testing.T) { name = "instance_sdk_server_test" dynamicIPRequired = scw.BoolPtr(true) commercialType = "START1-S" - image = "f974feac-abae-4365-b988-8ec7d1cec10d" + image = scw.StringPtr("f974feac-abae-4365-b988-8ec7d1cec10d") enableIPv6 = scw.BoolPtr(true) bootType = BootTypeLocal tags = []string{"foo", "bar"} @@ -56,7 +56,7 @@ func TestServerUpdate(t *testing.T) { testhelpers.Equals(t, name, createServerResponse.Server.Name) testhelpers.Equals(t, project, createServerResponse.Server.Project) testhelpers.Equals(t, project, createServerResponse.Server.Organization) - testhelpers.Equals(t, image, createServerResponse.Server.Image.ID) + testhelpers.Equals(t, *image, createServerResponse.Server.Image.ID) testhelpers.Equals(t, enableIPv6, createServerResponse.Server.EnableIPv6) testhelpers.Equals(t, bootType, createServerResponse.Server.BootType) testhelpers.Equals(t, commercialType, createServerResponse.Server.CommercialType) @@ -104,7 +104,7 @@ func TestServerUpdate(t *testing.T) { // Initial values that are not altered in the above request should remaining the same testhelpers.Equals(t, project, updateServerResponse.Server.Project) testhelpers.Equals(t, project, updateServerResponse.Server.Organization) - testhelpers.Equals(t, image, updateServerResponse.Server.Image.ID) + testhelpers.Equals(t, *image, updateServerResponse.Server.Image.ID) testhelpers.Equals(t, enableIPv6, updateServerResponse.Server.EnableIPv6) testhelpers.Equals(t, bootType, updateServerResponse.Server.BootType) testhelpers.Equals(t, commercialType, updateServerResponse.Server.CommercialType) diff --git a/api/instance/v1/instance_utils_test.go b/api/instance/v1/instance_utils_test.go index a799d7615..65b2d3c06 100644 --- a/api/instance/v1/instance_utils_test.go +++ b/api/instance/v1/instance_utils_test.go @@ -24,7 +24,7 @@ func TestInstanceHelpers(t *testing.T) { volumeID string zone = scw.ZoneFrPar1 project = "ee7bd9e1-9cbd-4724-b2f4-19e50f3cf38b" - image = "81b9475d-e1b5-43c2-ac48-4c1a3b640686" + image = scw.StringPtr("81b9475d-e1b5-43c2-ac48-4c1a3b640686") ) t.Run("create server", func(t *testing.T) { @@ -135,7 +135,7 @@ func TestInstanceHelpers_BlockVolume(t *testing.T) { volumeID2 string zone = scw.ZoneFrPar1 project = "ee7bd9e1-9cbd-4724-b2f4-19e50f3cf38b" - image = "81b9475d-e1b5-43c2-ac48-4c1a3b640686" + image = scw.StringPtr("81b9475d-e1b5-43c2-ac48-4c1a3b640686") ) t.Run("create server and volume", func(t *testing.T) { diff --git a/api/instance/v1/server_utils.go b/api/instance/v1/server_utils.go index 6628ce80a..25c4616aa 100644 --- a/api/instance/v1/server_utils.go +++ b/api/instance/v1/server_utils.go @@ -22,17 +22,17 @@ const ( // CreateServer creates a server. func (s *API) CreateServer(req *CreateServerRequest, opts ...scw.RequestOption) (*CreateServerResponse, error) { // If image is not a UUID we try to fetch it from marketplace. - if req.Image != "" && !validation.IsUUID(req.Image) { + if req.Image != nil && !validation.IsUUID(*req.Image) { apiMarketplace := marketplace.NewAPI(s.client) image, err := apiMarketplace.GetLocalImageByLabel(&marketplace.GetLocalImageByLabelRequest{ - ImageLabel: req.Image, + ImageLabel: *req.Image, Zone: req.Zone, CommercialType: req.CommercialType, }) if err != nil { return nil, err } - req.Image = image.ID + req.Image = scw.StringPtr(image.ID) } return s.createServer(req, opts...) diff --git a/api/instance/v1/server_utils_test.go b/api/instance/v1/server_utils_test.go index fbe079e18..a922293bf 100644 --- a/api/instance/v1/server_utils_test.go +++ b/api/instance/v1/server_utils_test.go @@ -47,7 +47,7 @@ func TestAPI_ServerUserData(t *testing.T) { Zone: scw.ZoneFrPar1, CommercialType: "DEV1-S", Name: namegenerator.GetRandomName("srv"), - Image: "f974feac-abae-4365-b988-8ec7d1cec10d", + Image: scw.StringPtr("f974feac-abae-4365-b988-8ec7d1cec10d"), Project: scw.StringPtr("14d2f7ae-9775-414c-9bed-6810e060d500"), }) testhelpers.AssertNoError(t, err) @@ -86,7 +86,7 @@ func TestAPI_AllServerUserData(t *testing.T) { Zone: scw.ZoneFrPar1, CommercialType: "DEV1-S", Name: namegenerator.GetRandomName("srv"), - Image: "f974feac-abae-4365-b988-8ec7d1cec10d", + Image: scw.StringPtr("f974feac-abae-4365-b988-8ec7d1cec10d"), Project: scw.StringPtr("14d2f7ae-9775-414c-9bed-6810e060d500"), }) testhelpers.AssertNoError(t, err) @@ -154,7 +154,7 @@ func TestAPI_CreateServer(t *testing.T) { res, err := instanceAPI.CreateServer(&CreateServerRequest{ Zone: scw.ZoneFrPar1, CommercialType: "GP1-XS", - Image: "ubuntu_focal", + Image: scw.StringPtr("ubuntu_focal"), }) testhelpers.AssertNoError(t, err) diff --git a/api/instance/v1/snapshot_utils_test.go b/api/instance/v1/snapshot_utils_test.go index f25a6746e..169966588 100644 --- a/api/instance/v1/snapshot_utils_test.go +++ b/api/instance/v1/snapshot_utils_test.go @@ -36,7 +36,7 @@ func createSnapshot(t *testing.T, instanceAPI *API, snapshotName string) (*Snaps t.Helper() serverRes, err := instanceAPI.CreateServer(&CreateServerRequest{ CommercialType: "DEV1-M", - Image: "ubuntu_focal", + Image: scw.StringPtr("ubuntu_focal"), }) testhelpers.AssertNoError(t, err) diff --git a/example_test.go b/example_test.go index 63aa01b22..edd92db39 100644 --- a/example_test.go +++ b/example_test.go @@ -134,7 +134,7 @@ func Example_createServer() { createRes, err := instanceAPI.CreateServer(&instance.CreateServerRequest{ Name: "my-server-01", CommercialType: serverType, - Image: image, + Image: scw.StringPtr(image), DynamicIPRequired: scw.BoolPtr(true), }) if err != nil { From 2eefb481a74005a57ce96f6d15406f351ba70835 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 17 Oct 2024 15:32:26 +0200 Subject: [PATCH 028/163] feat(instance): add option to disable IPv6 during the migration to routed IPs (#2261) --- api/instance/v1/instance_sdk.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index 643d23232..babb07ea6 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -3455,6 +3455,10 @@ type ServerActionRequest struct { // Volumes: for each volume UUID, the snapshot parameters of the volume. // This field should only be specified when performing a backup action. Volumes map[string]*ServerActionRequestVolumeBackupTemplate `json:"volumes,omitempty"` + + // DisableIPv6: disable IPv6 on the Instance while performing migration to routed IPs. + // This field should only be specified when performing a enable_routed_ip action. + DisableIPv6 *bool `json:"disable_ipv6,omitempty"` } // ServerActionResponse: server action response. From 8ca184d2182102ec14effacd8d45fd7b8ea17171 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 18 Oct 2024 10:33:19 +0200 Subject: [PATCH 029/163] feat(mongodb): add Get Snapshot Endpoint (#2262) --- api/mongodb/v1alpha1/mongodb_sdk.go | 40 +++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index e4c08dd85..456280064 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -754,6 +754,15 @@ type GetInstanceRequest struct { InstanceID string `json:"-"` } +// GetSnapshotRequest: get snapshot request. +type GetSnapshotRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // SnapshotID: UUID of the snapshot. + SnapshotID string `json:"-"` +} + // ListInstancesRequest: list instances request. type ListInstancesRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1441,6 +1450,37 @@ func (s *API) CreateSnapshot(req *CreateSnapshotRequest, opts ...scw.RequestOpti return &resp, nil } +// GetSnapshot: Retrieve information about a given snapshot of a Database Instance. You must specify, in the endpoint, the `snapshot_id` parameter of the snapshot you want to retrieve. +func (s *API) GetSnapshot(req *GetSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.SnapshotID) == "" { + return nil, errors.New("field SnapshotID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/snapshots/" + fmt.Sprint(req.SnapshotID) + "", + } + + var resp Snapshot + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // UpdateSnapshot: func (s *API) UpdateSnapshot(req *UpdateSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { var err error From f4d9ed39f25f0a2dc7566b22fe9cfb9eef9545e9 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 18 Oct 2024 17:30:54 +0200 Subject: [PATCH 030/163] fix(baremetal): add bandwidth_in_bps field for PrivateNetworkOption (#2264) --- api/baremetal/v1/baremetal_sdk.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/baremetal/v1/baremetal_sdk.go b/api/baremetal/v1/baremetal_sdk.go index d63b03dc1..b59ab2081 100644 --- a/api/baremetal/v1/baremetal_sdk.go +++ b/api/baremetal/v1/baremetal_sdk.go @@ -903,6 +903,7 @@ type LicenseOption struct { // PrivateNetworkOption: private network option. type PrivateNetworkOption struct { + BandwidthInBps uint64 `json:"bandwidth_in_bps"` } // PublicBandwidthOption: public bandwidth option. @@ -1009,7 +1010,7 @@ type OfferOptionOffer struct { // Precisely one of License, PublicBandwidth, PrivateNetwork, RemoteAccess, Certification must be set. PublicBandwidth *PublicBandwidthOption `json:"public_bandwidth,omitempty"` - // PrivateNetwork: private_network option. + // PrivateNetwork: private_network option, contains the bandwidth_in_bps. // Precisely one of License, PublicBandwidth, PrivateNetwork, RemoteAccess, Certification must be set. PrivateNetwork *PrivateNetworkOption `json:"private_network,omitempty"` @@ -1118,7 +1119,7 @@ type ServerOption struct { // Precisely one of License, PublicBandwidth, PrivateNetwork, RemoteAccess, Certification must be set. PublicBandwidth *PublicBandwidthOption `json:"public_bandwidth,omitempty"` - // PrivateNetwork: private_network option. + // PrivateNetwork: private_network option, contains the bandwidth_in_bps. // Precisely one of License, PublicBandwidth, PrivateNetwork, RemoteAccess, Certification must be set. PrivateNetwork *PrivateNetworkOption `json:"private_network,omitempty"` @@ -1302,7 +1303,7 @@ type Option struct { // Precisely one of License, PublicBandwidth, PrivateNetwork, RemoteAccess, Certification must be set. PublicBandwidth *PublicBandwidthOption `json:"public_bandwidth,omitempty"` - // PrivateNetwork: private_network option. + // PrivateNetwork: private_network option, contains the bandwidth_in_bps. // Precisely one of License, PublicBandwidth, PrivateNetwork, RemoteAccess, Certification must be set. PrivateNetwork *PrivateNetworkOption `json:"private_network,omitempty"` From f21f9b31e4dc277cb3b69672e425da81bec13241 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 18 Oct 2024 17:31:18 +0200 Subject: [PATCH 031/163] feat(webhosting): add addon domain quota warning (#2265) --- api/webhosting/v1alpha1/webhosting_sdk.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/api/webhosting/v1alpha1/webhosting_sdk.go b/api/webhosting/v1alpha1/webhosting_sdk.go index eb42c78ce..1b5aa2d56 100644 --- a/api/webhosting/v1alpha1/webhosting_sdk.go +++ b/api/webhosting/v1alpha1/webhosting_sdk.go @@ -365,10 +365,11 @@ func (enum *NameserverStatus) UnmarshalJSON(data []byte) error { type OfferQuotaWarning string const ( - OfferQuotaWarningUnknownQuotaWarning = OfferQuotaWarning("unknown_quota_warning") - OfferQuotaWarningEmailCountExceeded = OfferQuotaWarning("email_count_exceeded") - OfferQuotaWarningDatabaseCountExceeded = OfferQuotaWarning("database_count_exceeded") - OfferQuotaWarningDiskUsageExceeded = OfferQuotaWarning("disk_usage_exceeded") + OfferQuotaWarningUnknownQuotaWarning = OfferQuotaWarning("unknown_quota_warning") + OfferQuotaWarningEmailCountExceeded = OfferQuotaWarning("email_count_exceeded") + OfferQuotaWarningDatabaseCountExceeded = OfferQuotaWarning("database_count_exceeded") + OfferQuotaWarningDiskUsageExceeded = OfferQuotaWarning("disk_usage_exceeded") + OfferQuotaWarningAddonDomainCountExceeded = OfferQuotaWarning("addon_domain_count_exceeded") ) func (enum OfferQuotaWarning) String() string { @@ -385,6 +386,7 @@ func (enum OfferQuotaWarning) Values() []OfferQuotaWarning { "email_count_exceeded", "database_count_exceeded", "disk_usage_exceeded", + "addon_domain_count_exceeded", } } From 2d127a2d76c7ce2c3a25234d17ce315052d50696 Mon Sep 17 00:00:00 2001 From: "Jonathan R." Date: Mon, 21 Oct 2024 13:56:42 +0200 Subject: [PATCH 032/163] fix(mongodb): switch to GetSnapshot (#2263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jules Castéran --- api/mongodb/v1alpha1/mongodb_utils.go | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/api/mongodb/v1alpha1/mongodb_utils.go b/api/mongodb/v1alpha1/mongodb_utils.go index 7d3950714..175bf1cf1 100644 --- a/api/mongodb/v1alpha1/mongodb_utils.go +++ b/api/mongodb/v1alpha1/mongodb_utils.go @@ -90,22 +90,16 @@ func (s *API) WaitForSnapshot(req *WaitForSnapshotRequest, opts ...scw.RequestOp snapshot, err := async.WaitSync(&async.WaitSyncConfig{ Get: func() (interface{}, bool, error) { - opts = append(opts, scw.WithAllPages()) - listSnapshotResponse, err := s.ListSnapshots(&ListSnapshotsRequest{ + getSnapshotResponse, err := s.GetSnapshot(&GetSnapshotRequest{ Region: req.Region, - InstanceID: &req.InstanceID, + SnapshotID: req.SnapshotID, }, opts...) if err != nil { return nil, false, err } - for _, snapshot := range listSnapshotResponse.Snapshots { - if snapshot.ID == req.SnapshotID { - _, isTerminal := terminalStatus[snapshot.Status] - return snapshot, isTerminal, nil - } - } - return nil, false, nil + _, isTerminal := terminalStatus[getSnapshotResponse.Status] + return getSnapshotResponse, isTerminal, nil }, Timeout: timeout, IntervalStrategy: async.LinearIntervalStrategy(retryInterval), From 037d5d27298e93ce83986b6474f87a1ec7a2c21e Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 21 Oct 2024 16:21:12 +0200 Subject: [PATCH 033/163] feat(mongodb): add support for generated instance name (#2266) --- api/mongodb/v1alpha1/mongodb_sdk.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 456280064..b1be9bd27 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -1257,6 +1257,10 @@ func (s *API) CreateInstance(req *CreateInstanceRequest, opts ...scw.RequestOpti req.ProjectID = defaultProjectID } + if req.Name == "" { + req.Name = namegenerator.GetRandomName("mgdb") + } + if fmt.Sprint(req.Region) == "" { return nil, errors.New("field Region cannot be empty in request") } From e53d760211cadb76d7dfdf78ee123462a770f620 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 21 Oct 2024 16:43:48 +0200 Subject: [PATCH 034/163] feat(iam): add UpdateUserPassword method (#2267) --- api/iam/v1alpha1/iam_sdk.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index b8c6fa85c..8d0eadb62 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -2191,6 +2191,15 @@ type UpdateSSHKeyRequest struct { Disabled *bool `json:"disabled,omitempty"` } +// UpdateUserPasswordRequest: update user password request. +type UpdateUserPasswordRequest struct { + UserID string `json:"-"` + + Password string `json:"password"` + + SendEmail bool `json:"send_email"` +} + // UpdateUserRequest: update user request. type UpdateUserRequest struct { // UserID: ID of the user to update. @@ -2476,6 +2485,33 @@ func (s *API) CreateUser(req *CreateUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } +// UpdateUserPassword: +func (s *API) UpdateUserPassword(req *UpdateUserPasswordRequest, opts ...scw.RequestOption) (*User, error) { + var err error + + if fmt.Sprint(req.UserID) == "" { + return nil, errors.New("field UserID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/iam/v1alpha1/users/" + fmt.Sprint(req.UserID) + "/update-password", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp User + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // ListApplications: List the applications of an Organization. By default, the applications listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters for your query such as `application_ids`. func (s *API) ListApplications(req *ListApplicationsRequest, opts ...scw.RequestOption) (*ListApplicationsResponse, error) { var err error From 697a449e7af5c3bbb5174b9213bfc09923ec89ac Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 21 Oct 2024 17:03:16 +0200 Subject: [PATCH 035/163] chore(serverless): add fields for advanced scaling options (#2268) --- api/container/v1beta1/container_sdk.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index e07d12dc2..ac54dd70c 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -762,6 +762,12 @@ func (enum *TriggerStatus) UnmarshalJSON(data []byte) error { return nil } +// ContainerScalingOption: container scaling option. +type ContainerScalingOption struct { + // Precisely one of ConcurrentRequestsThreshold must be set. + ConcurrentRequestsThreshold *uint32 `json:"concurrent_requests_threshold,omitempty"` +} + // SecretHashedValue: secret hashed value. type SecretHashedValue struct { Key string `json:"key"` @@ -933,6 +939,10 @@ type Container struct { // LocalStorageLimit: local storage limit of the container (in MB). LocalStorageLimit uint32 `json:"local_storage_limit"` + // ScalingOption: possible values: + // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. + ScalingOption *ContainerScalingOption `json:"scaling_option"` + // Region: region in which the container will be deployed. Region scw.Region `json:"region"` } @@ -1135,7 +1145,7 @@ type CreateContainerRequest struct { // RegistryImage: name of the registry image (e.g. "rg.fr-par.scw.cloud/something/image:tag"). RegistryImage *string `json:"registry_image,omitempty"` - // MaxConcurrency: number of maximum concurrent executions of the container. + // Deprecated: MaxConcurrency: number of maximum concurrent executions of the container. MaxConcurrency *uint32 `json:"max_concurrency,omitempty"` // Protocol: protocol the container uses. @@ -1160,6 +1170,10 @@ type CreateContainerRequest struct { // LocalStorageLimit: local storage limit of the container (in MB). LocalStorageLimit *uint32 `json:"local_storage_limit,omitempty"` + + // ScalingOption: possible values: + // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. + ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` } // CreateCronRequest: create cron request. @@ -1723,7 +1737,7 @@ type UpdateContainerRequest struct { // RegistryImage: name of the registry image (e.g. "rg.fr-par.scw.cloud/something/image:tag"). RegistryImage *string `json:"registry_image,omitempty"` - // MaxConcurrency: number of maximum concurrent executions of the container. + // Deprecated: MaxConcurrency: number of maximum concurrent executions of the container. MaxConcurrency *uint32 `json:"max_concurrency,omitempty"` // Protocol: default value: unknown_protocol @@ -1745,6 +1759,10 @@ type UpdateContainerRequest struct { // LocalStorageLimit: local storage limit of the container (in MB). LocalStorageLimit *uint32 `json:"local_storage_limit,omitempty"` + + // ScalingOption: possible values: + // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. + ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` } // UpdateCronRequest: update cron request. From c3a516ba2f34af5977df99ceaa5d2a0ad31d54c7 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 22 Oct 2024 16:08:24 +0200 Subject: [PATCH 036/163] chore(block): update zones list (#2269) --- api/block/v1alpha1/block_sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/block/v1alpha1/block_sdk.go b/api/block/v1alpha1/block_sdk.go index fcc1060eb..23414457d 100644 --- a/api/block/v1alpha1/block_sdk.go +++ b/api/block/v1alpha1/block_sdk.go @@ -907,7 +907,7 @@ func NewAPI(client *scw.Client) *API { } } func (s *API) Zones() []scw.Zone { - return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar2, scw.ZoneNlAms1, scw.ZoneNlAms2, scw.ZoneNlAms3, scw.ZonePlWaw3} + return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar2, scw.ZoneFrPar3, scw.ZoneNlAms1, scw.ZoneNlAms2, scw.ZoneNlAms3, scw.ZonePlWaw1, scw.ZonePlWaw2, scw.ZonePlWaw3} } // ListVolumeTypes: List all available volume types in a specified zone. The volume types listed are ordered by name in ascending order. From 9541ae726acd527815a06fb5b22c68f30f3ed0eb Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 22 Oct 2024 16:09:09 +0200 Subject: [PATCH 037/163] chore(k8s): remove migrate-to-routed-ips (#2270) --- api/k8s/v1/k8s_sdk.go | 45 ------------------------------------------- 1 file changed, 45 deletions(-) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 4dc3bf0a1..6cb31d94c 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -1821,15 +1821,6 @@ type ListVersionsResponse struct { Versions []*Version `json:"versions"` } -// MigrateClusterToRoutedIPsRequest: migrate cluster to routed i ps request. -type MigrateClusterToRoutedIPsRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ClusterID: cluster ID for which the routed ip will be enabled for the nodes. - ClusterID string `json:"-"` -} - // MigrateClusterToSBSCSIRequest: migrate cluster to sbscsi request. type MigrateClusterToSBSCSIRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -2416,42 +2407,6 @@ func (s *API) ResetClusterAdminToken(req *ResetClusterAdminTokenRequest, opts .. return nil } -// MigrateClusterToRoutedIPs: Migrate the nodes of an existing cluster to Routed IPs and enable Routed IPs for all future nodes. -func (s *API) MigrateClusterToRoutedIPs(req *MigrateClusterToRoutedIPsRequest, opts ...scw.RequestOption) (*Cluster, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.ClusterID) == "" { - return nil, errors.New("field ClusterID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/k8s/v1/regions/" + fmt.Sprint(req.Region) + "/clusters/" + fmt.Sprint(req.ClusterID) + "/migrate-to-routed-ips", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Cluster - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - // MigrateClusterToSBSCSI: Enable the latest CSI compatible with Scaleway Block Storage (SBS) and migrate all existing PersistentVolumes/VolumeSnapshotContents to SBS. func (s *API) MigrateClusterToSBSCSI(req *MigrateClusterToSBSCSIRequest, opts ...scw.RequestOption) (*Cluster, error) { var err error From a2c1e85de57a916ea17d27c4efe2646fc5f33d11 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 22 Oct 2024 16:43:18 +0200 Subject: [PATCH 038/163] fix(mongodb): add missing UpdateSnapshot endpoint in documentation (#2272) --- api/mongodb/v1alpha1/mongodb_sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index b1be9bd27..8978e8f37 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -1485,7 +1485,7 @@ func (s *API) GetSnapshot(req *GetSnapshotRequest, opts ...scw.RequestOption) (* return &resp, nil } -// UpdateSnapshot: +// UpdateSnapshot: Update the parameters of a snapshot of a Database Instance. You can update the `name` and `expires_at` parameters. func (s *API) UpdateSnapshot(req *UpdateSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { var err error From 2a6e7206bfc4cc47749ff0ac58a5369e1436476e Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 23 Oct 2024 16:14:24 +0200 Subject: [PATCH 039/163] feat(baremetal): add gpu in offer (#2274) --- api/baremetal/v1/baremetal_sdk.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/api/baremetal/v1/baremetal_sdk.go b/api/baremetal/v1/baremetal_sdk.go index b59ab2081..ab8704ec9 100644 --- a/api/baremetal/v1/baremetal_sdk.go +++ b/api/baremetal/v1/baremetal_sdk.go @@ -962,6 +962,15 @@ type Disk struct { Type string `json:"type"` } +// GPU: gpu. +type GPU struct { + // Name: name of the GPU. + Name string `json:"name"` + + // Vram: capacity of the vram in bytes. + Vram uint32 `json:"vram"` +} + // Memory: memory. type Memory struct { // Capacity: capacity of the memory in bytes. @@ -1282,6 +1291,9 @@ type Offer struct { // Tags: array of tags attached to the offer. Tags []string `json:"tags"` + + // Gpus: gPU specifications of the offer. + Gpus []*GPU `json:"gpus"` } // Option: option. From c5019eb37c16014740545b043bb3af0e663f5e50 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 23 Oct 2024 17:31:43 +0200 Subject: [PATCH 040/163] feat(serverless_jobs): add method to get jobs limits (#2275) --- api/jobs/v1alpha1/jobs_sdk.go | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/api/jobs/v1alpha1/jobs_sdk.go b/api/jobs/v1alpha1/jobs_sdk.go index 38dc2cb77..bc090eebe 100644 --- a/api/jobs/v1alpha1/jobs_sdk.go +++ b/api/jobs/v1alpha1/jobs_sdk.go @@ -404,6 +404,17 @@ type GetJobRunRequest struct { JobRunID string `json:"-"` } +// GetJobsLimitsRequest: get jobs limits request. +type GetJobsLimitsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` +} + +// JobsLimits: jobs limits. +type JobsLimits struct { + SecretsPerJobDefinition uint32 `json:"secrets_per_job_definition"` +} + // ListJobDefinitionSecretsRequest: list job definition secrets request. type ListJobDefinitionSecretsRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1162,3 +1173,30 @@ func (s *API) ListJobsResources(req *ListJobsResourcesRequest, opts ...scw.Reque } return &resp, nil } + +// GetJobsLimits: Get jobs limits for the console. +func (s *API) GetJobsLimits(req *GetJobsLimitsRequest, opts ...scw.RequestOption) (*JobsLimits, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/serverless-jobs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/jobs-limits", + } + + var resp JobsLimits + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From e8d28decbc8daf681ec0b4708c3f04e55d0c4b5a Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 24 Oct 2024 17:36:34 +0200 Subject: [PATCH 041/163] feat(edge_services): add orga id in pipeline message (#2276) --- api/edge_services/v1alpha1/edge_services_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index ff0ceadd9..e7bc7e1d2 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -910,6 +910,9 @@ type Pipeline struct { // ProjectID: project ID of the pipeline. ProjectID string `json:"project_id"` + // OrganizationID: organization ID of the pipeline. + OrganizationID string `json:"organization_id"` + // CreatedAt: date the pipeline was created. CreatedAt *time.Time `json:"created_at"` From 105ce0f288e4656de79ecdc17cdde00ee27d9f2d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 25 Oct 2024 13:29:25 +0200 Subject: [PATCH 042/163] fix(baremetal): update elastic metal gpu vram size, uint32 to uint64 (#2277) --- api/baremetal/v1/baremetal_sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/baremetal/v1/baremetal_sdk.go b/api/baremetal/v1/baremetal_sdk.go index ab8704ec9..5be225895 100644 --- a/api/baremetal/v1/baremetal_sdk.go +++ b/api/baremetal/v1/baremetal_sdk.go @@ -968,7 +968,7 @@ type GPU struct { Name string `json:"name"` // Vram: capacity of the vram in bytes. - Vram uint32 `json:"vram"` + Vram uint64 `json:"vram"` } // Memory: memory. From 545b6d7043c4e3ab00bd15246021cc32a34e6b31 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 25 Oct 2024 17:13:57 +0200 Subject: [PATCH 043/163] chore(baremetal): add missing available zones (#2278) --- api/flexibleip/v1alpha1/flexibleip_sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/flexibleip/v1alpha1/flexibleip_sdk.go b/api/flexibleip/v1alpha1/flexibleip_sdk.go index 09103e6da..d0a8f8f6d 100644 --- a/api/flexibleip/v1alpha1/flexibleip_sdk.go +++ b/api/flexibleip/v1alpha1/flexibleip_sdk.go @@ -535,7 +535,7 @@ func NewAPI(client *scw.Client) *API { } } func (s *API) Zones() []scw.Zone { - return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar2, scw.ZoneNlAms1} + return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar2, scw.ZoneNlAms1, scw.ZoneNlAms2, scw.ZonePlWaw2, scw.ZonePlWaw3} } // CreateFlexibleIP: Generate a new flexible IP within a given zone, specifying its configuration including Project ID and description. From 736ebc291485d4c258905368a51025e7b8a83ab7 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 25 Oct 2024 17:14:30 +0200 Subject: [PATCH 044/163] docs(mongodb): add documentation (#2279) --- api/mongodb/v1alpha1/mongodb_sdk.go | 66 ++++++++++++++--------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 8978e8f37..0f68df7e7 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -387,7 +387,7 @@ func (enum *VolumeType) UnmarshalJSON(data []byte) error { // EndpointPrivateNetworkDetails: Private Network details. type EndpointPrivateNetworkDetails struct { - // PrivateNetworkID: UUID of the private network. + // PrivateNetworkID: UUID of the Private Network. PrivateNetworkID string `json:"private_network_id"` } @@ -397,7 +397,7 @@ type EndpointPublicDetails struct { // EndpointSpecPrivateNetworkDetails: endpoint spec private network details. type EndpointSpecPrivateNetworkDetails struct { - // PrivateNetworkID: UUID of the private network. + // PrivateNetworkID: UUID of the Private Network. PrivateNetworkID string `json:"private_network_id"` } @@ -453,13 +453,13 @@ type NodeTypeVolumeType struct { // Default value: unknown_type Type VolumeType `json:"type"` - // Description: the description of the Volume. + // Description: the description of the volume. Description string `json:"description"` - // MinSize: mimimum size required for the Volume. + // MinSize: mimimum size required for the volume. MinSize scw.Size `json:"min_size"` - // MaxSize: maximum size required for the Volume. + // MaxSize: maximum size required for the volume. MaxSize scw.Size `json:"max_size"` // ChunkSize: minimum increment level for a Block Storage volume size. @@ -543,7 +543,7 @@ type Instance struct { // Default value: unknown_status Status InstanceStatus `json:"status"` - // Version: mongoDB™ engine version of the Database Instance. + // Version: mongoDB® engine version of the Database Instance. Version string `json:"version"` // Tags: list of tags applied to the Database Instance. @@ -573,10 +573,10 @@ type Instance struct { // NodeType: node type. type NodeType struct { - // Name: node Type name identifier. + // Name: node type name identifier. Name string `json:"name"` - // StockStatus: current stock status for the Node Type. + // StockStatus: current stock status for the node type. // Default value: unknown_stock StockStatus NodeTypeStock `json:"stock_status"` @@ -589,16 +589,16 @@ type NodeType struct { // Memory: quantity of RAM. Memory scw.Size `json:"memory"` - // AvailableVolumeTypes: available storage options for the Node Type. + // AvailableVolumeTypes: available storage options for the node type. AvailableVolumeTypes []*NodeTypeVolumeType `json:"available_volume_types"` - // Disabled: the Node Type is currently disabled. + // Disabled: the node type is currently disabled. Disabled bool `json:"disabled"` - // Beta: the Node Type is currently in beta. + // Beta: the node type is currently in beta. Beta bool `json:"beta"` - // InstanceRange: instance range associated with the NodeType offer. + // InstanceRange: instance range associated with the node type offer. InstanceRange string `json:"instance_range"` } @@ -635,10 +635,10 @@ type Snapshot struct { // NodeType: source node type. NodeType string `json:"node_type"` - // VolumeType: type of volume where data is stored sbs_5k or sbs_15k. + // VolumeType: type of volume where data is stored - sbs_5k or sbs_15k. VolumeType *SnapshotVolumeType `json:"volume_type"` - // Region: region of this snapshot. + // Region: region of the snapshot. Region scw.Region `json:"region"` } @@ -650,7 +650,7 @@ type User struct { // Version: version. type Version struct { - // Version: mongoDB™ engine version. + // Version: mongoDB® engine version. Version string `json:"version"` // EndOfLifeAt: date of End of Life. @@ -678,7 +678,7 @@ type CreateInstanceRequest struct { // Name: name of the Database Instance. Name string `json:"name"` - // Version: version of the MongoDB™ engine. + // Version: version of the MongoDB® engine. Version string `json:"version"` // Tags: tags to apply to the Database Instance. @@ -778,10 +778,10 @@ type ListInstancesRequest struct { // Default value: created_at_asc OrderBy ListInstancesRequestOrderBy `json:"-"` - // OrganizationID: organization ID the Database Instance belongs to. + // OrganizationID: organization ID of the Database Instance. OrganizationID *string `json:"-"` - // ProjectID: project ID to list the Database Instance of. + // ProjectID: project ID. ProjectID *string `json:"-"` Page *int32 `json:"-"` @@ -794,7 +794,7 @@ type ListInstancesResponse struct { // Instances: list of all Database Instances available in an Organization or Project. Instances []*Instance `json:"instances"` - // TotalCount: total count of Database Instances available in a Organization or Project. + // TotalCount: total count of Database Instances available in an Organization or Project. TotalCount uint64 `json:"total_count"` } @@ -866,7 +866,7 @@ type ListSnapshotsRequest struct { // InstanceID: instance ID the snapshots belongs to. InstanceID *string `json:"-"` - // Name: lists Database snapshots that match a name pattern. + // Name: lists database snapshots that match a name pattern. Name *string `json:"-"` // OrderBy: criteria to use when ordering snapshot listings. @@ -886,10 +886,10 @@ type ListSnapshotsRequest struct { // ListSnapshotsResponse: list snapshots response. type ListSnapshotsResponse struct { - // Snapshots: list of all Database Snapshots available in an Organization or Project. + // Snapshots: list of all database snapshots available in an Organization or Project. Snapshots []*Snapshot `json:"snapshots"` - // TotalCount: total count of Database Snapshots available in a Organization or Project. + // TotalCount: total count of database snapshots available in a Organization or Project. TotalCount uint64 `json:"total_count"` } @@ -974,10 +974,10 @@ type ListVersionsRequest struct { // ListVersionsResponse: list versions response. type ListVersionsResponse struct { - // Versions: available MongoDB™ engine version. + // Versions: available MongoDB® engine version. Versions []*Version `json:"versions"` - // TotalCount: total count of MongoDB™ engine version available. + // TotalCount: total count of MongoDB® engine version available. TotalCount uint64 `json:"total_count"` } @@ -1074,12 +1074,12 @@ type UpgradeInstanceRequest struct { // InstanceID: UUID of the Database Instance you want to upgrade. InstanceID string `json:"-"` - // VolumeSize: increase your block storage volume size. + // VolumeSize: increase your Block Storage volume size. // Precisely one of VolumeSize must be set. VolumeSize *scw.Size `json:"volume_size,omitempty"` } -// This API allows you to manage your Managed Databases for MongoDB. +// This API allows you to manage your Managed Databases for MongoDB®. type API struct { client *scw.Client } @@ -1132,7 +1132,7 @@ func (s *API) ListNodeTypes(req *ListNodeTypesRequest, opts ...scw.RequestOption return &resp, nil } -// ListVersions: List available MongoDB™ versions. +// ListVersions: List available MongoDB® versions. func (s *API) ListVersions(req *ListVersionsRequest, opts ...scw.RequestOption) (*ListVersionsResponse, error) { var err error @@ -1170,7 +1170,7 @@ func (s *API) ListVersions(req *ListVersionsRequest, opts ...scw.RequestOption) return &resp, nil } -// ListInstances: List all MongoDB™ Database Instances in the specified region, for a given Scaleway Project. By default, the MongoDB™ Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags` and `name`. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. +// ListInstances: List all MongoDB® Database Instances in the specified region. By default, the MongoDB® Database Instances returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. You can define additional parameters for your query, such as `tags` and `name`. For the `name` parameter, the value you include will be checked against the whole name string to see if it includes the string you put in the parameter. func (s *API) ListInstances(req *ListInstancesRequest, opts ...scw.RequestOption) (*ListInstancesResponse, error) { var err error @@ -1212,7 +1212,7 @@ func (s *API) ListInstances(req *ListInstancesRequest, opts ...scw.RequestOption return &resp, nil } -// GetInstance: Retrieve information about a given MongoDB™ Database Instance, specified by the `region` and `instance_id` parameters. Its full details, including name, status, IP address and port, are returned in the response object. +// GetInstance: Retrieve information about a given MongoDB® Database Instance, specified by the `region` and `instance_id` parameters. Its full details, including name, status, IP address and port, are returned in the response object. func (s *API) GetInstance(req *GetInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { var err error @@ -1243,7 +1243,7 @@ func (s *API) GetInstance(req *GetInstanceRequest, opts ...scw.RequestOption) (* return &resp, nil } -// CreateInstance: Create a new MongoDB™ Database Instance. +// CreateInstance: Create a new MongoDB® Database Instance. func (s *API) CreateInstance(req *CreateInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { var err error @@ -1284,7 +1284,7 @@ func (s *API) CreateInstance(req *CreateInstanceRequest, opts ...scw.RequestOpti return &resp, nil } -// UpdateInstance: Update the parameters of a MongoDB™ Database Instance. +// UpdateInstance: Update the parameters of a MongoDB® Database Instance. func (s *API) UpdateInstance(req *UpdateInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { var err error @@ -1320,7 +1320,7 @@ func (s *API) UpdateInstance(req *UpdateInstanceRequest, opts ...scw.RequestOpti return &resp, nil } -// DeleteInstance: Delete a given MongoDB™ Database Instance, specified by the `region` and `instance_id` parameters. Deleting a MongoDB™ Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. +// DeleteInstance: Delete a given MongoDB® Database Instance, specified by the `region` and `instance_id` parameters. Deleting a MongoDB® Database Instance is permanent, and cannot be undone. Note that upon deletion all your data will be lost. func (s *API) DeleteInstance(req *DeleteInstanceRequest, opts ...scw.RequestOption) (*Instance, error) { var err error @@ -1599,7 +1599,7 @@ func (s *API) ListSnapshots(req *ListSnapshotsRequest, opts ...scw.RequestOption return &resp, nil } -// DeleteSnapshot: Delete a given snapshot of a Database Instance. You must specify, in the endpoint, the `snapshot_id` parameter of the snapshot you want to delete. +// DeleteSnapshot: Delete a given snapshot of a Database Instance. You must specify, in the endpoint, the `snapshot_id` parameter of the snapshot you want to delete. func (s *API) DeleteSnapshot(req *DeleteSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { var err error From 3ca8f30908aa13dfe922b36c44b5318f5c630d9b Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 28 Oct 2024 15:41:47 +0100 Subject: [PATCH 045/163] feat(serverless): add timestamps to container resources (#2280) --- api/container/v1beta1/container_sdk.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index ac54dd70c..963322ecd 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -943,6 +943,15 @@ type Container struct { // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. ScalingOption *ContainerScalingOption `json:"scaling_option"` + // CreatedAt: creation date of the container. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last update date of the container. + UpdatedAt *time.Time `json:"updated_at"` + + // ReadyAt: last date when the container was successfully deployed and set to ready. + ReadyAt *time.Time `json:"ready_at"` + // Region: region in which the container will be deployed. Region scw.Region `json:"region"` } From f08c9feed4dd44a109f16c9352b1fda61a18ae29 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 28 Oct 2024 16:15:25 +0100 Subject: [PATCH 046/163] feat(rdb): activate encryption on existing instances (#2281) Co-authored-by: Laure-di <62625835+Laure-di@users.noreply.github.com> --- api/rdb/v1/rdb_sdk.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/api/rdb/v1/rdb_sdk.go b/api/rdb/v1/rdb_sdk.go index 2b7c6d409..b34ff3131 100644 --- a/api/rdb/v1/rdb_sdk.go +++ b/api/rdb/v1/rdb_sdk.go @@ -2827,29 +2827,33 @@ type UpgradeInstanceRequest struct { InstanceID string `json:"-"` // NodeType: node type of the Database Instance you want to upgrade to. - // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow must be set. + // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow, EnableEncryption must be set. NodeType *string `json:"node_type,omitempty"` // EnableHa: defines whether or not high availability should be enabled on the Database Instance. - // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow must be set. + // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow, EnableEncryption must be set. EnableHa *bool `json:"enable_ha,omitempty"` // VolumeSize: increase your block storage volume size. - // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow must be set. + // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow, EnableEncryption must be set. VolumeSize *uint64 `json:"volume_size,omitempty"` // VolumeType: change your Database Instance storage type. // Default value: lssd - // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow must be set. + // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow, EnableEncryption must be set. VolumeType *VolumeType `json:"volume_type,omitempty"` // UpgradableVersionID: this will create a new Database Instance with same specifications as the current one and perform a Database Engine upgrade. - // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow must be set. + // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow, EnableEncryption must be set. UpgradableVersionID *string `json:"upgradable_version_id,omitempty"` // MajorUpgradeWorkflow: upgrade your database engine to a new major version including instance endpoints. - // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow must be set. + // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow, EnableEncryption must be set. MajorUpgradeWorkflow *UpgradeInstanceRequestMajorUpgradeWorkflow `json:"major_upgrade_workflow,omitempty"` + + // EnableEncryption: defines whether or not encryption should be enabled on the Database Instance. + // Precisely one of NodeType, EnableHa, VolumeSize, VolumeType, UpgradableVersionID, MajorUpgradeWorkflow, EnableEncryption must be set. + EnableEncryption *bool `json:"enable_encryption,omitempty"` } // This API allows you to manage your Managed Databases for PostgreSQL and MySQL. From 2a48843b5fcba4ab5624b25ebe1dc79cae5fdac1 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 28 Oct 2024 16:36:17 +0100 Subject: [PATCH 047/163] feat(serverless): add tags to container resources (#2282) Co-authored-by: Laure-di <62625835+Laure-di@users.noreply.github.com> --- api/container/v1beta1/container_sdk.go | 9 +++++++++ api/function/v1beta1/function_sdk.go | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index 963322ecd..1a61d1975 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -1038,6 +1038,9 @@ type Namespace struct { // Region: region in which the namespace will be created. Region scw.Region `json:"region"` + + // Tags: [ALPHA] List of tags applied to the Serverless Container Namespace. + Tags []string `json:"tags"` } // Token: token. @@ -1234,6 +1237,9 @@ type CreateNamespaceRequest struct { // SecretEnvironmentVariables: secret environment variables of the namespace to create. SecretEnvironmentVariables []*Secret `json:"secret_environment_variables"` + + // Tags: [ALPHA] Tags of the Serverless Container Namespace. + Tags []string `json:"tags"` } // CreateTokenRequest: create token request. @@ -1811,6 +1817,9 @@ type UpdateNamespaceRequest struct { // SecretEnvironmentVariables: secret environment variables of the namespace to update. SecretEnvironmentVariables []*Secret `json:"secret_environment_variables"` + + // Tags: [ALPHA] Tags of the Serverless Container Namespace. + Tags *[]string `json:"tags,omitempty"` } // UpdateTriggerRequest: update trigger request. diff --git a/api/function/v1beta1/function_sdk.go b/api/function/v1beta1/function_sdk.go index be9b16926..468c01501 100644 --- a/api/function/v1beta1/function_sdk.go +++ b/api/function/v1beta1/function_sdk.go @@ -1138,6 +1138,9 @@ type Namespace struct { // Region: region in which the namespace is located. Region scw.Region `json:"region"` + + // Tags: [ALPHA] List of tags applied to the Serverless Function Namespace. + Tags []string `json:"tags"` } // Token: token. @@ -1316,6 +1319,9 @@ type CreateNamespaceRequest struct { // SecretEnvironmentVariables: secret environment variables of the namespace. SecretEnvironmentVariables []*Secret `json:"secret_environment_variables"` + + // Tags: [ALPHA] Tags of the Serverless Function Namespace. + Tags []string `json:"tags"` } // CreateTokenRequest: create token request. @@ -1941,6 +1947,9 @@ type UpdateNamespaceRequest struct { // SecretEnvironmentVariables: secret environment variables of the namespace. SecretEnvironmentVariables []*Secret `json:"secret_environment_variables"` + + // Tags: [ALPHA] Tags of the Serverless Function Namespace. + Tags *[]string `json:"tags,omitempty"` } // UpdateTriggerRequest: update trigger request. From 0f7899574cf64d4809645f0c10b475460aaf8624 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 29 Oct 2024 16:38:49 +0100 Subject: [PATCH 048/163] fix(object): change name from S3 to Object Storage (#2283) --- api/documentdb/v1beta1/documentdb_sdk.go | 2 +- api/inference/v1beta1/inference_sdk.go | 6 +++--- api/instance/v1/instance_sdk.go | 6 +++--- api/iot/v1/iot_sdk.go | 16 ++++++++-------- api/lb/v1/lb_sdk.go | 10 +++++----- api/rdb/v1/rdb_sdk.go | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/api/documentdb/v1beta1/documentdb_sdk.go b/api/documentdb/v1beta1/documentdb_sdk.go index 938df8db0..6f58ae84f 100644 --- a/api/documentdb/v1beta1/documentdb_sdk.go +++ b/api/documentdb/v1beta1/documentdb_sdk.go @@ -1270,7 +1270,7 @@ type ListInstanceLogsDetailsResponseInstanceLogDetail struct { // InstanceLog: instance log. type InstanceLog struct { - // DownloadURL: presigned S3 URL to download your log file. + // DownloadURL: presigned Object Storage URL to download your log file. DownloadURL *string `json:"download_url"` // ID: UUID of the Database Instance log. diff --git a/api/inference/v1beta1/inference_sdk.go b/api/inference/v1beta1/inference_sdk.go index df5cfe90e..6db2d94c7 100644 --- a/api/inference/v1beta1/inference_sdk.go +++ b/api/inference/v1beta1/inference_sdk.go @@ -372,7 +372,7 @@ type Model struct { // Description: purpose of the model. Description string `json:"description"` - // HasEula: defines whether the model has an end user licence agreement. + // HasEula: defines whether the model has an end user license agreement. HasEula bool `json:"has_eula"` // CreatedAt: creation date of the model. @@ -384,7 +384,7 @@ type Model struct { // Region: region of the model. Region scw.Region `json:"region"` - // S3Model: s3 URL pointing to the model source weight. + // S3Model: object Storage URL pointing to the model source weight. // Precisely one of S3Model must be set. S3Model *ModelS3Model `json:"s3_model,omitempty"` @@ -531,7 +531,7 @@ type DeleteEndpointRequest struct { // Eula: eula. type Eula struct { - // Content: content of the end user licence agreement. + // Content: content of the end user license agreement. Content string `json:"content"` } diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index babb07ea6..16dad2100 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -2581,10 +2581,10 @@ type ExportSnapshotRequest struct { // SnapshotID: snapshot ID. SnapshotID string `json:"-"` - // Bucket: s3 bucket name. + // Bucket: object Storage bucket name. Bucket string `json:"bucket,omitempty"` - // Key: s3 object key. + // Key: object key. Key string `json:"key,omitempty"` } @@ -5122,7 +5122,7 @@ func (s *API) DeleteSnapshot(req *DeleteSnapshotRequest, opts ...scw.RequestOpti return nil } -// ExportSnapshot: Export a snapshot to a specified S3 bucket in the same region. +// ExportSnapshot: Export a snapshot to a specified Object Storage bucket in the same region. func (s *API) ExportSnapshot(req *ExportSnapshotRequest, opts ...scw.RequestOption) (*ExportSnapshotResponse, error) { var err error diff --git a/api/iot/v1/iot_sdk.go b/api/iot/v1/iot_sdk.go index 11592c617..766cc941a 100644 --- a/api/iot/v1/iot_sdk.go +++ b/api/iot/v1/iot_sdk.go @@ -883,16 +883,16 @@ type RouteRestConfig struct { // RouteS3Config: route s3 config. type RouteS3Config struct { - // BucketRegion: region of the S3 route's destination bucket (e.g., 'fr-par'). + // BucketRegion: region of the Amazon S3 route's destination bucket (e.g., 'fr-par'). BucketRegion string `json:"bucket_region"` - // BucketName: destination bucket name of the S3 route. + // BucketName: destination bucket name of the Amazon S3 route. BucketName string `json:"bucket_name"` // ObjectPrefix: optional string to prefix object names with. ObjectPrefix string `json:"object_prefix"` - // Strategy: how the S3 route's objects will be created: one per topic or one per message. + // Strategy: how the Amazon S3 route's objects will be created: one per topic or one per message. // Default value: unknown Strategy RouteS3ConfigS3Strategy `json:"strategy"` } @@ -1038,7 +1038,7 @@ type CreateRouteRequest struct { // Topic: topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters. Topic string `json:"topic"` - // S3Config: if creating S3 Route, S3-specific configuration fields. + // S3Config: if creating Amazon S3 Routes, Amazon S3-specific configuration fields. // Precisely one of S3Config, DbConfig, RestConfig must be set. S3Config *CreateRouteRequestS3Config `json:"s3_config,omitempty"` @@ -1570,7 +1570,7 @@ type Route struct { // CreatedAt: date at which the route was created. CreatedAt *time.Time `json:"created_at"` - // S3Config: when using S3 Route, S3-specific configuration fields. + // S3Config: when using Amazon S3 Routes, Amazon S3-specific configuration fields. // Precisely one of S3Config, DbConfig, RestConfig must be set. S3Config *RouteS3Config `json:"s3_config,omitempty"` @@ -1702,7 +1702,7 @@ type UpdateRouteRequest struct { // Topic: topic the route subscribes to. It must be a valid MQTT topic and up to 65535 characters. Topic *string `json:"topic,omitempty"` - // S3Config: when updating S3 Route, S3-specific configuration fields. + // S3Config: when updating Amazon S3 Route, Amazon S3-specific configuration fields. // Precisely one of S3Config, DbConfig, RestConfig must be set. S3Config *UpdateRouteRequestS3Config `json:"s3_config,omitempty"` @@ -2516,8 +2516,8 @@ func (s *API) ListRoutes(req *ListRoutesRequest, opts ...scw.RequestOption) (*Li // You need to manage the database by yourself. // - REST Route. // Create a route that will call a REST API on received subscribed MQTT messages. -// - S3 Routes. -// Create a route that will put subscribed MQTT messages into an S3 bucket. +// - Amazon S3 Routes. +// Create a route that will put subscribed MQTT messages into an Object Storage bucket. // You need to create the bucket yourself and grant write access. // Granting can be done with s3cmd (`s3cmd setacl s3:// --acl-grant=write:555c69c3-87d0-4bf8-80f1-99a2f757d031:555c69c3-87d0-4bf8-80f1-99a2f757d031`). func (s *API) CreateRoute(req *CreateRouteRequest, opts ...scw.RequestOption) (*Route, error) { diff --git a/api/lb/v1/lb_sdk.go b/api/lb/v1/lb_sdk.go index 84c8e725e..13d80670d 100644 --- a/api/lb/v1/lb_sdk.go +++ b/api/lb/v1/lb_sdk.go @@ -1460,7 +1460,7 @@ type Backend struct { // UpdatedAt: date at which the backend was updated. UpdatedAt *time.Time `json:"updated_at"` - // FailoverHost: scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. + // FailoverHost: scaleway Object Storage bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. FailoverHost *string `json:"failover_host"` // SslBridging: defines whether to enable SSL bridging between the Load Balancer and backend servers. @@ -1960,7 +1960,7 @@ type CreateBackendRequest struct { // Default value: proxy_protocol_unknown ProxyProtocol ProxyProtocol `json:"proxy_protocol"` - // FailoverHost: scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. + // FailoverHost: scaleway Object Storage bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. FailoverHost *string `json:"failover_host,omitempty"` // SslBridging: defines whether to enable SSL bridging between the Load Balancer and backend servers. @@ -3081,7 +3081,7 @@ type UpdateBackendRequest struct { // Default value: proxy_protocol_unknown ProxyProtocol ProxyProtocol `json:"proxy_protocol"` - // FailoverHost: scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. + // FailoverHost: scaleway Object Storage bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. FailoverHost *string `json:"failover_host,omitempty"` // SslBridging: defines whether to enable SSL bridging between the Load Balancer and backend servers. @@ -3489,7 +3489,7 @@ type ZonedAPICreateBackendRequest struct { // Default value: proxy_protocol_unknown ProxyProtocol ProxyProtocol `json:"proxy_protocol"` - // FailoverHost: scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. + // FailoverHost: scaleway Object Storage bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. FailoverHost *string `json:"failover_host,omitempty"` // SslBridging: defines whether to enable SSL bridging between the Load Balancer and backend servers. @@ -4280,7 +4280,7 @@ type ZonedAPIUpdateBackendRequest struct { // Default value: proxy_protocol_unknown ProxyProtocol ProxyProtocol `json:"proxy_protocol"` - // FailoverHost: scaleway S3 bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. + // FailoverHost: scaleway Object Storage bucket website to be served as failover if all backend servers are down, e.g. failover-website.s3-website.fr-par.scw.cloud. FailoverHost *string `json:"failover_host,omitempty"` // SslBridging: defines whether to enable SSL bridging between the Load Balancer and backend servers. diff --git a/api/rdb/v1/rdb_sdk.go b/api/rdb/v1/rdb_sdk.go index b34ff3131..ed036bcc8 100644 --- a/api/rdb/v1/rdb_sdk.go +++ b/api/rdb/v1/rdb_sdk.go @@ -1459,7 +1459,7 @@ type ListInstanceLogsDetailsResponseInstanceLogDetail struct { // InstanceLog: instance log. type InstanceLog struct { - // DownloadURL: presigned S3 URL to download your log file. + // DownloadURL: presigned Object Storage URL to download your log file. DownloadURL *string `json:"download_url"` // ID: UUID of the Database Instance log. From 3f147e51c10077e23c65ff6bf96526519d975805 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 29 Oct 2024 16:52:29 +0100 Subject: [PATCH 049/163] feat(serverless): add timestamps to function resources (#2284) Co-authored-by: Laure-di <62625835+Laure-di@users.noreply.github.com> --- api/function/v1beta1/function_sdk.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/api/function/v1beta1/function_sdk.go b/api/function/v1beta1/function_sdk.go index 468c01501..608af8291 100644 --- a/api/function/v1beta1/function_sdk.go +++ b/api/function/v1beta1/function_sdk.go @@ -1098,6 +1098,15 @@ type Function struct { // Sandbox: execution environment of the function. // Default value: unknown_sandbox Sandbox FunctionSandbox `json:"sandbox"` + + // CreatedAt: creation date of the function. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last update date of the function. + UpdatedAt *time.Time `json:"updated_at"` + + // ReadyAt: last date when the function was successfully deployed and set to ready. + ReadyAt *time.Time `json:"ready_at"` } // Namespace: namespace. From 7d2e04989bb69e5ad464c1e0bbfce7602d067400 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 29 Oct 2024 16:56:51 +0100 Subject: [PATCH 050/163] feat(mongodb): add CreateUser grpc layer (#2285) Co-authored-by: Laure-di <62625835+Laure-di@users.noreply.github.com> --- api/mongodb/v1alpha1/mongodb_sdk.go | 55 +++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 0f68df7e7..a96240f36 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -718,6 +718,21 @@ type CreateSnapshotRequest struct { ExpiresAt *time.Time `json:"expires_at,omitempty"` } +// CreateUserRequest: create user request. +type CreateUserRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance the user belongs to. + InstanceID string `json:"-"` + + // Name: name of the database user. + Name string `json:"-"` + + // Password: password of the database user. + Password *string `json:"password,omitempty"` +} + // DeleteInstanceRequest: delete instance request. type DeleteInstanceRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1673,6 +1688,46 @@ func (s *API) ListUsers(req *ListUsersRequest, opts ...scw.RequestOption) (*List return &resp, nil } +// CreateUser: Create an user on a Database Instance. You must define the `name`, `password` of the user and `instance_id` parameters in the request. +func (s *API) CreateUser(req *CreateUserRequest, opts ...scw.RequestOption) (*User, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return nil, errors.New("field InstanceID cannot be empty in request") + } + + if fmt.Sprint(req.Name) == "" { + return nil, errors.New("field Name cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/users/" + fmt.Sprint(req.Name) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp User + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // UpdateUser: Update the parameters of a user on a Database Instance. You can update the `password` parameter, but you cannot change the name of the user. func (s *API) UpdateUser(req *UpdateUserRequest, opts ...scw.RequestOption) (*User, error) { var err error From 1bc1d1c14d576527a22a3493bddc299bcb3e1e74 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:34:10 +0100 Subject: [PATCH 051/163] feat(serverless): add option to scale on CPU usage (#2286) --- api/container/v1beta1/container_sdk.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index 1a61d1975..416173c59 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -764,8 +764,11 @@ func (enum *TriggerStatus) UnmarshalJSON(data []byte) error { // ContainerScalingOption: container scaling option. type ContainerScalingOption struct { - // Precisely one of ConcurrentRequestsThreshold must be set. + // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold must be set. ConcurrentRequestsThreshold *uint32 `json:"concurrent_requests_threshold,omitempty"` + + // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold must be set. + CPUUsageThreshold *uint32 `json:"cpu_usage_threshold,omitempty"` } // SecretHashedValue: secret hashed value. @@ -941,6 +944,7 @@ type Container struct { // ScalingOption: possible values: // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. + // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option"` // CreatedAt: creation date of the container. @@ -1185,6 +1189,7 @@ type CreateContainerRequest struct { // ScalingOption: possible values: // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. + // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` } @@ -1777,6 +1782,7 @@ type UpdateContainerRequest struct { // ScalingOption: possible values: // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. + // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` } From 389d36b9bf34475e85567c33627648208e948d24 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:34:38 +0100 Subject: [PATCH 052/163] feat(mongodb): make CreateUser.password none optional (#2288) --- api/mongodb/v1alpha1/mongodb_sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index a96240f36..6ef234ffd 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -730,7 +730,7 @@ type CreateUserRequest struct { Name string `json:"-"` // Password: password of the database user. - Password *string `json:"password,omitempty"` + Password string `json:"password"` } // DeleteInstanceRequest: delete instance request. From c1e03a8756f391e04b9ddbd0c596a7e30b257284 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:35:07 +0100 Subject: [PATCH 053/163] feat(container): add health check spec to containers (#2289) --- api/container/v1beta1/container_sdk.go | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index 416173c59..3ef8c1d29 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -762,6 +762,34 @@ func (enum *TriggerStatus) UnmarshalJSON(data []byte) error { return nil } +// ContainerHealthCheckSpecHTTPProbe: container health check spec http probe. +type ContainerHealthCheckSpecHTTPProbe struct { + // Path: path to use for the HTTP health check. + Path string `json:"path"` +} + +// ContainerHealthCheckSpecTCPProbe: container health check spec tcp probe. +type ContainerHealthCheckSpecTCPProbe struct { +} + +// ContainerHealthCheckSpec: container health check spec. +type ContainerHealthCheckSpec struct { + // HTTP: HTTP health check configuration. + // Precisely one of HTTP, TCP must be set. + HTTP *ContainerHealthCheckSpecHTTPProbe `json:"http,omitempty"` + + // TCP: TCP health check configuration. + // Precisely one of HTTP, TCP must be set. + TCP *ContainerHealthCheckSpecTCPProbe `json:"tcp,omitempty"` + + // FailureThreshold: during a deployment, if a newly created container fails to pass the health check, the deployment is aborted. + // As a result, lowering this value can help to reduce the time it takes to detect a failed deployment. + FailureThreshold uint32 `json:"failure_threshold"` + + // Interval: period between health checks. + Interval *scw.Duration `json:"interval"` +} + // ContainerScalingOption: container scaling option. type ContainerScalingOption struct { // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold must be set. @@ -947,6 +975,9 @@ type Container struct { // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option"` + // HealthCheck: health check configuration of the container. + HealthCheck *ContainerHealthCheckSpec `json:"health_check"` + // CreatedAt: creation date of the container. CreatedAt *time.Time `json:"created_at"` @@ -1191,6 +1222,9 @@ type CreateContainerRequest struct { // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` + + // HealthCheck: health check configuration of the container. + HealthCheck *ContainerHealthCheckSpec `json:"health_check,omitempty"` } // CreateCronRequest: create cron request. @@ -1784,6 +1818,9 @@ type UpdateContainerRequest struct { // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` + + // HealthCheck: health check configuration of the container. + HealthCheck *ContainerHealthCheckSpec `json:"health_check,omitempty"` } // UpdateCronRequest: update cron request. From 76962a0824b54167b718832f5e48a71bb4983827 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:36:02 +0100 Subject: [PATCH 054/163] feat(k8s): add support for ACL routes (#2290) --- api/k8s/v1/k8s_sdk.go | 261 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 6cb31d94c..2d0b3db9a 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -872,6 +872,37 @@ type Pool struct { Region scw.Region `json:"region"` } +// ACLRuleRequest: acl rule request. +type ACLRuleRequest struct { + // IP: IP subnet to allow. + // Precisely one of IP, ScalewayRanges must be set. + IP *scw.IPNet `json:"ip,omitempty"` + + // ScalewayRanges: only one rule with this field set to true can be added. + // Precisely one of IP, ScalewayRanges must be set. + ScalewayRanges *bool `json:"scaleway_ranges,omitempty"` + + // Description: description of the ACL. + Description string `json:"description"` +} + +// ACLRule: acl rule. +type ACLRule struct { + // ID: ID of the ACL rule. + ID string `json:"id"` + + // IP: IP subnet to allow. + // Precisely one of IP, ScalewayRanges must be set. + IP *scw.IPNet `json:"ip,omitempty"` + + // ScalewayRanges: only one rule with this field set to true can be added. + // Precisely one of IP, ScalewayRanges must be set. + ScalewayRanges *bool `json:"scaleway_ranges,omitempty"` + + // Description: description of the ACL. + Description string `json:"description"` +} + // CreateClusterRequestAutoUpgrade: create cluster request auto upgrade. type CreateClusterRequestAutoUpgrade struct { // Enable: defines whether auto upgrade is enabled for the cluster. @@ -1284,6 +1315,24 @@ type UpdatePoolRequestUpgradePolicy struct { MaxSurge *uint32 `json:"max_surge"` } +// AddClusterACLRulesRequest: add cluster acl rules request. +type AddClusterACLRulesRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ClusterID: ID of the cluster whose ACLs will be added. + ClusterID string `json:"-"` + + // ACLs: aCLs to add. + ACLs []*ACLRuleRequest `json:"acls"` +} + +// AddClusterACLRulesResponse: add cluster acl rules response. +type AddClusterACLRulesResponse struct { + // Rules: aCLs that were added. + Rules []*ACLRule `json:"rules"` +} + // AuthExternalNodeRequest: auth external node request. type AuthExternalNodeRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1417,6 +1466,15 @@ type CreatePoolRequest struct { PublicIPDisabled bool `json:"public_ip_disabled"` } +// DeleteACLRuleRequest: delete acl rule request. +type DeleteACLRuleRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ACLID: ID of the ACL rule to delete. + ACLID string `json:"-"` +} + // DeleteClusterRequest: delete cluster request. type DeleteClusterRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1543,6 +1601,49 @@ type GetVersionRequest struct { VersionName string `json:"-"` } +// ListClusterACLRulesRequest: list cluster acl rules request. +type ListClusterACLRulesRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ClusterID: ID of the cluster whose ACLs will be listed. + ClusterID string `json:"-"` + + // Page: page number for the returned ACLs. + Page *int32 `json:"-"` + + // PageSize: maximum number of ACLs per page. + PageSize *uint32 `json:"-"` +} + +// ListClusterACLRulesResponse: list cluster acl rules response. +type ListClusterACLRulesResponse struct { + // TotalCount: total number of ACLs that exist for the cluster. + TotalCount uint64 `json:"total_count"` + + // Rules: paginated returned ACLs. + Rules []*ACLRule `json:"rules"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListClusterACLRulesResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListClusterACLRulesResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListClusterACLRulesResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Rules = append(r.Rules, results.Rules...) + r.TotalCount += uint64(len(results.Rules)) + return uint64(len(results.Rules)), nil +} + // ListClusterAvailableTypesRequest: list cluster available types request. type ListClusterAvailableTypesRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1888,6 +1989,24 @@ type ResetClusterAdminTokenRequest struct { ClusterID string `json:"-"` } +// SetClusterACLRulesRequest: set cluster acl rules request. +type SetClusterACLRulesRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ClusterID: ID of the cluster whose ACLs will be set. + ClusterID string `json:"-"` + + // ACLs: aCLs to set. + ACLs []*ACLRuleRequest `json:"acls"` +} + +// SetClusterACLRulesResponse: set cluster acl rules response. +type SetClusterACLRulesResponse struct { + // Rules: aCLs that were set. + Rules []*ACLRule `json:"rules"` +} + // SetClusterTypeRequest: set cluster type request. type SetClusterTypeRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -2443,6 +2562,148 @@ func (s *API) MigrateClusterToSBSCSI(req *MigrateClusterToSBSCSIRequest, opts .. return &resp, nil } +// ListClusterACLRules: List ACLs for a specific cluster. +func (s *API) ListClusterACLRules(req *ListClusterACLRulesRequest, opts ...scw.RequestOption) (*ListClusterACLRulesResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.ClusterID) == "" { + return nil, errors.New("field ClusterID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/k8s/v1/regions/" + fmt.Sprint(req.Region) + "/clusters/" + fmt.Sprint(req.ClusterID) + "/acls", + Query: query, + } + + var resp ListClusterACLRulesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// AddClusterACLRules: Add new ACL rules for a specific cluster. +func (s *API) AddClusterACLRules(req *AddClusterACLRulesRequest, opts ...scw.RequestOption) (*AddClusterACLRulesResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.ClusterID) == "" { + return nil, errors.New("field ClusterID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/k8s/v1/regions/" + fmt.Sprint(req.Region) + "/clusters/" + fmt.Sprint(req.ClusterID) + "/acls", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp AddClusterACLRulesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// SetClusterACLRules: Set new ACL rules for a specific cluster. +func (s *API) SetClusterACLRules(req *SetClusterACLRulesRequest, opts ...scw.RequestOption) (*SetClusterACLRulesResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.ClusterID) == "" { + return nil, errors.New("field ClusterID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PUT", + Path: "/k8s/v1/regions/" + fmt.Sprint(req.Region) + "/clusters/" + fmt.Sprint(req.ClusterID) + "/acls", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp SetClusterACLRulesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteACLRule: Delete an existing ACL. +func (s *API) DeleteACLRule(req *DeleteACLRuleRequest, opts ...scw.RequestOption) error { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.ACLID) == "" { + return errors.New("field ACLID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/k8s/v1/regions/" + fmt.Sprint(req.Region) + "/acls/" + fmt.Sprint(req.ACLID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} + // ListPools: List all the existing pools for a specific Kubernetes cluster. func (s *API) ListPools(req *ListPoolsRequest, opts ...scw.RequestOption) (*ListPoolsResponse, error) { var err error From 5109ac793c1b688f1084a4ad931bb57619135255 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:36:32 +0100 Subject: [PATCH 055/163] feat(mongodb): fix typo the CreateUser url (#2291) --- api/mongodb/v1alpha1/mongodb_sdk.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 6ef234ffd..2920fa5e0 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -727,7 +727,7 @@ type CreateUserRequest struct { InstanceID string `json:"-"` // Name: name of the database user. - Name string `json:"-"` + Name string `json:"name"` // Password: password of the database user. Password string `json:"password"` @@ -1705,13 +1705,9 @@ func (s *API) CreateUser(req *CreateUserRequest, opts ...scw.RequestOption) (*Us return nil, errors.New("field InstanceID cannot be empty in request") } - if fmt.Sprint(req.Name) == "" { - return nil, errors.New("field Name cannot be empty in request") - } - scwReq := &scw.ScalewayRequest{ Method: "POST", - Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/users/" + fmt.Sprint(req.Name) + "", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/users", } err = scwReq.SetBody(req) From f3b2c1042653a05ced540c3d0f46f8c7ff51ee26 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:36:50 +0100 Subject: [PATCH 056/163] feat(iam): add LockUser and UnlockUser method (#2292) --- api/iam/v1alpha1/iam_sdk.go | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 8d0eadb62..2abb934de 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -2069,6 +2069,11 @@ func (r *ListUsersResponse) UnsafeAppend(res interface{}) (uint32, error) { return uint32(len(results.Users)), nil } +// LockUserRequest: lock user request. +type LockUserRequest struct { + UserID string `json:"-"` +} + // RemoveGroupMemberRequest: remove group member request. type RemoveGroupMemberRequest struct { // GroupID: ID of the group. @@ -2107,6 +2112,11 @@ type SetRulesResponse struct { Rules []*Rule `json:"rules"` } +// UnlockUserRequest: unlock user request. +type UnlockUserRequest struct { + UserID string `json:"-"` +} + // UpdateAPIKeyRequest: update api key request. type UpdateAPIKeyRequest struct { // AccessKey: access key to update. @@ -2512,6 +2522,60 @@ func (s *API) UpdateUserPassword(req *UpdateUserPasswordRequest, opts ...scw.Req return &resp, nil } +// LockUser: Lock a user. Note that a locked user cannot log in or use API keys until the locked status is removed. +func (s *API) LockUser(req *LockUserRequest, opts ...scw.RequestOption) (*User, error) { + var err error + + if fmt.Sprint(req.UserID) == "" { + return nil, errors.New("field UserID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/iam/v1alpha1/users/" + fmt.Sprint(req.UserID) + "/lock", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp User + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UnlockUser: Unlock a user. +func (s *API) UnlockUser(req *UnlockUserRequest, opts ...scw.RequestOption) (*User, error) { + var err error + + if fmt.Sprint(req.UserID) == "" { + return nil, errors.New("field UserID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/iam/v1alpha1/users/" + fmt.Sprint(req.UserID) + "/unlock", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp User + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // ListApplications: List the applications of an Organization. By default, the applications listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters for your query such as `application_ids`. func (s *API) ListApplications(req *ListApplicationsRequest, opts ...scw.RequestOption) (*ListApplicationsResponse, error) { var err error From be4bf11ab7d3c3303b023d7cc37c4b762678304b Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:37:41 +0100 Subject: [PATCH 057/163] docs(iam): add doc for UpdateUserPassword (#2293) --- api/iam/v1alpha1/iam_sdk.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 2abb934de..d189311a5 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -2203,10 +2203,13 @@ type UpdateSSHKeyRequest struct { // UpdateUserPasswordRequest: update user password request. type UpdateUserPasswordRequest struct { + // UserID: ID of the user to update. UserID string `json:"-"` + // Password: the new password. Password string `json:"password"` + // SendEmail: whether or not to send an email alerting the user their password has changed. SendEmail bool `json:"send_email"` } @@ -2495,7 +2498,7 @@ func (s *API) CreateUser(req *CreateUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } -// UpdateUserPassword: +// UpdateUserPassword: Update an user's password. func (s *API) UpdateUserPassword(req *UpdateUserPasswordRequest, opts ...scw.RequestOption) (*User, error) { var err error From ea71690241633ddf9b4fa73c39784f47b5443fff Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 31 Oct 2024 17:38:26 +0100 Subject: [PATCH 058/163] feat(applesilicon): add support for VNC port (#2287) --- api/applesilicon/v1alpha1/applesilicon_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/applesilicon/v1alpha1/applesilicon_sdk.go b/api/applesilicon/v1alpha1/applesilicon_sdk.go index 0973f6158..4cc6de7ee 100644 --- a/api/applesilicon/v1alpha1/applesilicon_sdk.go +++ b/api/applesilicon/v1alpha1/applesilicon_sdk.go @@ -293,6 +293,9 @@ type Server struct { // SudoPassword: admin password required to execute commands. SudoPassword string `json:"sudo_password"` + // VncPort: vNC port to use for remote desktop connection. + VncPort uint32 `json:"vnc_port"` + // Os: initially installed OS, this does not necessarily reflect the current OS version. Os *OS `json:"os"` From b6b9e5455a0e081ab913f66f39fcea2879f1018d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 4 Nov 2024 18:37:14 +0100 Subject: [PATCH 059/163] feat(cockpit): add retention setup in datasource (#2294) --- api/cockpit/v1/cockpit_sdk.go | 75 ++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/api/cockpit/v1/cockpit_sdk.go b/api/cockpit/v1/cockpit_sdk.go index 18210bce6..d6d51991f 100644 --- a/api/cockpit/v1/cockpit_sdk.go +++ b/api/cockpit/v1/cockpit_sdk.go @@ -92,8 +92,6 @@ const ( DataSourceTypeLogs = DataSourceType("logs") // Traces data source type, used to store and query traces using Grafana Tempo. DataSourceTypeTraces = DataSourceType("traces") - // Alerts data source type, used as an endpoint for firing alerts using the Grafana Mimir alert manager. - DataSourceTypeAlerts = DataSourceType("alerts") ) func (enum DataSourceType) String() string { @@ -110,7 +108,6 @@ func (enum DataSourceType) Values() []DataSourceType { "metrics", "logs", "traces", - "alerts", } } @@ -524,6 +521,15 @@ type ContactPointEmail struct { To string `json:"to"` } +// GetConfigResponseRetention: get config response retention. +type GetConfigResponseRetention struct { + MinDays uint32 `json:"min_days"` + + MaxDays uint32 `json:"max_days"` + + DefaultDays uint32 `json:"default_days"` +} + // ContactPoint: Contact point. type ContactPoint struct { // Email: email address to send alerts to. @@ -565,6 +571,9 @@ type DataSource struct { // SynchronizedWithGrafana: indicates whether the data source is synchronized with Grafana. SynchronizedWithGrafana bool `json:"synchronized_with_grafana"` + // RetentionDays: bETA - Duration for which the data will be retained in the data source. + RetentionDays uint32 `json:"retention_days"` + // Region: region of the data source. Region scw.Region `json:"region"` } @@ -716,6 +725,18 @@ type AlertManager struct { Region scw.Region `json:"region"` } +// GetConfigResponse: Cockpit configuration. +type GetConfigResponse struct { + // MetricsRetention: metrics retention configuration. + MetricsRetention *GetConfigResponseRetention `json:"metrics_retention"` + + // LogsRetention: logs retention configuration. + LogsRetention *GetConfigResponseRetention `json:"logs_retention"` + + // TracesRetention: traces retention configuration. + TracesRetention *GetConfigResponseRetention `json:"traces_retention"` +} + // GlobalAPICreateGrafanaUserRequest: Create a Grafana user. type GlobalAPICreateGrafanaUserRequest struct { // ProjectID: ID of the Project in which to create the Grafana user. @@ -1062,6 +1083,9 @@ type RegionalAPICreateDataSourceRequest struct { // Type: data source type. // Default value: unknown_type Type DataSourceType `json:"type"` + + // RetentionDays: default values are 30 days for metrics, 7 days for logs and traces. + RetentionDays *uint32 `json:"retention_days,omitempty"` } // RegionalAPICreateTokenRequest: Create a token. @@ -1155,6 +1179,12 @@ type RegionalAPIGetAlertManagerRequest struct { ProjectID string `json:"project_id"` } +// RegionalAPIGetConfigRequest: Get Cockpit configuration. +type RegionalAPIGetConfigRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` +} + // RegionalAPIGetDataSourceRequest: Retrieve a data source. type RegionalAPIGetDataSourceRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1284,6 +1314,9 @@ type RegionalAPIUpdateDataSourceRequest struct { // Name: updated name of the data source. Name *string `json:"name,omitempty"` + + // RetentionDays: bETA - Duration for which the data will be retained in the data source. + RetentionDays *uint32 `json:"retention_days,omitempty"` } // UsageOverview: usage overview. @@ -1557,7 +1590,8 @@ func (s *GlobalAPI) GetGrafanaProductDashboard(req *GlobalAPIGetGrafanaProductDa return &resp, nil } -// ListPlans: Retrieve a list of available pricing plan types. +// Deprecated: ListPlans: Retrieve a list of available pricing plan types. +// Deprecated, retention is now managed at the data source level. func (s *GlobalAPI) ListPlans(req *GlobalAPIListPlansRequest, opts ...scw.RequestOption) (*ListPlansResponse, error) { var err error @@ -1586,7 +1620,8 @@ func (s *GlobalAPI) ListPlans(req *GlobalAPIListPlansRequest, opts ...scw.Reques return &resp, nil } -// SelectPlan: Apply a pricing plan on a given Project. You must specify the ID of the pricing plan type. Note that you will be billed for the plan you apply. +// Deprecated: SelectPlan: Apply a pricing plan on a given Project. You must specify the ID of the pricing plan type. Note that you will be billed for the plan you apply. +// Deprecated, retention is now managed at the data source level. func (s *GlobalAPI) SelectPlan(req *GlobalAPISelectPlanRequest, opts ...scw.RequestOption) (*Plan, error) { var err error @@ -1614,7 +1649,8 @@ func (s *GlobalAPI) SelectPlan(req *GlobalAPISelectPlanRequest, opts ...scw.Requ return &resp, nil } -// GetCurrentPlan: Retrieve a pricing plan for the given Project, specified by the ID of the Project. +// Deprecated: GetCurrentPlan: Retrieve a pricing plan for the given Project, specified by the ID of the Project. +// Deprecated, retention is now managed at the data source level. func (s *GlobalAPI) GetCurrentPlan(req *GlobalAPIGetCurrentPlanRequest, opts ...scw.RequestOption) (*Plan, error) { var err error @@ -1656,6 +1692,33 @@ func (s *RegionalAPI) Regions() []scw.Region { return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} } +// GetConfig: Get the Cockpit configuration. +func (s *RegionalAPI) GetConfig(req *RegionalAPIGetConfigRequest, opts ...scw.RequestOption) (*GetConfigResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/cockpit/v1/regions/" + fmt.Sprint(req.Region) + "/config", + } + + var resp GetConfigResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // CreateDataSource: You must specify the data source type upon creation. Available data source types include: // - metrics // - logs From 7cd49c96d19a864eec7f9d14e1f16e2ab47da2cb Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 5 Nov 2024 14:24:35 +0100 Subject: [PATCH 060/163] feat(serverless_jobs): enable secrets (#2295) --- api/jobs/v1alpha1/jobs_sdk.go | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/api/jobs/v1alpha1/jobs_sdk.go b/api/jobs/v1alpha1/jobs_sdk.go index bc090eebe..560e0c4ff 100644 --- a/api/jobs/v1alpha1/jobs_sdk.go +++ b/api/jobs/v1alpha1/jobs_sdk.go @@ -203,15 +203,20 @@ type CreateJobDefinitionSecretsRequestSecretConfig struct { // Secret: secret. type Secret struct { + // SecretID: UUID of the secret reference within the job. SecretID string `json:"secret_id"` + // SecretManagerID: UUID of the secret in Secret Manager. SecretManagerID string `json:"secret_manager_id"` + // SecretManagerVersion: version of the secret in Secret Manager. SecretManagerVersion string `json:"secret_manager_version"` + // File: file secret mounted inside the job. // Precisely one of File, EnvVar must be set. File *SecretFile `json:"file,omitempty"` + // EnvVar: environment variable used to expose the secret. // Precisely one of File, EnvVar must be set. EnvVar *SecretEnvVar `json:"env_var,omitempty"` } @@ -345,15 +350,16 @@ type CreateJobDefinitionSecretsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // JobDefinitionID: UUID of the job definition to get. + // JobDefinitionID: UUID of the job definition. JobDefinitionID string `json:"-"` - // Secrets: secrets to inject into the job. + // Secrets: list of secrets to inject into the job. Secrets []*CreateJobDefinitionSecretsRequestSecretConfig `json:"secrets"` } // CreateJobDefinitionSecretsResponse: create job definition secrets response. type CreateJobDefinitionSecretsResponse struct { + // Secrets: list of secrets created. Secrets []*Secret `json:"secrets"` } @@ -371,8 +377,10 @@ type DeleteJobDefinitionSecretRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` + // JobDefinitionID: UUID of the job definition. JobDefinitionID string `json:"-"` + // SecretID: UUID of the secret reference within the job. SecretID string `json:"-"` } @@ -390,8 +398,10 @@ type GetJobDefinitionSecretRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` + // JobDefinitionID: UUID of the job definition. JobDefinitionID string `json:"-"` + // SecretID: UUID of the secret reference within the job. SecretID string `json:"-"` } @@ -420,13 +430,16 @@ type ListJobDefinitionSecretsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` + // JobDefinitionID: UUID of the job definition. JobDefinitionID string `json:"-"` } // ListJobDefinitionSecretsResponse: list job definition secrets response. type ListJobDefinitionSecretsResponse struct { + // Secrets: list of secret references within a job definition. Secrets []*Secret `json:"secrets"` + // TotalCount: total count of secret references within a job definition. TotalCount uint64 `json:"total_count"` } @@ -623,15 +636,20 @@ type UpdateJobDefinitionSecretRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` + // JobDefinitionID: UUID of the job definition. JobDefinitionID string `json:"-"` + // SecretID: UUID of the secret reference within the job. SecretID string `json:"-"` + // SecretManagerVersion: version of the secret in Secret Manager. SecretManagerVersion *string `json:"secret_manager_version,omitempty"` + // Path: path of the secret to mount inside the job (either `path` or `env_var_name` must be set). // Precisely one of Path, EnvVarName must be set. Path *string `json:"path,omitempty"` + // EnvVarName: environment variable name used to expose the secret inside the job (either `path` or `env_var_name` must be set). // Precisely one of Path, EnvVarName must be set. EnvVarName *string `json:"env_var_name,omitempty"` } @@ -864,7 +882,7 @@ func (s *API) StartJobDefinition(req *StartJobDefinitionRequest, opts ...scw.Req return &resp, nil } -// CreateJobDefinitionSecrets: +// CreateJobDefinitionSecrets: Create a secret reference within a job definition. func (s *API) CreateJobDefinitionSecrets(req *CreateJobDefinitionSecretsRequest, opts ...scw.RequestOption) (*CreateJobDefinitionSecretsResponse, error) { var err error @@ -900,7 +918,7 @@ func (s *API) CreateJobDefinitionSecrets(req *CreateJobDefinitionSecretsRequest, return &resp, nil } -// GetJobDefinitionSecret: +// GetJobDefinitionSecret: Get a secret references within a job definition. func (s *API) GetJobDefinitionSecret(req *GetJobDefinitionSecretRequest, opts ...scw.RequestOption) (*Secret, error) { var err error @@ -935,7 +953,7 @@ func (s *API) GetJobDefinitionSecret(req *GetJobDefinitionSecretRequest, opts .. return &resp, nil } -// ListJobDefinitionSecrets: +// ListJobDefinitionSecrets: List secrets references within a job definition. func (s *API) ListJobDefinitionSecrets(req *ListJobDefinitionSecretsRequest, opts ...scw.RequestOption) (*ListJobDefinitionSecretsResponse, error) { var err error @@ -966,7 +984,7 @@ func (s *API) ListJobDefinitionSecrets(req *ListJobDefinitionSecretsRequest, opt return &resp, nil } -// UpdateJobDefinitionSecret: +// UpdateJobDefinitionSecret: Update a secret reference within a job definition. func (s *API) UpdateJobDefinitionSecret(req *UpdateJobDefinitionSecretRequest, opts ...scw.RequestOption) (*Secret, error) { var err error @@ -1006,7 +1024,7 @@ func (s *API) UpdateJobDefinitionSecret(req *UpdateJobDefinitionSecretRequest, o return &resp, nil } -// DeleteJobDefinitionSecret: +// DeleteJobDefinitionSecret: Delete a secret reference within a job definition. func (s *API) DeleteJobDefinitionSecret(req *DeleteJobDefinitionSecretRequest, opts ...scw.RequestOption) error { var err error From 807ee113e4545ef698584b9951f5bcfd40361c76 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 5 Nov 2024 14:34:05 +0100 Subject: [PATCH 061/163] feat(serverless): add option to scale on memory usage (#2296) --- api/container/v1beta1/container_sdk.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index 3ef8c1d29..754539610 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -792,11 +792,14 @@ type ContainerHealthCheckSpec struct { // ContainerScalingOption: container scaling option. type ContainerScalingOption struct { - // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold must be set. + // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold, MemoryUsageThreshold must be set. ConcurrentRequestsThreshold *uint32 `json:"concurrent_requests_threshold,omitempty"` - // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold must be set. + // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold, MemoryUsageThreshold must be set. CPUUsageThreshold *uint32 `json:"cpu_usage_threshold,omitempty"` + + // Precisely one of ConcurrentRequestsThreshold, CPUUsageThreshold, MemoryUsageThreshold must be set. + MemoryUsageThreshold *uint32 `json:"memory_usage_threshold,omitempty"` } // SecretHashedValue: secret hashed value. @@ -973,6 +976,7 @@ type Container struct { // ScalingOption: possible values: // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. + // - memory_usage_threshold: Scale depending on the memory usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option"` // HealthCheck: health check configuration of the container. @@ -1221,6 +1225,7 @@ type CreateContainerRequest struct { // ScalingOption: possible values: // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. + // - memory_usage_threshold: Scale depending on the memory usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` // HealthCheck: health check configuration of the container. @@ -1817,6 +1822,7 @@ type UpdateContainerRequest struct { // ScalingOption: possible values: // - concurrent_requests_threshold: Scale depending on the number of concurrent requests being processed per container instance. // - cpu_usage_threshold: Scale depending on the CPU usage of a container instance. + // - memory_usage_threshold: Scale depending on the memory usage of a container instance. ScalingOption *ContainerScalingOption `json:"scaling_option,omitempty"` // HealthCheck: health check configuration of the container. From 59f12be02260c22cb4f684bfff5783b76f7fa4bd Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 6 Nov 2024 14:09:09 +0100 Subject: [PATCH 062/163] feat: update generated APIs (#2297) --- api/container/v1beta1/container_sdk.go | 6 ++++++ api/function/v1beta1/function_sdk.go | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index 754539610..fbfd0ebc1 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -1080,6 +1080,12 @@ type Namespace struct { // Tags: [ALPHA] List of tags applied to the Serverless Container Namespace. Tags []string `json:"tags"` + + // CreatedAt: creation date of the namespace. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last update date of the namespace. + UpdatedAt *time.Time `json:"updated_at"` } // Token: token. diff --git a/api/function/v1beta1/function_sdk.go b/api/function/v1beta1/function_sdk.go index 608af8291..fecb59d6f 100644 --- a/api/function/v1beta1/function_sdk.go +++ b/api/function/v1beta1/function_sdk.go @@ -1150,6 +1150,12 @@ type Namespace struct { // Tags: [ALPHA] List of tags applied to the Serverless Function Namespace. Tags []string `json:"tags"` + + // CreatedAt: creation date of the namespace. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last update date of the namespace. + UpdatedAt *time.Time `json:"updated_at"` } // Token: token. From e84e5b2bdf25245e1957be73a0d90dcb22b03e29 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 7 Nov 2024 13:47:36 +0100 Subject: [PATCH 063/163] feat(block): add tags in ListVolumesRequest (#2299) --- api/block/v1alpha1/block_sdk.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/block/v1alpha1/block_sdk.go b/api/block/v1alpha1/block_sdk.go index 23414457d..96c38d81f 100644 --- a/api/block/v1alpha1/block_sdk.go +++ b/api/block/v1alpha1/block_sdk.go @@ -828,6 +828,9 @@ type ListVolumesRequest struct { // ProductResourceID: filter by a product resource ID linked to this volume (such as an Instance ID). ProductResourceID *string `json:"-"` + + // Tags: filter by tags. Only volumes with one or more matching tags will be returned. + Tags []string `json:"-"` } // ListVolumesResponse: list volumes response. @@ -969,6 +972,7 @@ func (s *API) ListVolumes(req *ListVolumesRequest, opts ...scw.RequestOption) (* parameter.AddToQuery(query, "page_size", req.PageSize) parameter.AddToQuery(query, "name", req.Name) parameter.AddToQuery(query, "product_resource_id", req.ProductResourceID) + parameter.AddToQuery(query, "tags", req.Tags) if fmt.Sprint(req.Zone) == "" { return nil, errors.New("field Zone cannot be empty in request") From cb65c6dbd99db5d6526041dca76a6b7abb160223 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 7 Nov 2024 15:33:23 +0100 Subject: [PATCH 064/163] fix(k8s): change node metadata path to avoid collision with nodes path (#2300) --- api/k8s/v1/k8s_sdk.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 2d0b3db9a..4f530eef6 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -627,7 +627,9 @@ const ( // Local Block Storage: your system is stored locally on your node hypervisor. Lower latency, no persistence across node replacements. PoolVolumeTypeLSSD = PoolVolumeType("l_ssd") // Remote Block Storage: your system is stored on a centralized and resilient cluster. Higher latency, persistence across node replacements. - PoolVolumeTypeBSSD = PoolVolumeType("b_ssd") + PoolVolumeTypeBSSD = PoolVolumeType("b_ssd") + PoolVolumeTypeSbs5k = PoolVolumeType("sbs_5k") + PoolVolumeTypeSbs15k = PoolVolumeType("sbs_15k") ) func (enum PoolVolumeType) String() string { @@ -643,6 +645,8 @@ func (enum PoolVolumeType) Values() []PoolVolumeType { "default_volume_type", "l_ssd", "b_ssd", + "sbs_5k", + "sbs_15k", } } @@ -2942,7 +2946,7 @@ func (s *API) GetNodeMetadata(req *GetNodeMetadataRequest, opts ...scw.RequestOp scwReq := &scw.ScalewayRequest{ Method: "GET", - Path: "/k8s/v1/regions/" + fmt.Sprint(req.Region) + "/nodes/metadata", + Path: "/k8s/v1/regions/" + fmt.Sprint(req.Region) + "/node-metadata", } var resp NodeMetadata From 5caa7a2fb42a70352628663bc5c64fa00b5e9fae Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 7 Nov 2024 15:43:56 +0100 Subject: [PATCH 065/163] chore(edge_services): add unit to cache usage doc (#2302) --- api/edge_services/v1alpha1/edge_services_sdk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index e7bc7e1d2..2edd0ba85 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -1228,10 +1228,10 @@ type GetBillingResponse struct { // ExtraPipelinesCost: cost to date (this month) of pipelines not included in the subscription plan. ExtraPipelinesCost *scw.Money `json:"extra_pipelines_cost"` - // CurrentPlanCacheUsage: total amount of data egressed from the cache (this month), included in the active subscription plan. + // CurrentPlanCacheUsage: total amount of data egressed from the cache in gigabytes from the beginning of the month, included in the active subscription plan. CurrentPlanCacheUsage uint64 `json:"current_plan_cache_usage"` - // ExtraCacheUsage: total amount of data egressed from cache (this month), not included in the active subscription plan. + // ExtraCacheUsage: total amount of extra data egressed from cache in gigabytes from the beginning of the month, not included in the active subscription plan. ExtraCacheUsage uint64 `json:"extra_cache_usage"` // ExtraCacheCost: cost to date (this month) of the data egressed from the cache that is not included in the active subscription plan. From b9a5e5706e3a4cc5255db2861a0034992cd98c57 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 8 Nov 2024 09:16:59 +0100 Subject: [PATCH 066/163] feat(k8s): add sbs_5k and sbs_15k system volumes (#2298) From a872cdf8e64f5b1f56c19f037d503d8f8b5536e6 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 8 Nov 2024 09:17:21 +0100 Subject: [PATCH 067/163] feat(ipam): add new mgdb_instance resource (#2301) Co-authored-by: Jonathan R. --- api/ipam/v1/ipam_sdk.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/ipam/v1/ipam_sdk.go b/api/ipam/v1/ipam_sdk.go index 188648f98..1436f3e9b 100644 --- a/api/ipam/v1/ipam_sdk.go +++ b/api/ipam/v1/ipam_sdk.go @@ -103,6 +103,7 @@ const ( ResourceTypeBaremetalServer = ResourceType("baremetal_server") ResourceTypeBaremetalPrivateNic = ResourceType("baremetal_private_nic") ResourceTypeLlmDeployment = ResourceType("llm_deployment") + ResourceTypeMgdbInstance = ResourceType("mgdb_instance") ) func (enum ResourceType) String() string { @@ -131,6 +132,7 @@ func (enum ResourceType) Values() []ResourceType { "baremetal_server", "baremetal_private_nic", "llm_deployment", + "mgdb_instance", } } @@ -440,7 +442,6 @@ func NewAPI(client *scw.Client) *API { client: client, } } - func (s *API) Regions() []scw.Region { return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} } From cc926be52656f4872993915ef5e8c4b8c814cfa6 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 8 Nov 2024 09:17:47 +0100 Subject: [PATCH 068/163] feat(apple_silicon): add vnc diagnostic api definition (#2303) --- api/applesilicon/v1alpha1/applesilicon_sdk.go | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/api/applesilicon/v1alpha1/applesilicon_sdk.go b/api/applesilicon/v1alpha1/applesilicon_sdk.go index 4cc6de7ee..c51ecfabe 100644 --- a/api/applesilicon/v1alpha1/applesilicon_sdk.go +++ b/api/applesilicon/v1alpha1/applesilicon_sdk.go @@ -39,6 +39,84 @@ var ( _ = namegenerator.GetRandomName ) +type ConnectivityDiagnosticActionType string + +const ( + ConnectivityDiagnosticActionTypeRebootServer = ConnectivityDiagnosticActionType("reboot_server") + ConnectivityDiagnosticActionTypeReinstallServer = ConnectivityDiagnosticActionType("reinstall_server") +) + +func (enum ConnectivityDiagnosticActionType) String() string { + if enum == "" { + // return default value if empty + return "reboot_server" + } + return string(enum) +} + +func (enum ConnectivityDiagnosticActionType) Values() []ConnectivityDiagnosticActionType { + return []ConnectivityDiagnosticActionType{ + "reboot_server", + "reinstall_server", + } +} + +func (enum ConnectivityDiagnosticActionType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ConnectivityDiagnosticActionType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ConnectivityDiagnosticActionType(ConnectivityDiagnosticActionType(tmp).String()) + return nil +} + +type ConnectivityDiagnosticDiagnosticStatus string + +const ( + ConnectivityDiagnosticDiagnosticStatusUnknownStatus = ConnectivityDiagnosticDiagnosticStatus("unknown_status") + ConnectivityDiagnosticDiagnosticStatusProcessing = ConnectivityDiagnosticDiagnosticStatus("processing") + ConnectivityDiagnosticDiagnosticStatusError = ConnectivityDiagnosticDiagnosticStatus("error") + ConnectivityDiagnosticDiagnosticStatusCompleted = ConnectivityDiagnosticDiagnosticStatus("completed") +) + +func (enum ConnectivityDiagnosticDiagnosticStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum ConnectivityDiagnosticDiagnosticStatus) Values() []ConnectivityDiagnosticDiagnosticStatus { + return []ConnectivityDiagnosticDiagnosticStatus{ + "unknown_status", + "processing", + "error", + "completed", + } +} + +func (enum ConnectivityDiagnosticDiagnosticStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ConnectivityDiagnosticDiagnosticStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ConnectivityDiagnosticDiagnosticStatus(ConnectivityDiagnosticDiagnosticStatus(tmp).String()) + return nil +} + type ListServersRequestOrderBy string const ( @@ -233,6 +311,21 @@ type ServerTypeNetwork struct { PublicBandwidthBps uint64 `json:"public_bandwidth_bps"` } +// ConnectivityDiagnosticServerHealth: connectivity diagnostic server health. +type ConnectivityDiagnosticServerHealth struct { + LastCheckinDate *time.Time `json:"last_checkin_date"` + + IsServerAlive bool `json:"is_server_alive"` + + IsAgentAlive bool `json:"is_agent_alive"` + + IsMdmAlive bool `json:"is_mdm_alive"` + + IsSSHPortUp bool `json:"is_ssh_port_up"` + + IsVncPortUp bool `json:"is_vnc_port_up"` +} + // ServerType: server type. type ServerType struct { // CPU: CPU description. @@ -322,6 +415,22 @@ type Server struct { Delivered bool `json:"delivered"` } +// ConnectivityDiagnostic: connectivity diagnostic. +type ConnectivityDiagnostic struct { + ID string `json:"id"` + + // Status: default value: unknown_status + Status ConnectivityDiagnosticDiagnosticStatus `json:"status"` + + IsHealthy bool `json:"is_healthy"` + + HealthDetails *ConnectivityDiagnosticServerHealth `json:"health_details"` + + SupportedActions []ConnectivityDiagnosticActionType `json:"supported_actions"` + + ErrorMessage string `json:"error_message"` +} + // CreateServerRequest: create server request. type CreateServerRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -349,6 +458,14 @@ type DeleteServerRequest struct { ServerID string `json:"-"` } +// GetConnectivityDiagnosticRequest: get connectivity diagnostic request. +type GetConnectivityDiagnosticRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + DiagnosticID string `json:"-"` +} + // GetOSRequest: get os request. type GetOSRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -505,6 +622,19 @@ type ReinstallServerRequest struct { OsID *string `json:"os_id,omitempty"` } +// StartConnectivityDiagnosticRequest: start connectivity diagnostic request. +type StartConnectivityDiagnosticRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + ServerID string `json:"server_id"` +} + +// StartConnectivityDiagnosticResponse: start connectivity diagnostic response. +type StartConnectivityDiagnosticResponse struct { + DiagnosticID string `json:"diagnostic_id"` +} + // UpdateServerRequest: update server request. type UpdateServerRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -911,3 +1041,66 @@ func (s *API) ReinstallServer(req *ReinstallServerRequest, opts ...scw.RequestOp } return &resp, nil } + +// StartConnectivityDiagnostic: +func (s *API) StartConnectivityDiagnostic(req *StartConnectivityDiagnosticRequest, opts ...scw.RequestOption) (*StartConnectivityDiagnosticResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/connectivity-diagnostics", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp StartConnectivityDiagnosticResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetConnectivityDiagnostic: +func (s *API) GetConnectivityDiagnostic(req *GetConnectivityDiagnosticRequest, opts ...scw.RequestOption) (*ConnectivityDiagnostic, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.DiagnosticID) == "" { + return nil, errors.New("field DiagnosticID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/connectivity-diagnostics/" + fmt.Sprint(req.DiagnosticID) + "", + } + + var resp ConnectivityDiagnostic + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From 731b10b69dcbdf33cd01079667c38ef585affa5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:18:05 +0100 Subject: [PATCH 069/163] chore(deps): bump golang.org/x/text from 0.19.0 to 0.20.0 (#2304) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index cdb9a1f34..a6c2e72a5 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,6 @@ go 1.17 require ( github.com/dnaeon/go-vcr v1.2.0 - golang.org/x/text v0.19.0 + golang.org/x/text v0.20.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index a295c9d77..8a741aeb8 100644 --- a/go.sum +++ b/go.sum @@ -27,7 +27,7 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -54,8 +54,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= From 89ba93198ec41e6a02c473e90c62bc0427efb658 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 13 Nov 2024 18:01:35 +0100 Subject: [PATCH 070/163] feat(iam): add send_welcome_email in CreateUser (#2305) --- api/iam/v1alpha1/iam_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index d189311a5..a08448edf 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -840,6 +840,9 @@ type CreateUserRequestMember struct { // SendPasswordEmail: whether or not to send an email containing the member's password. SendPasswordEmail bool `json:"send_password_email"` + // SendWelcomeEmail: whether or not to send a welcome email that includes onboarding information. + SendWelcomeEmail bool `json:"send_welcome_email"` + // Username: the member's username. Username string `json:"username"` From c47c15a89f6f59b1db092b9f4b6828a55fa68c41 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 13 Nov 2024 19:14:27 +0100 Subject: [PATCH 071/163] chore(cockpit): add product datasource retention (#2306) --- api/cockpit/v1/cockpit_sdk.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/api/cockpit/v1/cockpit_sdk.go b/api/cockpit/v1/cockpit_sdk.go index d6d51991f..5b1d1cc0c 100644 --- a/api/cockpit/v1/cockpit_sdk.go +++ b/api/cockpit/v1/cockpit_sdk.go @@ -727,14 +727,20 @@ type AlertManager struct { // GetConfigResponse: Cockpit configuration. type GetConfigResponse struct { - // MetricsRetention: metrics retention configuration. - MetricsRetention *GetConfigResponseRetention `json:"metrics_retention"` + // CustomMetricsRetention: custom metrics retention configuration. + CustomMetricsRetention *GetConfigResponseRetention `json:"custom_metrics_retention"` - // LogsRetention: logs retention configuration. - LogsRetention *GetConfigResponseRetention `json:"logs_retention"` + // CustomLogsRetention: custom logs retention configuration. + CustomLogsRetention *GetConfigResponseRetention `json:"custom_logs_retention"` - // TracesRetention: traces retention configuration. - TracesRetention *GetConfigResponseRetention `json:"traces_retention"` + // CustomTracesRetention: custom traces retention configuration. + CustomTracesRetention *GetConfigResponseRetention `json:"custom_traces_retention"` + + // ProductMetricsRetention: scaleway metrics retention configuration. + ProductMetricsRetention *GetConfigResponseRetention `json:"product_metrics_retention"` + + // ProductLogsRetention: scaleway logs retention configuration. + ProductLogsRetention *GetConfigResponseRetention `json:"product_logs_retention"` } // GlobalAPICreateGrafanaUserRequest: Create a Grafana user. From 093e6073dd33268f35a19a1a961d56e4c5f34ab4 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 18 Nov 2024 10:11:27 +0100 Subject: [PATCH 072/163] feat(webhosting): add hosting resource summary (#2307) --- api/webhosting/v1/webhosting_sdk.go | 57 ++++++++++++++++++++++- api/webhosting/v1alpha1/webhosting_sdk.go | 2 +- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index 7bc0d9878..d8d82ea57 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -14,12 +14,12 @@ import ( "strings" "time" + std "github.com/scaleway/scaleway-sdk-go/api/std" "github.com/scaleway/scaleway-sdk-go/errors" "github.com/scaleway/scaleway-sdk-go/marshaler" "github.com/scaleway/scaleway-sdk-go/namegenerator" "github.com/scaleway/scaleway-sdk-go/parameter" "github.com/scaleway/scaleway-sdk-go/scw" - std "github.com/scaleway/scaleway-sdk-go/api/std" ) // always import dependencies @@ -1073,6 +1073,15 @@ type HostingAPIGetHostingRequest struct { HostingID string `json:"-"` } +// HostingAPIGetResourceSummaryRequest: hosting api get resource summary request. +type HostingAPIGetResourceSummaryRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // HostingID: hosting ID. + HostingID string `json:"-"` +} + // HostingAPIListHostingsRequest: hosting api list hostings request. type HostingAPIListHostingsRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1465,6 +1474,21 @@ type ResetHostingPasswordResponse struct { OneTimePassword string `json:"one_time_password"` } +// ResourceSummary: resource summary. +type ResourceSummary struct { + // DatabasesCount: total number of active databases in the Web Hosting plan. + DatabasesCount uint32 `json:"databases_count"` + + // MailAccountsCount: total number of active email accounts in the Web Hosting plan. + MailAccountsCount uint32 `json:"mail_accounts_count"` + + // FtpAccountsCount: total number of active FTP accounts in the Web Hosting plan. + FtpAccountsCount uint32 `json:"ftp_accounts_count"` + + // WebsitesCount: total number of active domains in the the Web Hosting plan. + WebsitesCount uint32 `json:"websites_count"` +} + // Session: session. type Session struct { // URL: logged user's session URL. @@ -2294,6 +2318,37 @@ func (s *HostingAPI) ResetHostingPassword(req *HostingAPIResetHostingPasswordReq return &resp, nil } +// GetResourceSummary: Get the total counts of websites, databases, email accounts, and FTP accounts of a Web Hosting plan. +func (s *HostingAPI) GetResourceSummary(req *HostingAPIGetResourceSummaryRequest, opts ...scw.RequestOption) (*ResourceSummary, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.HostingID) == "" { + return nil, errors.New("field HostingID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/webhosting/v1/regions/" + fmt.Sprint(req.Region) + "/hostings/" + fmt.Sprint(req.HostingID) + "/resource-summary", + } + + var resp ResourceSummary + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // This API allows you to manage your FTP accounts for your Web Hosting services. type FtpAccountAPI struct { client *scw.Client diff --git a/api/webhosting/v1alpha1/webhosting_sdk.go b/api/webhosting/v1alpha1/webhosting_sdk.go index 1b5aa2d56..469d40c86 100644 --- a/api/webhosting/v1alpha1/webhosting_sdk.go +++ b/api/webhosting/v1alpha1/webhosting_sdk.go @@ -14,12 +14,12 @@ import ( "strings" "time" + std "github.com/scaleway/scaleway-sdk-go/api/std" "github.com/scaleway/scaleway-sdk-go/errors" "github.com/scaleway/scaleway-sdk-go/marshaler" "github.com/scaleway/scaleway-sdk-go/namegenerator" "github.com/scaleway/scaleway-sdk-go/parameter" "github.com/scaleway/scaleway-sdk-go/scw" - std "github.com/scaleway/scaleway-sdk-go/api/std" ) // always import dependencies From a5a30db7ff76859384296a0c8a2060c8d3bb10f3 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 18 Nov 2024 10:15:37 +0100 Subject: [PATCH 073/163] feat(mongodb): add DeleteEndpoint (#2308) --- api/mongodb/v1alpha1/mongodb_sdk.go | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 2920fa5e0..9a5478d5c 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -733,6 +733,15 @@ type CreateUserRequest struct { Password string `json:"password"` } +// DeleteEndpointRequest: delete endpoint request. +type DeleteEndpointRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // EndpointID: UUID of the Endpoint to delete. + EndpointID string `json:"-"` +} + // DeleteInstanceRequest: delete instance request. type DeleteInstanceRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1763,3 +1772,32 @@ func (s *API) UpdateUser(req *UpdateUserRequest, opts ...scw.RequestOption) (*Us } return &resp, nil } + +// DeleteEndpoint: Delete the endpoint of a Database Instance. You must specify the `endpoint_id` parameter of the endpoint you want to delete. Note that you might need to update any environment configurations that point to the deleted endpoint. +func (s *API) DeleteEndpoint(req *DeleteEndpointRequest, opts ...scw.RequestOption) error { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.EndpointID) == "" { + return errors.New("field EndpointID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/endpoints/" + fmt.Sprint(req.EndpointID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From 210045c18c91e3401b0cff09bebee563aa7ff914 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 18 Nov 2024 10:16:33 +0100 Subject: [PATCH 074/163] feat(block): improve arguments configuration (#2309) --- api/block/v1alpha1/block_sdk.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/block/v1alpha1/block_sdk.go b/api/block/v1alpha1/block_sdk.go index 96c38d81f..cd0e65071 100644 --- a/api/block/v1alpha1/block_sdk.go +++ b/api/block/v1alpha1/block_sdk.go @@ -1008,6 +1008,10 @@ func (s *API) CreateVolume(req *CreateVolumeRequest, opts ...scw.RequestOption) req.ProjectID = defaultProjectID } + if req.Name == "" { + req.Name = namegenerator.GetRandomName("vol") + } + if fmt.Sprint(req.Zone) == "" { return nil, errors.New("field Zone cannot be empty in request") } @@ -1216,6 +1220,10 @@ func (s *API) CreateSnapshot(req *CreateSnapshotRequest, opts ...scw.RequestOpti req.ProjectID = defaultProjectID } + if req.Name == "" { + req.Name = namegenerator.GetRandomName("snp") + } + if fmt.Sprint(req.Zone) == "" { return nil, errors.New("field Zone cannot be empty in request") } From 774e7f5c535e8852523a097f68e5551a6be016ce Mon Sep 17 00:00:00 2001 From: "Jonathan R." Date: Tue, 19 Nov 2024 10:36:43 +0100 Subject: [PATCH 075/163] chore(errors): remove toLower conversion for API error messages (#2310) --- scw/errors.go | 3 --- scw/errors_test.go | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/scw/errors.go b/scw/errors.go index 28cb1a4d5..6db574ad3 100644 --- a/scw/errors.go +++ b/scw/errors.go @@ -50,9 +50,6 @@ func (e *ResponseError) UnmarshalJSON(b []byte) error { if err != nil { return err } - - tmp.Message = strings.ToLower(tmp.Message) - *e = ResponseError(tmp) return nil } diff --git a/scw/errors_test.go b/scw/errors_test.go index 33c105ba3..ba519e352 100644 --- a/scw/errors_test.go +++ b/scw/errors_test.go @@ -149,7 +149,7 @@ func TestNonStandardError(t *testing.T) { expectedError: &ResponseError{ Status: "409 Conflict", StatusCode: http.StatusConflict, - Message: "group is in use. you cannot delete it.", + Message: "Group is in use. You cannot delete it.", Type: "conflict", RawBody: []byte(`{"message": "Group is in use. You cannot delete it.", "type": "conflict"}`), }, From baaca820cbf133e640360c092caa62c2792af762 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 19 Nov 2024 11:46:04 +0100 Subject: [PATCH 076/163] feat(mongodb): add CreateEndpoint (#2311) --- api/mongodb/v1alpha1/mongodb_sdk.go | 62 ++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 9a5478d5c..6c011eee9 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -509,6 +509,15 @@ type Setting struct { FloatMax *float32 `json:"float_max"` } +// EndpointSpec: endpoint spec. +type EndpointSpec struct { + // Precisely one of Public, PrivateNetwork must be set. + Public *EndpointSpecPublicDetails `json:"public,omitempty"` + + // Precisely one of Public, PrivateNetwork must be set. + PrivateNetwork *EndpointSpecPrivateNetworkDetails `json:"private_network,omitempty"` +} + // CreateInstanceRequestVolumeDetails: create instance request volume details. type CreateInstanceRequestVolumeDetails struct { // VolumeSize: volume size. @@ -519,15 +528,6 @@ type CreateInstanceRequestVolumeDetails struct { VolumeType VolumeType `json:"volume_type"` } -// EndpointSpec: endpoint spec. -type EndpointSpec struct { - // Precisely one of Public, PrivateNetwork must be set. - Public *EndpointSpecPublicDetails `json:"public,omitempty"` - - // Precisely one of Public, PrivateNetwork must be set. - PrivateNetwork *EndpointSpecPrivateNetworkDetails `json:"private_network,omitempty"` -} - // Instance: instance. type Instance struct { // ID: UUID of the Database Instance. @@ -667,6 +667,18 @@ type RestoreSnapshotRequestVolumeDetails struct { VolumeType VolumeType `json:"volume_type"` } +// CreateEndpointRequest: create endpoint request. +type CreateEndpointRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance. + InstanceID string `json:"instance_id"` + + // Endpoint: endpointSpec used to expose your Database Instance. + Endpoint *EndpointSpec `json:"endpoint"` +} + // CreateInstanceRequest: create instance request. type CreateInstanceRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1801,3 +1813,35 @@ func (s *API) DeleteEndpoint(req *DeleteEndpointRequest, opts ...scw.RequestOpti } return nil } + +// CreateEndpoint: Create a new endpoint for a MongoDB® Database Instance. You can add `public_network` or `private_network` specifications to the body of the request. +func (s *API) CreateEndpoint(req *CreateEndpointRequest, opts ...scw.RequestOption) (*Endpoint, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/endpoints", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Endpoint + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From 53c1e8380f71d4a5fa3eb2df93b74da485f44e28 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 19 Nov 2024 11:46:31 +0100 Subject: [PATCH 077/163] feat(iam): allow updating a Member's email (#2312) --- api/iam/v1alpha1/iam_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index a08448edf..b0626425e 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -2223,6 +2223,9 @@ type UpdateUserRequest struct { // Tags: new tags for the user (maximum of 10 tags). Tags *[]string `json:"tags,omitempty"` + + // Email: new email for the user (only available on Members). + Email *string `json:"email,omitempty"` } // This API allows you to manage Identity and Access Management (IAM) across your Scaleway Organizations, Projects and resources. From 67545eb35abca5a08a4d501f29279f650715ccbc Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 19 Nov 2024 11:46:53 +0100 Subject: [PATCH 078/163] feat(instance): set b_ssd volume type as deprecated (#2313) --- api/instance/v1/instance_sdk.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index 16dad2100..486ee5926 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -1921,11 +1921,13 @@ type Dashboard struct { VolumesLSSDCount uint32 `json:"volumes_l_ssd_count"` - VolumesBSSDCount uint32 `json:"volumes_b_ssd_count"` + // Deprecated + VolumesBSSDCount *uint32 `json:"volumes_b_ssd_count"` VolumesLSSDTotalSize scw.Size `json:"volumes_l_ssd_total_size"` - VolumesBSSDTotalSize scw.Size `json:"volumes_b_ssd_total_size"` + // Deprecated + VolumesBSSDTotalSize *scw.Size `json:"volumes_b_ssd_total_size"` PrivateNicsCount uint32 `json:"private_nics_count"` From 1db4f2148045a1f97d5fb981ffbfec7c6552c421 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 19 Nov 2024 11:47:43 +0100 Subject: [PATCH 079/163] feat(apple_silicon): add busy server status (#2314) --- api/applesilicon/v1alpha1/applesilicon_sdk.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/applesilicon/v1alpha1/applesilicon_sdk.go b/api/applesilicon/v1alpha1/applesilicon_sdk.go index c51ecfabe..0c737f3b9 100644 --- a/api/applesilicon/v1alpha1/applesilicon_sdk.go +++ b/api/applesilicon/v1alpha1/applesilicon_sdk.go @@ -167,6 +167,7 @@ const ( ServerStatusLocked = ServerStatus("locked") ServerStatusUnlocking = ServerStatus("unlocking") ServerStatusReinstalling = ServerStatus("reinstalling") + ServerStatusBusy = ServerStatus("busy") ) func (enum ServerStatus) String() string { @@ -189,6 +190,7 @@ func (enum ServerStatus) Values() []ServerStatus { "locked", "unlocking", "reinstalling", + "busy", } } From 13bda013da82d61e26fde8f56cdfe3d06aa282ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 19 Nov 2024 15:11:29 +0100 Subject: [PATCH 080/163] chore: remove vpc v1 (#2315) --- api/vpc/v1/vpc_sdk.go | 421 ---------------------------------------- sdk_compilation_test.go | 2 +- 2 files changed, 1 insertion(+), 422 deletions(-) delete mode 100644 api/vpc/v1/vpc_sdk.go diff --git a/api/vpc/v1/vpc_sdk.go b/api/vpc/v1/vpc_sdk.go deleted file mode 100644 index 77a082449..000000000 --- a/api/vpc/v1/vpc_sdk.go +++ /dev/null @@ -1,421 +0,0 @@ -// This file was automatically generated. DO NOT EDIT. -// If you have any remark or suggestion do not hesitate to open an issue. - -// Package vpc provides methods and message types of the vpc v1 API. -package vpc - -import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/marshaler" - "github.com/scaleway/scaleway-sdk-go/namegenerator" - "github.com/scaleway/scaleway-sdk-go/parameter" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -// always import dependencies -var ( - _ fmt.Stringer - _ json.Unmarshaler - _ url.URL - _ net.IP - _ http.Header - _ bytes.Reader - _ time.Time - _ = strings.Join - - _ scw.ScalewayRequest - _ marshaler.Duration - _ scw.File - _ = parameter.AddToQuery - _ = namegenerator.GetRandomName -) - -type ListPrivateNetworksRequestOrderBy string - -const ( - ListPrivateNetworksRequestOrderByCreatedAtAsc = ListPrivateNetworksRequestOrderBy("created_at_asc") - ListPrivateNetworksRequestOrderByCreatedAtDesc = ListPrivateNetworksRequestOrderBy("created_at_desc") - ListPrivateNetworksRequestOrderByNameAsc = ListPrivateNetworksRequestOrderBy("name_asc") - ListPrivateNetworksRequestOrderByNameDesc = ListPrivateNetworksRequestOrderBy("name_desc") -) - -func (enum ListPrivateNetworksRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListPrivateNetworksRequestOrderBy) Values() []ListPrivateNetworksRequestOrderBy { - return []ListPrivateNetworksRequestOrderBy{ - "created_at_asc", - "created_at_desc", - "name_asc", - "name_desc", - } -} - -func (enum ListPrivateNetworksRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListPrivateNetworksRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListPrivateNetworksRequestOrderBy(ListPrivateNetworksRequestOrderBy(tmp).String()) - return nil -} - -// PrivateNetwork: private network. -type PrivateNetwork struct { - // ID: private Network ID. - ID string `json:"id"` - - // Name: private Network name. - Name string `json:"name"` - - // OrganizationID: scaleway Organization the Private Network belongs to. - OrganizationID string `json:"organization_id"` - - // ProjectID: scaleway Project the Private Network belongs to. - ProjectID string `json:"project_id"` - - // Zone: availability Zone in which the Private Network is available. - Zone scw.Zone `json:"zone"` - - // Tags: tags of the Private Network. - Tags []string `json:"tags"` - - // CreatedAt: date the Private Network was created. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: date the Private Network was last modified. - UpdatedAt *time.Time `json:"updated_at"` - - // Subnets: private Network subnets CIDR. - Subnets []scw.IPNet `json:"subnets"` -} - -// CreatePrivateNetworkRequest: create private network request. -type CreatePrivateNetworkRequest struct { - // Zone: zone to target. If none is passed will use default zone from the config. - Zone scw.Zone `json:"-"` - - // Name: name for the Private Network. - Name string `json:"name"` - - // ProjectID: scaleway Project in which to create the Private Network. - ProjectID string `json:"project_id"` - - // Tags: tags for the Private Network. - Tags []string `json:"tags"` - - // Subnets: private Network subnets CIDR. - Subnets []scw.IPNet `json:"subnets"` -} - -// DeletePrivateNetworkRequest: delete private network request. -type DeletePrivateNetworkRequest struct { - // Zone: zone to target. If none is passed will use default zone from the config. - Zone scw.Zone `json:"-"` - - // PrivateNetworkID: private Network ID. - PrivateNetworkID string `json:"-"` -} - -// GetPrivateNetworkRequest: get private network request. -type GetPrivateNetworkRequest struct { - // Zone: zone to target. If none is passed will use default zone from the config. - Zone scw.Zone `json:"-"` - - // PrivateNetworkID: private Network ID. - PrivateNetworkID string `json:"-"` -} - -// ListPrivateNetworksRequest: list private networks request. -type ListPrivateNetworksRequest struct { - // Zone: zone to target. If none is passed will use default zone from the config. - Zone scw.Zone `json:"-"` - - // OrderBy: sort order of the returned Private Networks. - // Default value: created_at_asc - OrderBy ListPrivateNetworksRequestOrderBy `json:"-"` - - // Page: page number to return, from the paginated results. - Page *int32 `json:"-"` - - // PageSize: maximum number of Private Networks to return per page. - PageSize *uint32 `json:"-"` - - // Name: name to filter for. Only Private Networks with names containing this string will be returned. - Name *string `json:"-"` - - // Tags: tags to filter for. Only Private Networks with one or more matching tags will be returned. - Tags []string `json:"-"` - - // OrganizationID: organization ID to filter for. Only Private Networks belonging to this Organization will be returned. - OrganizationID *string `json:"-"` - - // ProjectID: project ID to filter for. Only Private Networks belonging to this Project will be returned. - ProjectID *string `json:"-"` - - // PrivateNetworkIDs: private Network IDs to filter for. Only Private Networks with one of these IDs will be returned. - PrivateNetworkIDs []string `json:"-"` - - // IncludeRegional: defines whether to include regional Private Networks in the response. - IncludeRegional *bool `json:"-"` -} - -// ListPrivateNetworksResponse: list private networks response. -type ListPrivateNetworksResponse struct { - PrivateNetworks []*PrivateNetwork `json:"private_networks"` - - TotalCount uint32 `json:"total_count"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListPrivateNetworksResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListPrivateNetworksResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListPrivateNetworksResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.PrivateNetworks = append(r.PrivateNetworks, results.PrivateNetworks...) - r.TotalCount += uint32(len(results.PrivateNetworks)) - return uint32(len(results.PrivateNetworks)), nil -} - -// UpdatePrivateNetworkRequest: update private network request. -type UpdatePrivateNetworkRequest struct { - // Zone: zone to target. If none is passed will use default zone from the config. - Zone scw.Zone `json:"-"` - - // PrivateNetworkID: private Network ID. - PrivateNetworkID string `json:"-"` - - // Name: name of the private network. - Name *string `json:"name,omitempty"` - - // Tags: tags for the Private Network. - Tags *[]string `json:"tags,omitempty"` - - // Deprecated: Subnets: private Network subnets CIDR (deprecated). - Subnets *[]string `json:"subnets,omitempty"` -} - -// This API allows you to manage your Virtual Private Clouds (VPCs) and Private Networks. -type API struct { - client *scw.Client -} - -// NewAPI returns a API object from a Scaleway client. -func NewAPI(client *scw.Client) *API { - return &API{ - client: client, - } -} -func (s *API) Zones() []scw.Zone { - return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar2, scw.ZoneFrPar3, scw.ZoneNlAms1, scw.ZoneNlAms2, scw.ZoneNlAms3, scw.ZonePlWaw1, scw.ZonePlWaw2} -} - -// ListPrivateNetworks: List existing Private Networks in a specified Availability Zone. By default, the Private Networks returned in the list are ordered by creation date in ascending order, though this can be modified via the order_by field. -func (s *API) ListPrivateNetworks(req *ListPrivateNetworksRequest, opts ...scw.RequestOption) (*ListPrivateNetworksResponse, error) { - var err error - - if req.Zone == "" { - defaultZone, _ := s.client.GetDefaultZone() - req.Zone = defaultZone - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "name", req.Name) - parameter.AddToQuery(query, "tags", req.Tags) - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "private_network_ids", req.PrivateNetworkIDs) - parameter.AddToQuery(query, "include_regional", req.IncludeRegional) - - if fmt.Sprint(req.Zone) == "" { - return nil, errors.New("field Zone cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/vpc/v1/zones/" + fmt.Sprint(req.Zone) + "/private-networks", - Query: query, - } - - var resp ListPrivateNetworksResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// CreatePrivateNetwork: Create a new Private Network. Once created, you can attach Scaleway resources in the same Availability Zone. -func (s *API) CreatePrivateNetwork(req *CreatePrivateNetworkRequest, opts ...scw.RequestOption) (*PrivateNetwork, error) { - var err error - - if req.Zone == "" { - defaultZone, _ := s.client.GetDefaultZone() - req.Zone = defaultZone - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if req.Name == "" { - req.Name = namegenerator.GetRandomName("pn") - } - - if fmt.Sprint(req.Zone) == "" { - return nil, errors.New("field Zone cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/vpc/v1/zones/" + fmt.Sprint(req.Zone) + "/private-networks", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp PrivateNetwork - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetPrivateNetwork: Retrieve information about an existing Private Network, specified by its Private Network ID. Its full details are returned in the response object. -func (s *API) GetPrivateNetwork(req *GetPrivateNetworkRequest, opts ...scw.RequestOption) (*PrivateNetwork, error) { - var err error - - if req.Zone == "" { - defaultZone, _ := s.client.GetDefaultZone() - req.Zone = defaultZone - } - - if fmt.Sprint(req.Zone) == "" { - return nil, errors.New("field Zone cannot be empty in request") - } - - if fmt.Sprint(req.PrivateNetworkID) == "" { - return nil, errors.New("field PrivateNetworkID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/vpc/v1/zones/" + fmt.Sprint(req.Zone) + "/private-networks/" + fmt.Sprint(req.PrivateNetworkID) + "", - } - - var resp PrivateNetwork - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// UpdatePrivateNetwork: Update parameters (such as name or tags) of an existing Private Network, specified by its Private Network ID. -func (s *API) UpdatePrivateNetwork(req *UpdatePrivateNetworkRequest, opts ...scw.RequestOption) (*PrivateNetwork, error) { - var err error - - if req.Zone == "" { - defaultZone, _ := s.client.GetDefaultZone() - req.Zone = defaultZone - } - - if fmt.Sprint(req.Zone) == "" { - return nil, errors.New("field Zone cannot be empty in request") - } - - if fmt.Sprint(req.PrivateNetworkID) == "" { - return nil, errors.New("field PrivateNetworkID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "PATCH", - Path: "/vpc/v1/zones/" + fmt.Sprint(req.Zone) + "/private-networks/" + fmt.Sprint(req.PrivateNetworkID) + "", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp PrivateNetwork - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeletePrivateNetwork: Delete an existing Private Network. Note that you must first detach all resources from the network, in order to delete it. -func (s *API) DeletePrivateNetwork(req *DeletePrivateNetworkRequest, opts ...scw.RequestOption) error { - var err error - - if req.Zone == "" { - defaultZone, _ := s.client.GetDefaultZone() - req.Zone = defaultZone - } - - if fmt.Sprint(req.Zone) == "" { - return errors.New("field Zone cannot be empty in request") - } - - if fmt.Sprint(req.PrivateNetworkID) == "" { - return errors.New("field PrivateNetworkID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/vpc/v1/zones/" + fmt.Sprint(req.Zone) + "/private-networks/" + fmt.Sprint(req.PrivateNetworkID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} diff --git a/sdk_compilation_test.go b/sdk_compilation_test.go index 8f01b8960..2c560829f 100644 --- a/sdk_compilation_test.go +++ b/sdk_compilation_test.go @@ -13,6 +13,6 @@ import ( _ "github.com/scaleway/scaleway-sdk-go/api/rdb/v1" _ "github.com/scaleway/scaleway-sdk-go/api/registry/v1" _ "github.com/scaleway/scaleway-sdk-go/api/test/v1" - _ "github.com/scaleway/scaleway-sdk-go/api/vpc/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/vpc/v2" _ "github.com/scaleway/scaleway-sdk-go/api/vpcgw/v1" ) From 3737ff8dd68f431816d83ccb92e0d90bac7b66a2 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 20 Nov 2024 15:39:34 +0100 Subject: [PATCH 081/163] fix(qaas): update tags type (#2318) --- api/qaas/v1alpha1/qaas_sdk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/qaas/v1alpha1/qaas_sdk.go b/api/qaas/v1alpha1/qaas_sdk.go index 7187ed02d..7b174d04c 100644 --- a/api/qaas/v1alpha1/qaas_sdk.go +++ b/api/qaas/v1alpha1/qaas_sdk.go @@ -1274,7 +1274,7 @@ type ListJobsRequest struct { ProjectID *string `json:"project_id,omitempty"` // Tags: list jobs with these tags. - Tags *[]string `json:"-"` + Tags []string `json:"-"` // Page: page number. Page *int32 `json:"-"` @@ -1511,7 +1511,7 @@ type ListSessionsRequest struct { PlatformID *string `json:"-"` // Tags: list sessions with these tags. - Tags *[]string `json:"-"` + Tags []string `json:"-"` // Page: page number. Page *int32 `json:"-"` From ef0162ba1b5051450467336a352862e551f0a0c9 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 20 Nov 2024 15:41:47 +0100 Subject: [PATCH 082/163] doc(instance): change documentation about the backup action and the migration of b_ssd resources (#2319) --- api/instance/v1/instance_sdk.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index 486ee5926..7bd83e43e 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -2076,15 +2076,15 @@ type ApplyBlockMigrationRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. Zone scw.Zone `json:"-"` - // VolumeID: the volume to migrate, along with potentially other resources, according to the migration plan generated with a call to the "Plan a migration" endpoint. + // VolumeID: the volume to migrate, along with potentially other resources, according to the migration plan generated with a call to the [Get a volume or snapshot's migration plan](#path-volumes-get-a-volume-or-snapshots-migration-plan) endpoint. // Precisely one of VolumeID, SnapshotID must be set. VolumeID *string `json:"volume_id,omitempty"` - // SnapshotID: the snapshot to migrate, along with potentially other resources, according to the migration plan generated with a call to the "Plan a migration" endpoint. + // SnapshotID: the snapshot to migrate, along with potentially other resources, according to the migration plan generated with a call to the [Get a volume or snapshot's migration plan](#path-volumes-get-a-volume-or-snapshots-migration-plan) endpoint. // Precisely one of VolumeID, SnapshotID must be set. SnapshotID *string `json:"snapshot_id,omitempty"` - // ValidationKey: a value to be retrieved from a call to the "Plan a migration" endpoint, to confirm that the volume and/or snapshots specified in said plan should be migrated. + // ValidationKey: a value to be retrieved from a call to the [Get a volume or snapshot's migration plan](#path-volumes-get-a-volume-or-snapshots-migration-plan) endpoint, to confirm that the volume and/or snapshots specified in said plan should be migrated. ValidationKey string `json:"validation_key,omitempty"` } @@ -3420,7 +3420,7 @@ type MigrationPlan struct { // Snapshots: a list of snapshots which will be migrated to SBS together and with the volume, if present. Snapshots []*Snapshot `json:"snapshots"` - // ValidationKey: a value to be passed to the call to the "Apply a migration plan" endpoint, to confirm that the execution of the plan is being requested. + // ValidationKey: a value to be passed to the call to the [Migrate a volume and/or snapshots to SBS](#path-volumes-migrate-a-volume-andor-snapshots-to-sbs-scaleway-block-storage) endpoint, to confirm that the execution of the plan is being requested. ValidationKey string `json:"validation_key"` } @@ -4500,8 +4500,12 @@ func (s *API) ListServerActions(req *ListServerActionsRequest, opts ...scw.Reque // * `terminate`: Delete the Instance along with its attached volumes, except for SBS volumes. // * `enable_routed_ip`: Migrate the Instance to the new network stack. // -// Keep in mind that `terminate` an Instance will result in the deletion of `l_ssd`, `b_ssd` and `scratch` volumes types, `sbs_volume` volumes type will only be detached. +// The `terminate` action will result in the deletion of `l_ssd`, `b_ssd` and `scratch` volumes types, `sbs_volume` volumes type will only be detached. // If you want to preserve your volumes, you should detach them before the Instance deletion or `terminate` action. +// +// The `backup` action can be done with: +// * No `volumes` key in the body: an image is created with snapshots of all the server volumes, except for the `scratch` volumes types. +// * `volumes` key in the body with a dictionary as value, in this dictionary volumes UUID as keys and empty dictionaries as values : an image is created with the snapshots of the volumes in `volumes` key. `scratch` volumes types can't be shapshotted. func (s *API) ServerAction(req *ServerActionRequest, opts ...scw.RequestOption) (*ServerActionResponse, error) { var err error @@ -6572,7 +6576,11 @@ func (s *API) GetDashboard(req *GetDashboardRequest, opts ...scw.RequestOption) return &resp, nil } -// PlanBlockMigration: Given a volume or snapshot, returns the migration plan for a call to the "Apply a migration plan" endpoint. This plan will include zero or one volume, and zero or more snapshots, which will need to be migrated together. This endpoint does not perform the actual migration itself, the "Apply a migration plan" endpoint must be used. The validation_key value returned by this endpoint must be provided to the call to the "Apply a migration plan" endpoint to confirm that all resources listed in the plan should be migrated. +// PlanBlockMigration: Given a volume or snapshot, returns the migration plan but does not perform the actual migration. To perform the migration, you have to call the [Migrate a volume and/or snapshots to SBS](#path-volumes-migrate-a-volume-andor-snapshots-to-sbs-scaleway-block-storage) endpoint afterward. +// The endpoint returns the resources that should be migrated together: +// - the volume and any snapshots created from the volume, if the call was made to plan a volume migration. +// - the base volume of the snapshot (if the volume is not deleted) and its related snapshots, if the call was made to plan a snapshot migration. +// The endpoint also returns the validation_key, which must be provided to the [Migrate a volume and/or snapshots to SBS](#path-volumes-migrate-a-volume-andor-snapshots-to-sbs-scaleway-block-storage) endpoint to confirm that all resources listed in the plan should be migrated. func (s *API) PlanBlockMigration(req *PlanBlockMigrationRequest, opts ...scw.RequestOption) (*MigrationPlan, error) { var err error @@ -6604,7 +6612,7 @@ func (s *API) PlanBlockMigration(req *PlanBlockMigrationRequest, opts ...scw.Req return &resp, nil } -// ApplyBlockMigration: To be used, the call to this endpoint must be preceded by a call to the "Plan a migration" endpoint. To migrate all resources mentioned in the migration plan, the validation_key returned in the plan must be provided. +// ApplyBlockMigration: To be used, the call to this endpoint must be preceded by a call to the [Get a volume or snapshot's migration plan](#path-volumes-get-a-volume-or-snapshots-migration-plan) endpoint. To migrate all resources mentioned in the migration plan, the validation_key returned in the plan must be provided. func (s *API) ApplyBlockMigration(req *ApplyBlockMigrationRequest, opts ...scw.RequestOption) error { var err error From 7146d32fbf3ff1ec490afff61e6b042664c78b15 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 20 Nov 2024 15:42:18 +0100 Subject: [PATCH 083/163] feat(iam): add list user grace periods method (#2320) --- api/iam/v1alpha1/iam_sdk.go | 91 +++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index b0626425e..26e2f09e9 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -81,6 +81,48 @@ func (enum *BearerType) UnmarshalJSON(data []byte) error { return nil } +type GracePeriodType string + +const ( + // Unknown grace period type. + GracePeriodTypeUnknownGracePeriodType = GracePeriodType("unknown_grace_period_type") + // Password should be updated. + GracePeriodTypeUpdatePassword = GracePeriodType("update_password") + // MFA should be configured. + GracePeriodTypeSetMfa = GracePeriodType("set_mfa") +) + +func (enum GracePeriodType) String() string { + if enum == "" { + // return default value if empty + return "unknown_grace_period_type" + } + return string(enum) +} + +func (enum GracePeriodType) Values() []GracePeriodType { + return []GracePeriodType{ + "unknown_grace_period_type", + "update_password", + "set_mfa", + } +} + +func (enum GracePeriodType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *GracePeriodType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = GracePeriodType(GracePeriodType(tmp).String()) + return nil +} + type ListAPIKeysRequestOrderBy string const ( @@ -930,6 +972,19 @@ type Application struct { Tags []string `json:"tags"` } +// GracePeriod: grace period. +type GracePeriod struct { + // Type: type of grace period. + // Default value: unknown_grace_period_type + Type GracePeriodType `json:"type"` + + // CreatedAt: date and time the grace period was created. + CreatedAt *time.Time `json:"created_at"` + + // ExpiresAt: date and time the grace period expires. + ExpiresAt *time.Time `json:"expires_at"` +} + // Group: group. type Group struct { // ID: ID of the group. @@ -1602,6 +1657,18 @@ func (r *ListApplicationsResponse) UnsafeAppend(res interface{}) (uint32, error) return uint32(len(results.Applications)), nil } +// ListGracePeriodsRequest: list grace periods request. +type ListGracePeriodsRequest struct { + // UserID: ID of the user to list grace periods for. + UserID *string `json:"-"` +} + +// ListGracePeriodsResponse: list grace periods response. +type ListGracePeriodsResponse struct { + // GracePeriods: list of grace periods. + GracePeriods []*GracePeriod `json:"grace_periods"` +} + // ListGroupsRequest: list groups request. type ListGroupsRequest struct { // OrderBy: sort order of groups. @@ -2074,6 +2141,7 @@ func (r *ListUsersResponse) UnsafeAppend(res interface{}) (uint32, error) { // LockUserRequest: lock user request. type LockUserRequest struct { + // UserID: ID of the user to lock. UserID string `json:"-"` } @@ -2117,6 +2185,7 @@ type SetRulesResponse struct { // UnlockUserRequest: unlock user request. type UnlockUserRequest struct { + // UserID: ID of the user to unlock. UserID string `json:"-"` } @@ -2585,6 +2654,28 @@ func (s *API) UnlockUser(req *UnlockUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } +// ListGracePeriods: List the grace periods of a user. +func (s *API) ListGracePeriods(req *ListGracePeriodsRequest, opts ...scw.RequestOption) (*ListGracePeriodsResponse, error) { + var err error + + query := url.Values{} + parameter.AddToQuery(query, "user_id", req.UserID) + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/iam/v1alpha1/grace-periods", + Query: query, + } + + var resp ListGracePeriodsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // ListApplications: List the applications of an Organization. By default, the applications listed are ordered by creation date in ascending order. This can be modified via the `order_by` field. You must define the `organization_id` in the query path of your request. You can also define additional parameters for your query such as `application_ids`. func (s *API) ListApplications(req *ListApplicationsRequest, opts ...scw.RequestOption) (*ListApplicationsResponse, error) { var err error From edea130e856d57846e408bc7d6d37d14e5e7af40 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 20 Nov 2024 15:42:32 +0100 Subject: [PATCH 084/163] chore(cockpit): add regional get cockpit metrics (#2321) --- api/cockpit/v1/cockpit_sdk.go | 52 +++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/api/cockpit/v1/cockpit_sdk.go b/api/cockpit/v1/cockpit_sdk.go index 5b1d1cc0c..363412a75 100644 --- a/api/cockpit/v1/cockpit_sdk.go +++ b/api/cockpit/v1/cockpit_sdk.go @@ -46,8 +46,8 @@ const ( DataSourceOriginUnknownOrigin = DataSourceOrigin("unknown_origin") // Data source managed by Scaleway, used to store and query metrics and logs from Scaleway resources. DataSourceOriginScaleway = DataSourceOrigin("scaleway") - // Data source created by the user, used to store and query metrics, logs and traces from user's external resources. - DataSourceOriginExternal = DataSourceOrigin("external") + // Data source created by the user, used to store and query metrics, logs and traces from user's custom resources. + DataSourceOriginCustom = DataSourceOrigin("custom") ) func (enum DataSourceOrigin) String() string { @@ -62,7 +62,7 @@ func (enum DataSourceOrigin) Values() []DataSourceOrigin { return []DataSourceOrigin{ "unknown_origin", "scaleway", - "external", + "custom", } } @@ -725,6 +725,11 @@ type AlertManager struct { Region scw.Region `json:"region"` } +// CockpitMetrics: cockpit metrics. +type CockpitMetrics struct { + Timeseries []*scw.TimeSeries `json:"timeseries"` +} + // GetConfigResponse: Cockpit configuration. type GetConfigResponse struct { // CustomMetricsRetention: custom metrics retention configuration. @@ -1185,6 +1190,17 @@ type RegionalAPIGetAlertManagerRequest struct { ProjectID string `json:"project_id"` } +// RegionalAPIGetCockpitMetricsRequest: regional api get cockpit metrics request. +type RegionalAPIGetCockpitMetricsRequest struct { + ProjectID string `json:"-"` + + StartDate *time.Time `json:"-"` + + EndDate *time.Time `json:"-"` + + Query string `json:"-"` +} + // RegionalAPIGetConfigRequest: Get Cockpit configuration. type RegionalAPIGetConfigRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -2471,3 +2487,33 @@ func (s *RegionalAPI) TriggerTestAlert(req *RegionalAPITriggerTestAlertRequest, } return nil } + +// GetCockpitMetrics: +func (s *RegionalAPI) GetCockpitMetrics(req *RegionalAPIGetCockpitMetricsRequest, opts ...scw.RequestOption) (*CockpitMetrics, error) { + var err error + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + query := url.Values{} + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "start_date", req.StartDate) + parameter.AddToQuery(query, "end_date", req.EndDate) + parameter.AddToQuery(query, "query", req.Query) + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/cockpit/v1beta1/cockpit/metrics", + Query: query, + } + + var resp CockpitMetrics + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From 6ef67510324799a17ddf86f90c0297c84c38ae5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Fri, 22 Nov 2024 09:41:52 +0100 Subject: [PATCH 085/163] chore: remove cockpit/v1beta1 (#2323) --- api/cockpit/v1beta1/cockpit_sdk.go | 1735 -------------------------- api/cockpit/v1beta1/cockpit_utils.go | 62 - 2 files changed, 1797 deletions(-) delete mode 100644 api/cockpit/v1beta1/cockpit_sdk.go delete mode 100644 api/cockpit/v1beta1/cockpit_utils.go diff --git a/api/cockpit/v1beta1/cockpit_sdk.go b/api/cockpit/v1beta1/cockpit_sdk.go deleted file mode 100644 index cac9113eb..000000000 --- a/api/cockpit/v1beta1/cockpit_sdk.go +++ /dev/null @@ -1,1735 +0,0 @@ -// This file was automatically generated. DO NOT EDIT. -// If you have any remark or suggestion do not hesitate to open an issue. - -// Package cockpit provides methods and message types of the cockpit v1beta1 API. -package cockpit - -import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/marshaler" - "github.com/scaleway/scaleway-sdk-go/namegenerator" - "github.com/scaleway/scaleway-sdk-go/parameter" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -// always import dependencies -var ( - _ fmt.Stringer - _ json.Unmarshaler - _ url.URL - _ net.IP - _ http.Header - _ bytes.Reader - _ time.Time - _ = strings.Join - - _ scw.ScalewayRequest - _ marshaler.Duration - _ scw.File - _ = parameter.AddToQuery - _ = namegenerator.GetRandomName -) - -type CockpitStatus string - -const ( - CockpitStatusUnknownStatus = CockpitStatus("unknown_status") - CockpitStatusCreating = CockpitStatus("creating") - CockpitStatusReady = CockpitStatus("ready") - CockpitStatusDeleting = CockpitStatus("deleting") - CockpitStatusUpdating = CockpitStatus("updating") - CockpitStatusError = CockpitStatus("error") -) - -func (enum CockpitStatus) String() string { - if enum == "" { - // return default value if empty - return "unknown_status" - } - return string(enum) -} - -func (enum CockpitStatus) Values() []CockpitStatus { - return []CockpitStatus{ - "unknown_status", - "creating", - "ready", - "deleting", - "updating", - "error", - } -} - -func (enum CockpitStatus) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *CockpitStatus) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = CockpitStatus(CockpitStatus(tmp).String()) - return nil -} - -type DatasourceType string - -const ( - DatasourceTypeUnknownDatasourceType = DatasourceType("unknown_datasource_type") - DatasourceTypeMetrics = DatasourceType("metrics") - DatasourceTypeLogs = DatasourceType("logs") - DatasourceTypeTraces = DatasourceType("traces") - DatasourceTypeAlerts = DatasourceType("alerts") -) - -func (enum DatasourceType) String() string { - if enum == "" { - // return default value if empty - return "unknown_datasource_type" - } - return string(enum) -} - -func (enum DatasourceType) Values() []DatasourceType { - return []DatasourceType{ - "unknown_datasource_type", - "metrics", - "logs", - "traces", - "alerts", - } -} - -func (enum DatasourceType) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *DatasourceType) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = DatasourceType(DatasourceType(tmp).String()) - return nil -} - -type GrafanaUserRole string - -const ( - GrafanaUserRoleUnknownRole = GrafanaUserRole("unknown_role") - GrafanaUserRoleEditor = GrafanaUserRole("editor") - GrafanaUserRoleViewer = GrafanaUserRole("viewer") -) - -func (enum GrafanaUserRole) String() string { - if enum == "" { - // return default value if empty - return "unknown_role" - } - return string(enum) -} - -func (enum GrafanaUserRole) Values() []GrafanaUserRole { - return []GrafanaUserRole{ - "unknown_role", - "editor", - "viewer", - } -} - -func (enum GrafanaUserRole) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *GrafanaUserRole) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = GrafanaUserRole(GrafanaUserRole(tmp).String()) - return nil -} - -type ListDatasourcesRequestOrderBy string - -const ( - ListDatasourcesRequestOrderByCreatedAtAsc = ListDatasourcesRequestOrderBy("created_at_asc") - ListDatasourcesRequestOrderByCreatedAtDesc = ListDatasourcesRequestOrderBy("created_at_desc") - ListDatasourcesRequestOrderByNameAsc = ListDatasourcesRequestOrderBy("name_asc") - ListDatasourcesRequestOrderByNameDesc = ListDatasourcesRequestOrderBy("name_desc") -) - -func (enum ListDatasourcesRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListDatasourcesRequestOrderBy) Values() []ListDatasourcesRequestOrderBy { - return []ListDatasourcesRequestOrderBy{ - "created_at_asc", - "created_at_desc", - "name_asc", - "name_desc", - } -} - -func (enum ListDatasourcesRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListDatasourcesRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListDatasourcesRequestOrderBy(ListDatasourcesRequestOrderBy(tmp).String()) - return nil -} - -type ListGrafanaUsersRequestOrderBy string - -const ( - ListGrafanaUsersRequestOrderByLoginAsc = ListGrafanaUsersRequestOrderBy("login_asc") - ListGrafanaUsersRequestOrderByLoginDesc = ListGrafanaUsersRequestOrderBy("login_desc") -) - -func (enum ListGrafanaUsersRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "login_asc" - } - return string(enum) -} - -func (enum ListGrafanaUsersRequestOrderBy) Values() []ListGrafanaUsersRequestOrderBy { - return []ListGrafanaUsersRequestOrderBy{ - "login_asc", - "login_desc", - } -} - -func (enum ListGrafanaUsersRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListGrafanaUsersRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListGrafanaUsersRequestOrderBy(ListGrafanaUsersRequestOrderBy(tmp).String()) - return nil -} - -type ListPlansRequestOrderBy string - -const ( - ListPlansRequestOrderByNameAsc = ListPlansRequestOrderBy("name_asc") - ListPlansRequestOrderByNameDesc = ListPlansRequestOrderBy("name_desc") -) - -func (enum ListPlansRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "name_asc" - } - return string(enum) -} - -func (enum ListPlansRequestOrderBy) Values() []ListPlansRequestOrderBy { - return []ListPlansRequestOrderBy{ - "name_asc", - "name_desc", - } -} - -func (enum ListPlansRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListPlansRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListPlansRequestOrderBy(ListPlansRequestOrderBy(tmp).String()) - return nil -} - -type ListTokensRequestOrderBy string - -const ( - ListTokensRequestOrderByCreatedAtAsc = ListTokensRequestOrderBy("created_at_asc") - ListTokensRequestOrderByCreatedAtDesc = ListTokensRequestOrderBy("created_at_desc") - ListTokensRequestOrderByNameAsc = ListTokensRequestOrderBy("name_asc") - ListTokensRequestOrderByNameDesc = ListTokensRequestOrderBy("name_desc") -) - -func (enum ListTokensRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListTokensRequestOrderBy) Values() []ListTokensRequestOrderBy { - return []ListTokensRequestOrderBy{ - "created_at_asc", - "created_at_desc", - "name_asc", - "name_desc", - } -} - -func (enum ListTokensRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListTokensRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListTokensRequestOrderBy(ListTokensRequestOrderBy(tmp).String()) - return nil -} - -type PlanName string - -const ( - PlanNameUnknownName = PlanName("unknown_name") - // The free plan is the default plan. - PlanNameFree = PlanName("free") - // The premium plan with a longer retention. - PlanNamePremium = PlanName("premium") - // The custom plan. - PlanNameCustom = PlanName("custom") -) - -func (enum PlanName) String() string { - if enum == "" { - // return default value if empty - return "unknown_name" - } - return string(enum) -} - -func (enum PlanName) Values() []PlanName { - return []PlanName{ - "unknown_name", - "free", - "premium", - "custom", - } -} - -func (enum PlanName) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *PlanName) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = PlanName(PlanName(tmp).String()) - return nil -} - -// ContactPointEmail: contact point email. -type ContactPointEmail struct { - To string `json:"to"` -} - -// TokenScopes: token scopes. -type TokenScopes struct { - // QueryMetrics: permission to fetch metrics. - QueryMetrics bool `json:"query_metrics"` - - // WriteMetrics: permission to write metrics. - WriteMetrics bool `json:"write_metrics"` - - // SetupMetricsRules: permission to setup metrics rules. - SetupMetricsRules bool `json:"setup_metrics_rules"` - - // QueryLogs: permission to fetch logs. - QueryLogs bool `json:"query_logs"` - - // WriteLogs: permission to write logs. - WriteLogs bool `json:"write_logs"` - - // SetupLogsRules: permission to set up logs rules. - SetupLogsRules bool `json:"setup_logs_rules"` - - // SetupAlerts: permission to set up alerts. - SetupAlerts bool `json:"setup_alerts"` - - // QueryTraces: permission to fetch traces. - QueryTraces bool `json:"query_traces"` - - // WriteTraces: permission to write traces. - WriteTraces bool `json:"write_traces"` -} - -// CockpitEndpoints: cockpit endpoints. -type CockpitEndpoints struct { - // MetricsURL: URL for metrics. - MetricsURL string `json:"metrics_url"` - - // LogsURL: URL for logs. - LogsURL string `json:"logs_url"` - - // TracesURL: URL for traces. - TracesURL string `json:"traces_url"` - - // AlertmanagerURL: URL for the alert manager. - AlertmanagerURL string `json:"alertmanager_url"` - - // GrafanaURL: URL for the Grafana dashboard. - GrafanaURL string `json:"grafana_url"` -} - -// Plan: Pricing plan. -type Plan struct { - // ID: ID of a given pricing plan. - ID string `json:"id"` - - // Name: name of a given pricing plan. - // Default value: unknown_name - Name PlanName `json:"name"` - - // RetentionMetricsInterval: interval of time during which Scaleway's Cockpit keeps your metrics. - RetentionMetricsInterval *scw.Duration `json:"retention_metrics_interval"` - - // RetentionLogsInterval: interval of time during which Scaleway's Cockpit keeps your logs. - RetentionLogsInterval *scw.Duration `json:"retention_logs_interval"` - - // RetentionTracesInterval: interval of time during which Scaleway's Cockpit keeps your traces. - RetentionTracesInterval *scw.Duration `json:"retention_traces_interval"` - - // SampleIngestionPrice: ingestion price in cents for 1 million samples. - SampleIngestionPrice uint32 `json:"sample_ingestion_price"` - - // LogsIngestionPrice: ingestion price in cents for 1 GB of logs. - LogsIngestionPrice uint32 `json:"logs_ingestion_price"` - - // TracesIngestionPrice: ingestion price in cents for 1 GB of traces. - TracesIngestionPrice uint32 `json:"traces_ingestion_price"` - - // RetentionPrice: retention price in euros per month. - RetentionPrice uint32 `json:"retention_price"` -} - -// ContactPoint: Contact point. -type ContactPoint struct { - // Email: contact point configuration. - // Precisely one of Email must be set. - Email *ContactPointEmail `json:"email,omitempty"` -} - -// Datasource: Data source. -type Datasource struct { - // ID: ID of the data source. - ID string `json:"id"` - - // ProjectID: ID of the Project the Cockpit belongs to. - ProjectID string `json:"project_id"` - - // Name: data source name. - Name string `json:"name"` - - // URL: data source URL. - URL string `json:"url"` - - // Type: data source type. - // Default value: unknown_datasource_type - Type DatasourceType `json:"type"` - - // IsManagedByScaleway: specifies that the data source receives data from Scaleway products and is managed by Scaleway. - IsManagedByScaleway bool `json:"is_managed_by_scaleway"` -} - -// GrafanaProductDashboard: Grafana dashboard. -type GrafanaProductDashboard struct { - // DashboardName: name of the dashboard. - DashboardName string `json:"dashboard_name"` - - // Title: title of the dashboard. - Title string `json:"title"` - - // URL: URL of the dashboard. - URL string `json:"url"` - - // Tags: tags of the dashboard. - Tags []string `json:"tags"` - - // Variables: variables of the dashboard. - Variables []string `json:"variables"` -} - -// GrafanaUser: Grafana user. -type GrafanaUser struct { - // ID: ID of the Grafana user. - ID uint32 `json:"id"` - - // Login: username of the Grafana user. - Login string `json:"login"` - - // Role: role assigned to the Grafana user. - // Default value: unknown_role - Role GrafanaUserRole `json:"role"` - - // Password: the Grafana user's password. - Password *string `json:"password"` -} - -// Token: token. -type Token struct { - // ID: ID of the token. - ID string `json:"id"` - - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` - - // Name: name of the token. - Name string `json:"name"` - - // CreatedAt: date and time of the token's creation. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: date and time of the token's last update. - UpdatedAt *time.Time `json:"updated_at"` - - // Scopes: token's permissions. - Scopes *TokenScopes `json:"scopes"` - - // SecretKey: token's secret key. - SecretKey *string `json:"secret_key"` -} - -// ActivateCockpitRequest: activate cockpit request. -type ActivateCockpitRequest struct { - // ProjectID: ID of the Project the Cockpit belongs to. - ProjectID string `json:"project_id"` -} - -// Cockpit: Cockpit. -type Cockpit struct { - // ProjectID: ID of the Project the Cockpit belongs to. - ProjectID string `json:"project_id"` - - // CreatedAt: date and time of the Cockpit's creation. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: date and time of the Cockpit's last update. - UpdatedAt *time.Time `json:"updated_at"` - - // Endpoints: endpoints of the Cockpit. - Endpoints *CockpitEndpoints `json:"endpoints"` - - // Status: status of the Cockpit. - // Default value: unknown_status - Status CockpitStatus `json:"status"` - - // ManagedAlertsEnabled: specifies whether managed alerts are enabled or disabled. - ManagedAlertsEnabled bool `json:"managed_alerts_enabled"` - - // Plan: pricing plan information. - Plan *Plan `json:"plan"` -} - -// CockpitMetrics: Metrics for a given Cockpit. -type CockpitMetrics struct { - // Timeseries: time series array. - Timeseries []*scw.TimeSeries `json:"timeseries"` -} - -// CreateContactPointRequest: Request to create a contact point. -type CreateContactPointRequest struct { - // ProjectID: ID of the Project in which to create the contact point. - ProjectID string `json:"project_id"` - - // ContactPoint: contact point to create. - ContactPoint *ContactPoint `json:"contact_point,omitempty"` -} - -// CreateDatasourceRequest: Request to create a data source. -type CreateDatasourceRequest struct { - // ProjectID: ID of the Project the Cockpit belongs to. - ProjectID string `json:"project_id"` - - // Name: data source name. - Name string `json:"name"` - - // Type: data source type. - // Default value: unknown_datasource_type - Type DatasourceType `json:"type"` - - // IsDefault: specifies that the returned output is the default data source per type. - IsDefault bool `json:"is_default"` -} - -// CreateGrafanaUserRequest: Request to create a Grafana user. -type CreateGrafanaUserRequest struct { - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` - - // Login: username of the Grafana user. - Login string `json:"login"` - - // Role: role assigned to the Grafana user. - // Default value: unknown_role - Role GrafanaUserRole `json:"role"` -} - -// CreateTokenRequest: create token request. -type CreateTokenRequest struct { - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` - - // Name: name of the token. - Name string `json:"name"` - - // Scopes: token's permissions. - Scopes *TokenScopes `json:"scopes,omitempty"` -} - -// DeactivateCockpitRequest: deactivate cockpit request. -type DeactivateCockpitRequest struct { - // ProjectID: ID of the Project the Cockpit belongs to. - ProjectID string `json:"project_id"` -} - -// DeleteContactPointRequest: Request to delete a contact point. -type DeleteContactPointRequest struct { - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` - - // ContactPoint: contact point to delete. - ContactPoint *ContactPoint `json:"contact_point,omitempty"` -} - -// DeleteDatasourceRequest: Request to delete a data source. -type DeleteDatasourceRequest struct { - // DatasourceID: ID of the data source. - DatasourceID string `json:"-"` -} - -// DeleteGrafanaUserRequest: Request to delete a Grafana user. -type DeleteGrafanaUserRequest struct { - // GrafanaUserID: ID of the Grafana user. - GrafanaUserID uint32 `json:"-"` - - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` -} - -// DeleteTokenRequest: delete token request. -type DeleteTokenRequest struct { - // TokenID: ID of the token. - TokenID string `json:"-"` -} - -// DisableManagedAlertsRequest: Request to disable the sending of managed alerts. -type DisableManagedAlertsRequest struct { - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` -} - -// EnableManagedAlertsRequest: Request to enable the sending of managed alerts. -type EnableManagedAlertsRequest struct { - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` -} - -// GetCockpitMetricsRequest: Request to get a given Cockpit's metrics. -type GetCockpitMetricsRequest struct { - // ProjectID: ID of the Project the Cockpit belongs to. - ProjectID string `json:"-"` - - // StartDate: desired time range's start date for the metrics. - StartDate *time.Time `json:"-"` - - // EndDate: desired time range's end date for the metrics. - EndDate *time.Time `json:"-"` - - // MetricName: name of the metric requested. - MetricName *string `json:"-"` -} - -// GetCockpitRequest: get cockpit request. -type GetCockpitRequest struct { - // ProjectID: ID of the Project the Cockpit belongs to. - ProjectID string `json:"-"` -} - -// GetGrafanaProductDashboardRequest: Request to get a dashboard. -type GetGrafanaProductDashboardRequest struct { - // DashboardName: name of the dashboard. - DashboardName string `json:"-"` - - // ProjectID: ID of the Project. - ProjectID string `json:"-"` -} - -// GetTokenRequest: get token request. -type GetTokenRequest struct { - // TokenID: ID of the token. - TokenID string `json:"-"` -} - -// ListContactPointsRequest: Request to list all contact points. -type ListContactPointsRequest struct { - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: page size. - PageSize *uint32 `json:"-"` - - // ProjectID: ID of the Project from which to list the contact points. - ProjectID string `json:"-"` -} - -// ListContactPointsResponse: Response returned when listing contact points. -type ListContactPointsResponse struct { - // TotalCount: count of all contact points created. - TotalCount uint32 `json:"total_count"` - - // ContactPoints: array of contact points. - ContactPoints []*ContactPoint `json:"contact_points"` - - // HasAdditionalReceivers: specifies whether the contact point has other receivers than the default receiver. - HasAdditionalReceivers bool `json:"has_additional_receivers"` - - // HasAdditionalContactPoints: specifies whether there are unmanaged contact points. - HasAdditionalContactPoints bool `json:"has_additional_contact_points"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListContactPointsResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListContactPointsResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListContactPointsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.ContactPoints = append(r.ContactPoints, results.ContactPoints...) - r.TotalCount += uint32(len(results.ContactPoints)) - return uint32(len(results.ContactPoints)), nil -} - -// ListDatasourcesRequest: list datasources request. -type ListDatasourcesRequest struct { - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: page size. - PageSize *uint32 `json:"-"` - - // OrderBy: how the response is ordered. - // Default value: created_at_asc - OrderBy ListDatasourcesRequestOrderBy `json:"-"` - - // ProjectID: ID of the Project. - ProjectID string `json:"-"` - - // Types: filter by datasource types. - Types []DatasourceType `json:"-"` - - // IsManagedByScaleway: filter by managed datasources. - IsManagedByScaleway *bool `json:"-"` -} - -// ListDatasourcesResponse: list datasources response. -type ListDatasourcesResponse struct { - // TotalCount: count of all datasources corresponding to the request. - TotalCount uint32 `json:"total_count"` - - // Datasources: list of the datasources within the pagination. - Datasources []*Datasource `json:"datasources"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListDatasourcesResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListDatasourcesResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListDatasourcesResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Datasources = append(r.Datasources, results.Datasources...) - r.TotalCount += uint32(len(results.Datasources)) - return uint32(len(results.Datasources)), nil -} - -// ListGrafanaProductDashboardsRequest: Request to get a list of dashboards. -type ListGrafanaProductDashboardsRequest struct { - // ProjectID: ID of the Project. - ProjectID string `json:"-"` - - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: page size. - PageSize *uint32 `json:"-"` - - // Tags: tags to filter the dashboards. - Tags []string `json:"-"` -} - -// ListGrafanaProductDashboardsResponse: Response returned when getting a list of dashboards. -type ListGrafanaProductDashboardsResponse struct { - // TotalCount: count of grafana dasboards. - TotalCount uint64 `json:"total_count"` - - // Dashboards: information on grafana dashboards. - Dashboards []*GrafanaProductDashboard `json:"dashboards"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListGrafanaProductDashboardsResponse) UnsafeGetTotalCount() uint64 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListGrafanaProductDashboardsResponse) UnsafeAppend(res interface{}) (uint64, error) { - results, ok := res.(*ListGrafanaProductDashboardsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Dashboards = append(r.Dashboards, results.Dashboards...) - r.TotalCount += uint64(len(results.Dashboards)) - return uint64(len(results.Dashboards)), nil -} - -// ListGrafanaUsersRequest: Request to list all Grafana users. -type ListGrafanaUsersRequest struct { - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: page size. - PageSize *uint32 `json:"-"` - - // OrderBy: default value: login_asc - OrderBy ListGrafanaUsersRequestOrderBy `json:"-"` - - // ProjectID: ID of the Project. - ProjectID string `json:"-"` -} - -// ListGrafanaUsersResponse: Response returned when listing Grafana users. -type ListGrafanaUsersResponse struct { - // TotalCount: count of all Grafana users. - TotalCount uint32 `json:"total_count"` - - // GrafanaUsers: information on all Grafana users. - GrafanaUsers []*GrafanaUser `json:"grafana_users"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListGrafanaUsersResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListGrafanaUsersResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListGrafanaUsersResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.GrafanaUsers = append(r.GrafanaUsers, results.GrafanaUsers...) - r.TotalCount += uint32(len(results.GrafanaUsers)) - return uint32(len(results.GrafanaUsers)), nil -} - -// ListPlansRequest: Request to list all pricing plans. -type ListPlansRequest struct { - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: page size. - PageSize *uint32 `json:"-"` - - // OrderBy: default value: name_asc - OrderBy ListPlansRequestOrderBy `json:"-"` -} - -// ListPlansResponse: Response returned when listing all pricing plans. -type ListPlansResponse struct { - // TotalCount: count of all pricing plans. - TotalCount uint64 `json:"total_count"` - - // Plans: information on plans. - Plans []*Plan `json:"plans"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListPlansResponse) UnsafeGetTotalCount() uint64 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListPlansResponse) UnsafeAppend(res interface{}) (uint64, error) { - results, ok := res.(*ListPlansResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Plans = append(r.Plans, results.Plans...) - r.TotalCount += uint64(len(results.Plans)) - return uint64(len(results.Plans)), nil -} - -// ListTokensRequest: list tokens request. -type ListTokensRequest struct { - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: page size. - PageSize *uint32 `json:"-"` - - // OrderBy: how the response is ordered. - // Default value: created_at_asc - OrderBy ListTokensRequestOrderBy `json:"-"` - - // ProjectID: ID of the Project. - ProjectID string `json:"-"` -} - -// ListTokensResponse: list tokens response. -type ListTokensResponse struct { - // TotalCount: count of all tokens created. - TotalCount uint32 `json:"total_count"` - - // Tokens: list of all tokens created. - Tokens []*Token `json:"tokens"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListTokensResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListTokensResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListTokensResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Tokens = append(r.Tokens, results.Tokens...) - r.TotalCount += uint32(len(results.Tokens)) - return uint32(len(results.Tokens)), nil -} - -// ResetGrafanaUserPasswordRequest: Request to reset a Grafana user's password. -type ResetGrafanaUserPasswordRequest struct { - // GrafanaUserID: ID of the Grafana user. - GrafanaUserID uint32 `json:"-"` - - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` -} - -// SelectPlanRequest: Request to select a specific pricing plan. -type SelectPlanRequest struct { - // ProjectID: ID of the Project. - ProjectID string `json:"project_id"` - - // PlanID: ID of the pricing plan. - PlanID string `json:"plan_id"` -} - -// SelectPlanResponse: Response returned when selecting a pricing plan. -type SelectPlanResponse struct { -} - -// TriggerTestAlertRequest: trigger test alert request. -type TriggerTestAlertRequest struct { - ProjectID string `json:"project_id"` -} - -// This API allows you to manage your Scaleway Cockpit, for storing and visualizing metrics and logs. -type API struct { - client *scw.Client -} - -// NewAPI returns a API object from a Scaleway client. -func NewAPI(client *scw.Client) *API { - return &API{ - client: client, - } -} - -// ActivateCockpit: Activate the Cockpit of a given Project specified by the Project ID. -func (s *API) ActivateCockpit(req *ActivateCockpitRequest, opts ...scw.RequestOption) (*Cockpit, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/activate", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Cockpit - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetCockpit: Retrieve the Cockpit of a given Project specified by the Project ID. -func (s *API) GetCockpit(req *GetCockpitRequest, opts ...scw.RequestOption) (*Cockpit, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/cockpit", - Query: query, - } - - var resp Cockpit - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetCockpitMetrics: Retrieve metrics from your Cockpit specified by the ID of the Project the Cockpit belongs to. -func (s *API) GetCockpitMetrics(req *GetCockpitMetricsRequest, opts ...scw.RequestOption) (*CockpitMetrics, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "start_date", req.StartDate) - parameter.AddToQuery(query, "end_date", req.EndDate) - parameter.AddToQuery(query, "metric_name", req.MetricName) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/cockpit/metrics", - Query: query, - } - - var resp CockpitMetrics - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeactivateCockpit: Deactivate the Cockpit of a given Project specified by the Project ID. -func (s *API) DeactivateCockpit(req *DeactivateCockpitRequest, opts ...scw.RequestOption) (*Cockpit, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/deactivate", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Cockpit - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// CreateDatasource: Create a data source for a given Project specified by the Project ID and the data source type. -func (s *API) CreateDatasource(req *CreateDatasourceRequest, opts ...scw.RequestOption) (*Datasource, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/datasources", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Datasource - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeleteDatasource: Delete a given data source specified by the data source ID. -func (s *API) DeleteDatasource(req *DeleteDatasourceRequest, opts ...scw.RequestOption) error { - var err error - - if fmt.Sprint(req.DatasourceID) == "" { - return errors.New("field DatasourceID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/cockpit/v1beta1/datasources/" + fmt.Sprint(req.DatasourceID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// ListDatasources: Get a list of data sources for the specified Project ID. -func (s *API) ListDatasources(req *ListDatasourcesRequest, opts ...scw.RequestOption) (*ListDatasourcesResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "types", req.Types) - parameter.AddToQuery(query, "is_managed_by_scaleway", req.IsManagedByScaleway) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/datasources", - Query: query, - } - - var resp ListDatasourcesResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// CreateToken: Create a token in a given Project specified by the Project ID. -func (s *API) CreateToken(req *CreateTokenRequest, opts ...scw.RequestOption) (*Token, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if req.Name == "" { - req.Name = namegenerator.GetRandomName("token") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/tokens", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Token - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListTokens: Get a list of tokens in a given Project specified by the Project ID. -func (s *API) ListTokens(req *ListTokensRequest, opts ...scw.RequestOption) (*ListTokensResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "project_id", req.ProjectID) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/tokens", - Query: query, - } - - var resp ListTokensResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetToken: Retrieve a given token specified by the token ID. -func (s *API) GetToken(req *GetTokenRequest, opts ...scw.RequestOption) (*Token, error) { - var err error - - if fmt.Sprint(req.TokenID) == "" { - return nil, errors.New("field TokenID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/tokens/" + fmt.Sprint(req.TokenID) + "", - } - - var resp Token - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeleteToken: Delete a given token specified by the token ID. -func (s *API) DeleteToken(req *DeleteTokenRequest, opts ...scw.RequestOption) error { - var err error - - if fmt.Sprint(req.TokenID) == "" { - return errors.New("field TokenID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/cockpit/v1beta1/tokens/" + fmt.Sprint(req.TokenID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// CreateContactPoint: Create a contact point associated with the default receiver, to receive alerts. -func (s *API) CreateContactPoint(req *CreateContactPointRequest, opts ...scw.RequestOption) (*ContactPoint, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/contact-points", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp ContactPoint - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListContactPoints: Get a list of contact points created for a given Cockpit, specified by the ID of the Project the Cockpit belongs to. -func (s *API) ListContactPoints(req *ListContactPointsRequest, opts ...scw.RequestOption) (*ListContactPointsResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "project_id", req.ProjectID) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/contact-points", - Query: query, - } - - var resp ListContactPointsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeleteContactPoint: Delete a contact point associated with the default receiver. -func (s *API) DeleteContactPoint(req *DeleteContactPointRequest, opts ...scw.RequestOption) error { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/delete-contact-point", - } - - err = scwReq.SetBody(req) - if err != nil { - return err - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// EnableManagedAlerts: Enable the sending of managed alerts for a given Cockpit, specified by the ID of the Project the Cockpit belongs to. -func (s *API) EnableManagedAlerts(req *EnableManagedAlertsRequest, opts ...scw.RequestOption) error { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/enable-managed-alerts", - } - - err = scwReq.SetBody(req) - if err != nil { - return err - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// DisableManagedAlerts: Disable the sending of managed alerts for a given Cockpit, specified by the ID of the Project the Cockpit belongs to. -func (s *API) DisableManagedAlerts(req *DisableManagedAlertsRequest, opts ...scw.RequestOption) error { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/disable-managed-alerts", - } - - err = scwReq.SetBody(req) - if err != nil { - return err - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// TriggerTestAlert: Send a test alert to make sure your contact points get notified when an actual alert is triggered. -func (s *API) TriggerTestAlert(req *TriggerTestAlertRequest, opts ...scw.RequestOption) error { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/trigger-test-alert", - } - - err = scwReq.SetBody(req) - if err != nil { - return err - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// CreateGrafanaUser: Create a Grafana user for your Cockpit's Grafana. Make sure you save the automatically-generated password and the Grafana user ID. -func (s *API) CreateGrafanaUser(req *CreateGrafanaUserRequest, opts ...scw.RequestOption) (*GrafanaUser, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/grafana-users", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp GrafanaUser - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListGrafanaUsers: Get a list of all Grafana users created in your Cockpit's Grafana. -func (s *API) ListGrafanaUsers(req *ListGrafanaUsersRequest, opts ...scw.RequestOption) (*ListGrafanaUsersResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "project_id", req.ProjectID) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/grafana-users", - Query: query, - } - - var resp ListGrafanaUsersResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeleteGrafanaUser: Delete a Grafana user from your Cockpit's Grafana, specified by the ID of the Project the Cockpit belongs to, and the ID of the Grafana user. -func (s *API) DeleteGrafanaUser(req *DeleteGrafanaUserRequest, opts ...scw.RequestOption) error { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.GrafanaUserID) == "" { - return errors.New("field GrafanaUserID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/grafana-users/" + fmt.Sprint(req.GrafanaUserID) + "/delete", - } - - err = scwReq.SetBody(req) - if err != nil { - return err - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// ResetGrafanaUserPassword: Reset the password of a Grafana user, specified by the ID of the Project the Cockpit belongs to, and the ID of the Grafana user. -func (s *API) ResetGrafanaUserPassword(req *ResetGrafanaUserPasswordRequest, opts ...scw.RequestOption) (*GrafanaUser, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.GrafanaUserID) == "" { - return nil, errors.New("field GrafanaUserID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/grafana-users/" + fmt.Sprint(req.GrafanaUserID) + "/reset-password", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp GrafanaUser - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListPlans: Get a list of all pricing plans available. -func (s *API) ListPlans(req *ListPlansRequest, opts ...scw.RequestOption) (*ListPlansResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "order_by", req.OrderBy) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/plans", - Query: query, - } - - var resp ListPlansResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// SelectPlan: Select your chosen pricing plan for your Cockpit, specifying the Cockpit's Project ID and the pricing plan's ID in the request. -func (s *API) SelectPlan(req *SelectPlanRequest, opts ...scw.RequestOption) (*SelectPlanResponse, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/cockpit/v1beta1/select-plan", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SelectPlanResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListGrafanaProductDashboards: Get a list of available product dashboards. -func (s *API) ListGrafanaProductDashboards(req *ListGrafanaProductDashboardsRequest, opts ...scw.RequestOption) (*ListGrafanaProductDashboardsResponse, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "tags", req.Tags) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/grafana-product-dashboards", - Query: query, - } - - var resp ListGrafanaProductDashboardsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetGrafanaProductDashboard: Get a product dashboard specified by the dashboard ID. -func (s *API) GetGrafanaProductDashboard(req *GetGrafanaProductDashboardRequest, opts ...scw.RequestOption) (*GrafanaProductDashboard, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - - if fmt.Sprint(req.DashboardName) == "" { - return nil, errors.New("field DashboardName cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/grafana-product-dashboards/" + fmt.Sprint(req.DashboardName) + "", - Query: query, - } - - var resp GrafanaProductDashboard - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} diff --git a/api/cockpit/v1beta1/cockpit_utils.go b/api/cockpit/v1beta1/cockpit_utils.go deleted file mode 100644 index 1d338979c..000000000 --- a/api/cockpit/v1beta1/cockpit_utils.go +++ /dev/null @@ -1,62 +0,0 @@ -package cockpit - -import ( - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/internal/async" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -const ( - defaultRetryInterval = 3 * time.Second - defaultTimeout = 5 * time.Minute -) - -// WaitForCockpitRequest is used by WaitForCockpit method. -type WaitForCockpitRequest struct { - ProjectID string - Timeout *time.Duration - RetryInterval *time.Duration -} - -func (s *API) WaitForCockpit( - req *WaitForCockpitRequest, - opts ...scw.RequestOption, -) (*Cockpit, error) { - timeout := defaultTimeout - if req.Timeout != nil { - timeout = *req.Timeout - } - retryInterval := defaultRetryInterval - if req.RetryInterval != nil { - retryInterval = *req.RetryInterval - } - - transientStatus := map[CockpitStatus]struct{}{ - CockpitStatusCreating: {}, - CockpitStatusUpdating: {}, - CockpitStatusDeleting: {}, - } - - res, err := async.WaitSync(&async.WaitSyncConfig{ - Get: func() (interface{}, bool, error) { - namespace, err := s.GetCockpit(&GetCockpitRequest{ - ProjectID: req.ProjectID, - }, opts...) - if err != nil { - return nil, false, err - } - - _, isTransient := transientStatus[namespace.Status] - return namespace, !isTransient, nil - }, - Timeout: timeout, - IntervalStrategy: async.LinearIntervalStrategy(retryInterval), - }) - if err != nil { - return nil, errors.Wrap(err, "waiting for Cockpit failed") - } - - return res.(*Cockpit), nil -} From 8e8f9218ed5eb9d4ba40bacb34668e87ac74dab0 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 22 Nov 2024 09:42:24 +0100 Subject: [PATCH 086/163] revert(cockpit): set back external enum (#2322) --- api/cockpit/v1/cockpit_sdk.go | 49 +++-------------------------------- 1 file changed, 3 insertions(+), 46 deletions(-) diff --git a/api/cockpit/v1/cockpit_sdk.go b/api/cockpit/v1/cockpit_sdk.go index 363412a75..b9790fd45 100644 --- a/api/cockpit/v1/cockpit_sdk.go +++ b/api/cockpit/v1/cockpit_sdk.go @@ -47,6 +47,8 @@ const ( // Data source managed by Scaleway, used to store and query metrics and logs from Scaleway resources. DataSourceOriginScaleway = DataSourceOrigin("scaleway") // Data source created by the user, used to store and query metrics, logs and traces from user's custom resources. + DataSourceOriginExternal = DataSourceOrigin("external") + // Data source created by the user, used to store and query metrics, logs and traces from user's custom resources. DataSourceOriginCustom = DataSourceOrigin("custom") ) @@ -62,6 +64,7 @@ func (enum DataSourceOrigin) Values() []DataSourceOrigin { return []DataSourceOrigin{ "unknown_origin", "scaleway", + "external", "custom", } } @@ -725,11 +728,6 @@ type AlertManager struct { Region scw.Region `json:"region"` } -// CockpitMetrics: cockpit metrics. -type CockpitMetrics struct { - Timeseries []*scw.TimeSeries `json:"timeseries"` -} - // GetConfigResponse: Cockpit configuration. type GetConfigResponse struct { // CustomMetricsRetention: custom metrics retention configuration. @@ -1190,17 +1188,6 @@ type RegionalAPIGetAlertManagerRequest struct { ProjectID string `json:"project_id"` } -// RegionalAPIGetCockpitMetricsRequest: regional api get cockpit metrics request. -type RegionalAPIGetCockpitMetricsRequest struct { - ProjectID string `json:"-"` - - StartDate *time.Time `json:"-"` - - EndDate *time.Time `json:"-"` - - Query string `json:"-"` -} - // RegionalAPIGetConfigRequest: Get Cockpit configuration. type RegionalAPIGetConfigRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -2487,33 +2474,3 @@ func (s *RegionalAPI) TriggerTestAlert(req *RegionalAPITriggerTestAlertRequest, } return nil } - -// GetCockpitMetrics: -func (s *RegionalAPI) GetCockpitMetrics(req *RegionalAPIGetCockpitMetricsRequest, opts ...scw.RequestOption) (*CockpitMetrics, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "start_date", req.StartDate) - parameter.AddToQuery(query, "end_date", req.EndDate) - parameter.AddToQuery(query, "query", req.Query) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/cockpit/v1beta1/cockpit/metrics", - Query: query, - } - - var resp CockpitMetrics - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} From ce75e3386b4581944f18564b2bff26459d98de07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Fri, 22 Nov 2024 11:28:51 +0100 Subject: [PATCH 087/163] chore: add package imports for testing generated code (#2326) --- sdk_compilation_test.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/sdk_compilation_test.go b/sdk_compilation_test.go index 2c560829f..090415f4d 100644 --- a/sdk_compilation_test.go +++ b/sdk_compilation_test.go @@ -3,16 +3,42 @@ package scalewaysdkgo // This test file makes sure that all the auto-generated code compiles. import ( - _ "github.com/scaleway/scaleway-sdk-go/api/account/v2alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/account/v3" + _ "github.com/scaleway/scaleway-sdk-go/api/applesilicon/v1alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/baremetal/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/billing/v2alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/billing/v2beta1" + _ "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/cockpit/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1" + _ "github.com/scaleway/scaleway-sdk-go/api/dedibox/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/documentdb/v1beta1" _ "github.com/scaleway/scaleway-sdk-go/api/domain/v2beta1" + _ "github.com/scaleway/scaleway-sdk-go/api/edge_services/v1alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/flexibleip/v1alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/function/v1beta1" + _ "github.com/scaleway/scaleway-sdk-go/api/iam/v1alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/inference/v1beta1" _ "github.com/scaleway/scaleway-sdk-go/api/instance/v1" _ "github.com/scaleway/scaleway-sdk-go/api/iot/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/ipam/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/ipam/v1alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/k8s/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/key_manager/v1alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/lb/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/marketplace/v2" + _ "github.com/scaleway/scaleway-sdk-go/api/mnq/v1beta1" + _ "github.com/scaleway/scaleway-sdk-go/api/mongodb/v1alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/qaas/v1alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/rdb/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/redis/v1" _ "github.com/scaleway/scaleway-sdk-go/api/registry/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/secret/v1beta1" + _ "github.com/scaleway/scaleway-sdk-go/api/serverless_sqldb/v1alpha1" + _ "github.com/scaleway/scaleway-sdk-go/api/tem/v1alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/test/v1" _ "github.com/scaleway/scaleway-sdk-go/api/vpc/v2" _ "github.com/scaleway/scaleway-sdk-go/api/vpcgw/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/webhosting/v1" + _ "github.com/scaleway/scaleway-sdk-go/api/webhosting/v1alpha1" ) From b740f24d3412886c0982c209bbd361cc086b8d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Fri, 22 Nov 2024 14:12:23 +0100 Subject: [PATCH 088/163] chore: remove secret/v1alpha1 (#2324) --- api/secret/v1alpha1/secret_sdk.go | 1989 ----------------------------- 1 file changed, 1989 deletions(-) delete mode 100644 api/secret/v1alpha1/secret_sdk.go diff --git a/api/secret/v1alpha1/secret_sdk.go b/api/secret/v1alpha1/secret_sdk.go deleted file mode 100644 index 8591fd7ea..000000000 --- a/api/secret/v1alpha1/secret_sdk.go +++ /dev/null @@ -1,1989 +0,0 @@ -// This file was automatically generated. DO NOT EDIT. -// If you have any remark or suggestion do not hesitate to open an issue. - -// Package secret provides methods and message types of the secret v1alpha1 API. -package secret - -import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/marshaler" - "github.com/scaleway/scaleway-sdk-go/namegenerator" - "github.com/scaleway/scaleway-sdk-go/parameter" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -// always import dependencies -var ( - _ fmt.Stringer - _ json.Unmarshaler - _ url.URL - _ net.IP - _ http.Header - _ bytes.Reader - _ time.Time - _ = strings.Join - - _ scw.ScalewayRequest - _ marshaler.Duration - _ scw.File - _ = parameter.AddToQuery - _ = namegenerator.GetRandomName -) - -type EphemeralPolicyAction string - -const ( - EphemeralPolicyActionUnknownAction = EphemeralPolicyAction("unknown_action") - // The version is deleted once it expires. - EphemeralPolicyActionDelete = EphemeralPolicyAction("delete") - // The version is disabled once it expires. - EphemeralPolicyActionDisable = EphemeralPolicyAction("disable") -) - -func (enum EphemeralPolicyAction) String() string { - if enum == "" { - // return default value if empty - return "unknown_action" - } - return string(enum) -} - -func (enum EphemeralPolicyAction) Values() []EphemeralPolicyAction { - return []EphemeralPolicyAction{ - "unknown_action", - "delete", - "disable", - } -} - -func (enum EphemeralPolicyAction) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *EphemeralPolicyAction) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = EphemeralPolicyAction(EphemeralPolicyAction(tmp).String()) - return nil -} - -type ListFoldersRequestOrderBy string - -const ( - ListFoldersRequestOrderByCreatedAtAsc = ListFoldersRequestOrderBy("created_at_asc") - ListFoldersRequestOrderByCreatedAtDesc = ListFoldersRequestOrderBy("created_at_desc") - ListFoldersRequestOrderByNameAsc = ListFoldersRequestOrderBy("name_asc") - ListFoldersRequestOrderByNameDesc = ListFoldersRequestOrderBy("name_desc") -) - -func (enum ListFoldersRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListFoldersRequestOrderBy) Values() []ListFoldersRequestOrderBy { - return []ListFoldersRequestOrderBy{ - "created_at_asc", - "created_at_desc", - "name_asc", - "name_desc", - } -} - -func (enum ListFoldersRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListFoldersRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListFoldersRequestOrderBy(ListFoldersRequestOrderBy(tmp).String()) - return nil -} - -type ListSecretsRequestOrderBy string - -const ( - ListSecretsRequestOrderByNameAsc = ListSecretsRequestOrderBy("name_asc") - ListSecretsRequestOrderByNameDesc = ListSecretsRequestOrderBy("name_desc") - ListSecretsRequestOrderByCreatedAtAsc = ListSecretsRequestOrderBy("created_at_asc") - ListSecretsRequestOrderByCreatedAtDesc = ListSecretsRequestOrderBy("created_at_desc") - ListSecretsRequestOrderByUpdatedAtAsc = ListSecretsRequestOrderBy("updated_at_asc") - ListSecretsRequestOrderByUpdatedAtDesc = ListSecretsRequestOrderBy("updated_at_desc") -) - -func (enum ListSecretsRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "name_asc" - } - return string(enum) -} - -func (enum ListSecretsRequestOrderBy) Values() []ListSecretsRequestOrderBy { - return []ListSecretsRequestOrderBy{ - "name_asc", - "name_desc", - "created_at_asc", - "created_at_desc", - "updated_at_asc", - "updated_at_desc", - } -} - -func (enum ListSecretsRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListSecretsRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListSecretsRequestOrderBy(ListSecretsRequestOrderBy(tmp).String()) - return nil -} - -type Product string - -const ( - ProductUnknown = Product("unknown") - ProductEdgeServices = Product("edge_services") -) - -func (enum Product) String() string { - if enum == "" { - // return default value if empty - return "unknown" - } - return string(enum) -} - -func (enum Product) Values() []Product { - return []Product{ - "unknown", - "edge_services", - } -} - -func (enum Product) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *Product) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = Product(Product(tmp).String()) - return nil -} - -type SecretStatus string - -const ( - SecretStatusReady = SecretStatus("ready") - SecretStatusLocked = SecretStatus("locked") -) - -func (enum SecretStatus) String() string { - if enum == "" { - // return default value if empty - return "ready" - } - return string(enum) -} - -func (enum SecretStatus) Values() []SecretStatus { - return []SecretStatus{ - "ready", - "locked", - } -} - -func (enum SecretStatus) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *SecretStatus) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = SecretStatus(SecretStatus(tmp).String()) - return nil -} - -type SecretType string - -const ( - SecretTypeUnknownSecretType = SecretType("unknown_secret_type") - // Default type. - SecretTypeOpaque = SecretType("opaque") - // List of concatenated PEM blocks. They can contain certificates, private keys or any other PEM block types. - SecretTypeCertificate = SecretType("certificate") - // Flat JSON that allows you to set any number of first level key and a scalar type as a value (string, numeric, boolean). - SecretTypeKeyValue = SecretType("key_value") -) - -func (enum SecretType) String() string { - if enum == "" { - // return default value if empty - return "unknown_secret_type" - } - return string(enum) -} - -func (enum SecretType) Values() []SecretType { - return []SecretType{ - "unknown_secret_type", - "opaque", - "certificate", - "key_value", - } -} - -func (enum SecretType) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *SecretType) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = SecretType(SecretType(tmp).String()) - return nil -} - -type SecretVersionStatus string - -const ( - SecretVersionStatusUnknown = SecretVersionStatus("unknown") - SecretVersionStatusEnabled = SecretVersionStatus("enabled") - SecretVersionStatusDisabled = SecretVersionStatus("disabled") - SecretVersionStatusDestroyed = SecretVersionStatus("destroyed") -) - -func (enum SecretVersionStatus) String() string { - if enum == "" { - // return default value if empty - return "unknown" - } - return string(enum) -} - -func (enum SecretVersionStatus) Values() []SecretVersionStatus { - return []SecretVersionStatus{ - "unknown", - "enabled", - "disabled", - "destroyed", - } -} - -func (enum SecretVersionStatus) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *SecretVersionStatus) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = SecretVersionStatus(SecretVersionStatus(tmp).String()) - return nil -} - -// EphemeralProperties: ephemeral properties. -type EphemeralProperties struct { - // ExpiresAt: (Optional.) If not specified, the version does not have an expiration date. - ExpiresAt *time.Time `json:"expires_at"` - - // ExpiresOnceAccessed: (Optional.) If not specified, the version can be accessed an unlimited amount of times. - ExpiresOnceAccessed *bool `json:"expires_once_accessed"` - - // Action: see `EphemeralPolicy.Action` enum for a description of values. - // Default value: unknown_action - Action EphemeralPolicyAction `json:"action"` -} - -// EphemeralPolicy: ephemeral policy. -type EphemeralPolicy struct { - // TimeToLive: time frame, from one second and up to one year, during which the secret's versions are valid. - TimeToLive *scw.Duration `json:"time_to_live"` - - // ExpiresOnceAccessed: returns `true` if the version expires after a single user access. - ExpiresOnceAccessed *bool `json:"expires_once_accessed"` - - // Action: see the `EphemeralPolicy.Action` enum for a description of values. - // Default value: unknown_action - Action EphemeralPolicyAction `json:"action"` -} - -// PasswordGenerationParams: password generation params. -type PasswordGenerationParams struct { - // Length: length of the password to generate (between 1 and 1024). - Length uint32 `json:"length"` - - // NoLowercaseLetters: do not include lower case letters by default in the alphabet. - NoLowercaseLetters bool `json:"no_lowercase_letters"` - - // NoUppercaseLetters: do not include upper case letters by default in the alphabet. - NoUppercaseLetters bool `json:"no_uppercase_letters"` - - // NoDigits: do not include digits by default in the alphabet. - NoDigits bool `json:"no_digits"` - - // AdditionalChars: additional ascii characters to be included in the alphabet. - AdditionalChars string `json:"additional_chars"` -} - -// Folder: folder. -type Folder struct { - // ID: ID of the folder. - ID string `json:"id"` - - // ProjectID: ID of the Project containing the folder. - ProjectID string `json:"project_id"` - - // Name: name of the folder. - Name string `json:"name"` - - // Path: location of the folder in the directory structure. - Path string `json:"path"` - - // CreatedAt: date and time of the folder's creation. - CreatedAt *time.Time `json:"created_at"` - - // Region: region of the folder. - Region scw.Region `json:"region"` -} - -// SecretVersion: secret version. -type SecretVersion struct { - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. - Revision uint32 `json:"revision"` - - // SecretID: ID of the secret. - SecretID string `json:"secret_id"` - - // Status: * `unknown`: the version is in an invalid state. - // * `enabled`: the version is accessible. - // * `disabled`: the version is not accessible but can be enabled. - // * `destroyed`: the version is permanently deleted. It is not possible to recover it. - // Default value: unknown - Status SecretVersionStatus `json:"status"` - - // CreatedAt: date and time of the version's creation. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: last update of the version. - UpdatedAt *time.Time `json:"updated_at"` - - // Description: description of the version. - Description *string `json:"description"` - - // IsLatest: returns `true` if the version is the latest. - IsLatest bool `json:"is_latest"` - - // EphemeralProperties: returns the version's expiration date, whether it expires after being accessed once, and the action to perform (disable or delete) once the version expires. - EphemeralProperties *EphemeralProperties `json:"ephemeral_properties"` -} - -// Secret: secret. -type Secret struct { - // ID: ID of the secret. - ID string `json:"id"` - - // ProjectID: ID of the Project containing the secret. - ProjectID string `json:"project_id"` - - // Name: name of the secret. - Name string `json:"name"` - - // Status: * `ready`: the secret can be read, modified and deleted. - // * `locked`: no action can be performed on the secret. This status can only be applied and removed by Scaleway. - // Default value: ready - Status SecretStatus `json:"status"` - - // CreatedAt: date and time of the secret's creation. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: last update of the secret. - UpdatedAt *time.Time `json:"updated_at"` - - // Tags: list of the secret's tags. - Tags []string `json:"tags"` - - // VersionCount: number of versions for this secret. - VersionCount uint32 `json:"version_count"` - - // Description: updated description of the secret. - Description *string `json:"description"` - - // IsManaged: returns `true` for secrets that are managed by another product. - IsManaged bool `json:"is_managed"` - - // IsProtected: returns `true` for protected secrets that cannot be deleted. - IsProtected bool `json:"is_protected"` - - // Type: see `Secret.Type` enum for description of values. - // Default value: unknown_secret_type - Type SecretType `json:"type"` - - // Path: location of the secret in the directory structure. - Path string `json:"path"` - - // EphemeralPolicy: (Optional.) Policy that defines whether/when a secret's versions expire. By default, the policy is applied to all the secret's versions. - EphemeralPolicy *EphemeralPolicy `json:"ephemeral_policy"` - - // Region: region of the secret. - Region scw.Region `json:"region"` -} - -// AccessSecretVersionByNameRequest: access secret version by name request. -type AccessSecretVersionByNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretName: name of the secret. - SecretName string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` - - // ProjectID: (Optional.) If not specified, Secret Manager will look for the secret version in all Projects. - ProjectID *string `json:"project_id,omitempty"` -} - -// AccessSecretVersionRequest: access secret version request. -type AccessSecretVersionRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` -} - -// AccessSecretVersionResponse: access secret version response. -type AccessSecretVersionResponse struct { - // SecretID: ID of the secret. - SecretID string `json:"secret_id"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. - Revision uint32 `json:"revision"` - - // Data: the base64-encoded secret payload of the version. - Data []byte `json:"data"` - - // DataCrc32: this field is only available if a CRC32 was supplied during the creation of the version. - DataCrc32 *uint32 `json:"data_crc32"` -} - -// AddSecretOwnerRequest: add secret owner request. -type AddSecretOwnerRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Deprecated: ProductName: (Deprecated: use `product` field) Name of the product to add. - ProductName *string `json:"product_name,omitempty"` - - // Product: see `Product` enum for description of values. - // Default value: unknown - Product Product `json:"product"` -} - -// CreateFolderRequest: create folder request. -type CreateFolderRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: ID of the Project containing the folder. - ProjectID string `json:"project_id"` - - // Name: name of the folder. - Name string `json:"name"` - - // Path: (Optional.) Location of the folder in the directory structure. If not specified, the path is `/`. - Path *string `json:"path,omitempty"` -} - -// CreateSecretRequest: create secret request. -type CreateSecretRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: ID of the Project containing the secret. - ProjectID string `json:"project_id"` - - // Name: name of the secret. - Name string `json:"name"` - - // Tags: list of the secret's tags. - Tags []string `json:"tags"` - - // Description: description of the secret. - Description *string `json:"description,omitempty"` - - // Type: (Optional.) See `Secret.Type` enum for description of values. If not specified, the type is `Opaque`. - // Default value: unknown_secret_type - Type SecretType `json:"type"` - - // Path: (Optional.) Location of the secret in the directory structure. If not specified, the path is `/`. - Path *string `json:"path,omitempty"` - - // EphemeralPolicy: (Optional.) Policy that defines whether/when a secret's versions expire. By default, the policy is applied to all the secret's versions. - EphemeralPolicy *EphemeralPolicy `json:"ephemeral_policy,omitempty"` - - // IsProtected: a protected secret cannot be deleted. - IsProtected bool `json:"is_protected"` -} - -// CreateSecretVersionRequest: create secret version request. -type CreateSecretVersionRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Data: the base64-encoded secret payload of the version. - Data []byte `json:"data"` - - // Description: description of the version. - Description *string `json:"description,omitempty"` - - // DisablePrevious: (Optional.) If there is no previous version or if the previous version was already disabled, does nothing. - DisablePrevious *bool `json:"disable_previous,omitempty"` - - // Deprecated: PasswordGeneration: (Optional.) If specified, a random password will be generated. The `data` and `data_crc32` fields must be empty. By default, the generator will use upper and lower case letters, and digits. This behavior can be tuned using the generation parameters. - PasswordGeneration *PasswordGenerationParams `json:"password_generation,omitempty"` - - // DataCrc32: if specified, Secret Manager will verify the integrity of the data received against the given CRC32 checksum. An error is returned if the CRC32 does not match. If, however, the CRC32 matches, it will be stored and returned along with the SecretVersion on future access requests. - DataCrc32 *uint32 `json:"data_crc32,omitempty"` -} - -// DeleteFolderRequest: delete folder request. -type DeleteFolderRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // FolderID: ID of the folder. - FolderID string `json:"-"` -} - -// DeleteSecretRequest: delete secret request. -type DeleteSecretRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` -} - -// DestroySecretVersionRequest: destroy secret version request. -type DestroySecretVersionRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` -} - -// DisableSecretVersionRequest: disable secret version request. -type DisableSecretVersionRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` -} - -// EnableSecretVersionRequest: enable secret version request. -type EnableSecretVersionRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` -} - -// GeneratePasswordRequest: generate password request. -type GeneratePasswordRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Description: description of the version. - Description *string `json:"description,omitempty"` - - // DisablePrevious: this has no effect if there is no previous version or if the previous version was already disabled. - DisablePrevious *bool `json:"disable_previous,omitempty"` - - // Length: length of the password to generate (between 1 and 1024 characters). - Length uint32 `json:"length"` - - // NoLowercaseLetters: (Optional.) Exclude lower case letters by default in the password character set. - NoLowercaseLetters *bool `json:"no_lowercase_letters,omitempty"` - - // NoUppercaseLetters: (Optional.) Exclude upper case letters by default in the password character set. - NoUppercaseLetters *bool `json:"no_uppercase_letters,omitempty"` - - // NoDigits: (Optional.) Exclude digits by default in the password character set. - NoDigits *bool `json:"no_digits,omitempty"` - - // AdditionalChars: (Optional.) Additional ASCII characters to be included in the password character set. - AdditionalChars *string `json:"additional_chars,omitempty"` -} - -// GetSecretByNameRequest: get secret by name request. -type GetSecretByNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretName: name of the secret. - SecretName string `json:"-"` - - // ProjectID: (Optional.) If not specified, Secret Manager will look for the secret in all Projects. - ProjectID *string `json:"project_id,omitempty"` -} - -// GetSecretRequest: get secret request. -type GetSecretRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` -} - -// GetSecretVersionByNameRequest: get secret version by name request. -type GetSecretVersionByNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretName: name of the secret. - SecretName string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` - - // ProjectID: (Optional.) If not specified, Secret Manager will look for the secret version in all Projects. - ProjectID *string `json:"project_id,omitempty"` -} - -// GetSecretVersionRequest: get secret version request. -type GetSecretVersionRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` -} - -// ListFoldersRequest: list folders request. -type ListFoldersRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: filter by Project ID (optional). - ProjectID *string `json:"-"` - - // Path: filter by path (optional). - Path *string `json:"-"` - - Page *int32 `json:"-"` - - PageSize *uint32 `json:"-"` - - // OrderBy: default value: created_at_asc - OrderBy ListFoldersRequestOrderBy `json:"-"` -} - -// ListFoldersResponse: list folders response. -type ListFoldersResponse struct { - // Folders: list of folders. - Folders []*Folder `json:"folders"` - - // TotalCount: count of all folders matching the requested criteria. - TotalCount uint32 `json:"total_count"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListFoldersResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListFoldersResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListFoldersResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Folders = append(r.Folders, results.Folders...) - r.TotalCount += uint32(len(results.Folders)) - return uint32(len(results.Folders)), nil -} - -// ListSecretVersionsByNameRequest: list secret versions by name request. -type ListSecretVersionsByNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretName: name of the secret. - SecretName string `json:"-"` - - Page *int32 `json:"-"` - - PageSize *uint32 `json:"-"` - - // Status: filter results by status. - Status []SecretVersionStatus `json:"-"` - - // ProjectID: (Optional.) If not specified, Secret Manager will look for the secret in all Projects. - ProjectID *string `json:"-"` -} - -// ListSecretVersionsRequest: list secret versions request. -type ListSecretVersionsRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - Page *int32 `json:"-"` - - PageSize *uint32 `json:"-"` - - // Status: filter results by status. - Status []SecretVersionStatus `json:"-"` -} - -// ListSecretVersionsResponse: list secret versions response. -type ListSecretVersionsResponse struct { - // Versions: single page of versions. - Versions []*SecretVersion `json:"versions"` - - // TotalCount: number of versions. - TotalCount uint32 `json:"total_count"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListSecretVersionsResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListSecretVersionsResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListSecretVersionsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Versions = append(r.Versions, results.Versions...) - r.TotalCount += uint32(len(results.Versions)) - return uint32(len(results.Versions)), nil -} - -// ListSecretsRequest: list secrets request. -type ListSecretsRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // OrganizationID: filter by Organization ID (optional). - OrganizationID *string `json:"-"` - - // ProjectID: filter by Project ID (optional). - ProjectID *string `json:"-"` - - // OrderBy: default value: name_asc - OrderBy ListSecretsRequestOrderBy `json:"-"` - - Page *int32 `json:"-"` - - PageSize *uint32 `json:"-"` - - // Tags: list of tags to filter on (optional). - Tags []string `json:"-"` - - // Name: filter by secret name (optional). - Name *string `json:"-"` - - // IsManaged: filter by managed / not managed (optional). - IsManaged *bool `json:"-"` - - // Path: filter by path (optional). - Path *string `json:"-"` - - // IsEphemeral: filter by ephemeral / not ephemeral (optional). - IsEphemeral *bool `json:"-"` -} - -// ListSecretsResponse: list secrets response. -type ListSecretsResponse struct { - // Secrets: single page of secrets matching the requested criteria. - Secrets []*Secret `json:"secrets"` - - // TotalCount: count of all secrets matching the requested criteria. - TotalCount uint32 `json:"total_count"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListSecretsResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListSecretsResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListSecretsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Secrets = append(r.Secrets, results.Secrets...) - r.TotalCount += uint32(len(results.Secrets)) - return uint32(len(results.Secrets)), nil -} - -// ListTagsRequest: list tags request. -type ListTagsRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: (Optional.) If not specified, Secret Manager will look for tags in all Projects. - ProjectID *string `json:"-"` - - Page *int32 `json:"-"` - - PageSize *uint32 `json:"-"` -} - -// ListTagsResponse: list tags response. -type ListTagsResponse struct { - // Tags: list of tags. - Tags []string `json:"tags"` - - // TotalCount: count of all tags matching the requested criteria. - TotalCount uint32 `json:"total_count"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListTagsResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListTagsResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListTagsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Tags = append(r.Tags, results.Tags...) - r.TotalCount += uint32(len(results.Tags)) - return uint32(len(results.Tags)), nil -} - -// ProtectSecretRequest: protect secret request. -type ProtectSecretRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret to protect. - SecretID string `json:"-"` -} - -// UnprotectSecretRequest: unprotect secret request. -type UnprotectSecretRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret to unprotect. - SecretID string `json:"-"` -} - -// UpdateSecretRequest: update secret request. -type UpdateSecretRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Name: secret's updated name (optional). - Name *string `json:"name,omitempty"` - - // Tags: secret's updated list of tags (optional). - Tags *[]string `json:"tags,omitempty"` - - // Description: description of the secret. - Description *string `json:"description,omitempty"` - - // Path: (Optional.) Location of the folder in the directory structure. If not specified, the path is `/`. - Path *string `json:"path,omitempty"` - - // EphemeralPolicy: (Optional.) Policy that defines whether/when a secret's versions expire. - EphemeralPolicy *EphemeralPolicy `json:"ephemeral_policy,omitempty"` -} - -// UpdateSecretVersionRequest: update secret version request. -type UpdateSecretVersionRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // SecretID: ID of the secret. - SecretID string `json:"-"` - - // Revision: the first version of the secret is numbered 1, and all subsequent revisions augment by 1. Value can be either: - // - a number (the revision number) - // - "latest" (the latest revision) - // - "latest_enabled" (the latest enabled revision). - Revision string `json:"-"` - - // Description: description of the version. - Description *string `json:"description,omitempty"` - - // EphemeralProperties: (Optional.) Properties that defines the version's expiration date, whether it expires after being accessed once, and the action to perform (disable or delete) once the version expires. - EphemeralProperties *EphemeralProperties `json:"ephemeral_properties,omitempty"` -} - -// This API allows you to manage your Secret Manager services, for storing, accessing and sharing sensitive data such as passwords, API keys and certificates. -type API struct { - client *scw.Client -} - -// NewAPI returns a API object from a Scaleway client. -func NewAPI(client *scw.Client) *API { - return &API{ - client: client, - } -} -func (s *API) Regions() []scw.Region { - return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} -} - -// CreateSecret: You must specify the `region` to create a secret. -func (s *API) CreateSecret(req *CreateSecretRequest, opts ...scw.RequestOption) (*Secret, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Secret - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// CreateFolder: Create folder. -func (s *API) CreateFolder(req *CreateFolderRequest, opts ...scw.RequestOption) (*Folder, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/folders", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Folder - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetSecret: Retrieve the metadata of a secret specified by the `region` and `secret_id` parameters. -func (s *API) GetSecret(req *GetSecretRequest, opts ...scw.RequestOption) (*Secret, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "", - } - - var resp Secret - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: GetSecretByName: Retrieve the metadata of a secret specified by the `region` and `secret_name` parameters. -// -// GetSecretByName usage is now deprecated. -// -// Scaleway recommends that you use the `ListSecrets` request with the `name` filter. -func (s *API) GetSecretByName(req *GetSecretByNameRequest, opts ...scw.RequestOption) (*Secret, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretName) == "" { - return nil, errors.New("field SecretName cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets-by-name/" + fmt.Sprint(req.SecretName) + "", - Query: query, - } - - var resp Secret - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// UpdateSecret: Edit a secret's metadata such as name, tag(s), description and ephemeral policy. The secret to update is specified by the `secret_id` and `region` parameters. -func (s *API) UpdateSecret(req *UpdateSecretRequest, opts ...scw.RequestOption) (*Secret, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "PATCH", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Secret - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListSecrets: Retrieve the list of secrets created within an Organization and/or Project. You must specify either the `organization_id` or the `project_id` and the `region`. -func (s *API) ListSecrets(req *ListSecretsRequest, opts ...scw.RequestOption) (*ListSecretsResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "tags", req.Tags) - parameter.AddToQuery(query, "name", req.Name) - parameter.AddToQuery(query, "is_managed", req.IsManaged) - parameter.AddToQuery(query, "path", req.Path) - parameter.AddToQuery(query, "is_ephemeral", req.IsEphemeral) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets", - Query: query, - } - - var resp ListSecretsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListFolders: Retrieve the list of folders created within a Project. -func (s *API) ListFolders(req *ListFoldersRequest, opts ...scw.RequestOption) (*ListFoldersResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "path", req.Path) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "order_by", req.OrderBy) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/folders", - Query: query, - } - - var resp ListFoldersResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeleteSecret: Delete a given secret specified by the `region` and `secret_id` parameters. -func (s *API) DeleteSecret(req *DeleteSecretRequest, opts ...scw.RequestOption) error { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// DeleteFolder: Delete a given folder specified by the `region` and `folder_id` parameters. -func (s *API) DeleteFolder(req *DeleteFolderRequest, opts ...scw.RequestOption) error { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.FolderID) == "" { - return errors.New("field FolderID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/folders/" + fmt.Sprint(req.FolderID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// ProtectSecret: Protect a given secret specified by the `secret_id` parameter. A protected secret can be read and modified but cannot be deleted. -func (s *API) ProtectSecret(req *ProtectSecretRequest, opts ...scw.RequestOption) (*Secret, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/protect", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Secret - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// UnprotectSecret: Unprotect a given secret specified by the `secret_id` parameter. An unprotected secret can be read, modified and deleted. -func (s *API) UnprotectSecret(req *UnprotectSecretRequest, opts ...scw.RequestOption) (*Secret, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/unprotect", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Secret - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// AddSecretOwner: Allow a product to use the secret. -func (s *API) AddSecretOwner(req *AddSecretOwnerRequest, opts ...scw.RequestOption) error { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/add-owner", - } - - err = scwReq.SetBody(req) - if err != nil { - return err - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// CreateSecretVersion: Create a version of a given secret specified by the `region` and `secret_id` parameters. -func (s *API) CreateSecretVersion(req *CreateSecretVersionRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GeneratePassword: Generate a password for the given secret specified by the `region` and `secret_id` parameters. This will also create a new version of the secret that will store the password. -func (s *API) GeneratePassword(req *GeneratePasswordRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/generate-password", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetSecretVersion: Retrieve the metadata of a secret's given version specified by the `region`, `secret_id` and `revision` parameters. -func (s *API) GetSecretVersion(req *GetSecretVersionRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions/" + fmt.Sprint(req.Revision) + "", - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: GetSecretVersionByName: Retrieve the metadata of a secret's given version specified by the `region`, `secret_name`, `revision` and `project_id` parameters. -// -// This method is deprecated. -// -// Scaleway recommends that you use the `ListSecrets` request with the `name` filter to specify the secret version desired, then use the `GetSecretVersion` request. -func (s *API) GetSecretVersionByName(req *GetSecretVersionByNameRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretName) == "" { - return nil, errors.New("field SecretName cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets-by-name/" + fmt.Sprint(req.SecretName) + "/versions/" + fmt.Sprint(req.Revision) + "", - Query: query, - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// UpdateSecretVersion: Edit the metadata of a secret's given version, specified by the `region`, `secret_id` and `revision` parameters. -func (s *API) UpdateSecretVersion(req *UpdateSecretVersionRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "PATCH", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions/" + fmt.Sprint(req.Revision) + "", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListSecretVersions: Retrieve the list of a given secret's versions specified by the `secret_id` and `region` parameters. -func (s *API) ListSecretVersions(req *ListSecretVersionsRequest, opts ...scw.RequestOption) (*ListSecretVersionsResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "status", req.Status) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions", - Query: query, - } - - var resp ListSecretVersionsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: ListSecretVersionsByName: Retrieve the list of a given secret's versions specified by the `secret_name`,`region` and `project_id` parameters. -// -// This method is deprecated. -// -// Scaleway recommends that you use the `ListSecrets` request with the `name` filter to specify the secret version desired, then use the `ListSecretVersions` request. -func (s *API) ListSecretVersionsByName(req *ListSecretVersionsByNameRequest, opts ...scw.RequestOption) (*ListSecretVersionsResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "status", req.Status) - parameter.AddToQuery(query, "project_id", req.ProjectID) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretName) == "" { - return nil, errors.New("field SecretName cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets-by-name/" + fmt.Sprint(req.SecretName) + "/versions", - Query: query, - } - - var resp ListSecretVersionsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// EnableSecretVersion: Make a specific version accessible. You must specify the `region`, `secret_id` and `revision` parameters. -func (s *API) EnableSecretVersion(req *EnableSecretVersionRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions/" + fmt.Sprint(req.Revision) + "/enable", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DisableSecretVersion: Make a specific version inaccessible. You must specify the `region`, `secret_id` and `revision` parameters. -func (s *API) DisableSecretVersion(req *DisableSecretVersionRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions/" + fmt.Sprint(req.Revision) + "/disable", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// AccessSecretVersion: Access sensitive data in a secret's version specified by the `region`, `secret_id` and `revision` parameters. -func (s *API) AccessSecretVersion(req *AccessSecretVersionRequest, opts ...scw.RequestOption) (*AccessSecretVersionResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions/" + fmt.Sprint(req.Revision) + "/access", - } - - var resp AccessSecretVersionResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: AccessSecretVersionByName: Access sensitive data in a secret's version specified by the `region`, `secret_name`, `revision` and `project_id` parameters. -// -// This method is deprecated. -// -// Scaleway recommends that you use the `ListSecrets` request with the `name` filter to specify the secret version desired, then use the `AccessSecretVersion` request. -func (s *API) AccessSecretVersionByName(req *AccessSecretVersionByNameRequest, opts ...scw.RequestOption) (*AccessSecretVersionResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretName) == "" { - return nil, errors.New("field SecretName cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets-by-name/" + fmt.Sprint(req.SecretName) + "/versions/" + fmt.Sprint(req.Revision) + "/access", - Query: query, - } - - var resp AccessSecretVersionResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DestroySecretVersion: Delete a secret's version and the sensitive data contained in it. Deleting a version is permanent and cannot be undone. -func (s *API) DestroySecretVersion(req *DestroySecretVersionRequest, opts ...scw.RequestOption) (*SecretVersion, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.SecretID) == "" { - return nil, errors.New("field SecretID cannot be empty in request") - } - - if fmt.Sprint(req.Revision) == "" { - return nil, errors.New("field Revision cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/secrets/" + fmt.Sprint(req.SecretID) + "/versions/" + fmt.Sprint(req.Revision) + "/destroy", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SecretVersion - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListTags: List all tags associated with secrets within a given Project. -func (s *API) ListTags(req *ListTagsRequest, opts ...scw.RequestOption) (*ListTagsResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/secret-manager/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/tags", - Query: query, - } - - var resp ListTagsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} From 8feafeb6a215c34c506dca1525570cf07ab265b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Fri, 22 Nov 2024 14:48:32 +0100 Subject: [PATCH 089/163] chore: remove account/v2alpha1 and account/v2 (#2325) --- api/account/v2/account_sdk.go | 362 ---------------------------- api/account/v2alpha1/account_sdk.go | 325 ------------------------- 2 files changed, 687 deletions(-) delete mode 100644 api/account/v2/account_sdk.go delete mode 100644 api/account/v2alpha1/account_sdk.go diff --git a/api/account/v2/account_sdk.go b/api/account/v2/account_sdk.go deleted file mode 100644 index 0b4fa6661..000000000 --- a/api/account/v2/account_sdk.go +++ /dev/null @@ -1,362 +0,0 @@ -// This file was automatically generated. DO NOT EDIT. -// If you have any remark or suggestion do not hesitate to open an issue. - -// Package account provides methods and message types of the account v2 API. -package account - -import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/marshaler" - "github.com/scaleway/scaleway-sdk-go/namegenerator" - "github.com/scaleway/scaleway-sdk-go/parameter" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -// always import dependencies -var ( - _ fmt.Stringer - _ json.Unmarshaler - _ url.URL - _ net.IP - _ http.Header - _ bytes.Reader - _ time.Time - _ = strings.Join - - _ scw.ScalewayRequest - _ marshaler.Duration - _ scw.File - _ = parameter.AddToQuery - _ = namegenerator.GetRandomName -) - -type ListProjectsRequestOrderBy string - -const ( - // Creation date ascending. - ListProjectsRequestOrderByCreatedAtAsc = ListProjectsRequestOrderBy("created_at_asc") - // Creation date descending. - ListProjectsRequestOrderByCreatedAtDesc = ListProjectsRequestOrderBy("created_at_desc") - // Name ascending. - ListProjectsRequestOrderByNameAsc = ListProjectsRequestOrderBy("name_asc") - // Name descending. - ListProjectsRequestOrderByNameDesc = ListProjectsRequestOrderBy("name_desc") -) - -func (enum ListProjectsRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListProjectsRequestOrderBy) Values() []ListProjectsRequestOrderBy { - return []ListProjectsRequestOrderBy{ - "created_at_asc", - "created_at_desc", - "name_asc", - "name_desc", - } -} - -func (enum ListProjectsRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListProjectsRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListProjectsRequestOrderBy(ListProjectsRequestOrderBy(tmp).String()) - return nil -} - -// Project: project. -type Project struct { - // ID: ID of the Project. - ID string `json:"id"` - - // Name: name of the Project. - Name string `json:"name"` - - // OrganizationID: organization ID of the Project. - OrganizationID string `json:"organization_id"` - - // CreatedAt: creation date of the Project. - CreatedAt *time.Time `json:"created_at"` - - // UpdatedAt: update date of the Project. - UpdatedAt *time.Time `json:"updated_at"` - - // Description: description of the Project. - Description string `json:"description"` -} - -// CreateProjectRequest: create project request. -type CreateProjectRequest struct { - // Name: name of the Project. - Name string `json:"name"` - - // OrganizationID: organization ID of the Project. - OrganizationID string `json:"organization_id"` - - // Description: description of the Project. - Description *string `json:"description,omitempty"` -} - -// DeleteProjectRequest: delete project request. -type DeleteProjectRequest struct { - // ProjectID: project ID of the Project. - ProjectID string `json:"-"` -} - -// GetProjectRequest: get project request. -type GetProjectRequest struct { - // ProjectID: project ID of the Project. - ProjectID string `json:"-"` -} - -// ListProjectsRequest: list projects request. -type ListProjectsRequest struct { - // OrganizationID: organization ID of the Project. - OrganizationID string `json:"-"` - - // Name: name of the Project. - Name *string `json:"-"` - - // Page: page number for the returned Projects. - Page *int32 `json:"-"` - - // PageSize: maximum number of Project per page. - PageSize *uint32 `json:"-"` - - // OrderBy: sort order of the returned Projects. - // Default value: created_at_asc - OrderBy ListProjectsRequestOrderBy `json:"-"` - - // ProjectIDs: project IDs to filter for. The results will be limited to any Projects with an ID in this array. - ProjectIDs []string `json:"-"` -} - -// ListProjectsResponse: list projects response. -type ListProjectsResponse struct { - // TotalCount: total number of Projects. - TotalCount uint32 `json:"total_count"` - - // Projects: paginated returned Projects. - Projects []*Project `json:"projects"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListProjectsResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListProjectsResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListProjectsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Projects = append(r.Projects, results.Projects...) - r.TotalCount += uint32(len(results.Projects)) - return uint32(len(results.Projects)), nil -} - -// UpdateProjectRequest: update project request. -type UpdateProjectRequest struct { - // ProjectID: project ID of the Project. - ProjectID string `json:"-"` - - // Name: name of the Project. - Name *string `json:"name,omitempty"` - - // Description: description of the Project. - Description *string `json:"description,omitempty"` -} - -// This API allows you to manage your Scaleway Projects. -type API struct { - client *scw.Client -} - -// NewAPI returns a API object from a Scaleway client. -func NewAPI(client *scw.Client) *API { - return &API{ - client: client, - } -} - -// Deprecated: CreateProject: Deprecated in favor of Account API v3. -// Generate a new Project for an Organization, specifying its configuration including name and description. -func (s *API) CreateProject(req *CreateProjectRequest, opts ...scw.RequestOption) (*Project, error) { - var err error - - if req.OrganizationID == "" { - defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() - req.OrganizationID = defaultOrganizationID - } - - if req.Name == "" { - req.Name = namegenerator.GetRandomName("proj") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/account/v2/projects", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Project - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: ListProjects: Deprecated in favor of Account API v3. -// List all Projects of an Organization. The response will include the total number of Projects as well as their associated Organizations, names and IDs. Other information include the creation and update date of the Project. -func (s *API) ListProjects(req *ListProjectsRequest, opts ...scw.RequestOption) (*ListProjectsResponse, error) { - var err error - - if req.OrganizationID == "" { - defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() - req.OrganizationID = defaultOrganizationID - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - parameter.AddToQuery(query, "name", req.Name) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "project_ids", req.ProjectIDs) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/account/v2/projects", - Query: query, - } - - var resp ListProjectsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: GetProject: Deprecated in favor of Account API v3. -// Retrieve information about an existing Project, specified by its Project ID. Its full details, including ID, name and description, are returned in the response object. -func (s *API) GetProject(req *GetProjectRequest, opts ...scw.RequestOption) (*Project, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.ProjectID) == "" { - return nil, errors.New("field ProjectID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/account/v2/projects/" + fmt.Sprint(req.ProjectID) + "", - } - - var resp Project - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// Deprecated: DeleteProject: Deprecated in favor of Account API v3. -// Delete an existing Project, specified by its Project ID. The Project needs to be empty (meaning there are no resources left in it) to be deleted effectively. Note that deleting a Project is permanent, and cannot be undone. -func (s *API) DeleteProject(req *DeleteProjectRequest, opts ...scw.RequestOption) error { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.ProjectID) == "" { - return errors.New("field ProjectID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/account/v2/projects/" + fmt.Sprint(req.ProjectID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// Deprecated: UpdateProject: Deprecated in favor of Account API v3. -// Update the parameters of an existing Project, specified by its Project ID. These parameters include the name and description. -func (s *API) UpdateProject(req *UpdateProjectRequest, opts ...scw.RequestOption) (*Project, error) { - var err error - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.ProjectID) == "" { - return nil, errors.New("field ProjectID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "PATCH", - Path: "/account/v2/projects/" + fmt.Sprint(req.ProjectID) + "", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Project - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} diff --git a/api/account/v2alpha1/account_sdk.go b/api/account/v2alpha1/account_sdk.go deleted file mode 100644 index 213009d57..000000000 --- a/api/account/v2alpha1/account_sdk.go +++ /dev/null @@ -1,325 +0,0 @@ -// This file was automatically generated. DO NOT EDIT. -// If you have any remark or suggestion do not hesitate to open an issue. - -// Package account provides methods and message types of the account v2alpha1 API. -package account - -import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/marshaler" - "github.com/scaleway/scaleway-sdk-go/namegenerator" - "github.com/scaleway/scaleway-sdk-go/parameter" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -// always import dependencies -var ( - _ fmt.Stringer - _ json.Unmarshaler - _ url.URL - _ net.IP - _ http.Header - _ bytes.Reader - _ time.Time - _ = strings.Join - - _ scw.ScalewayRequest - _ marshaler.Duration - _ scw.File - _ = parameter.AddToQuery - _ = namegenerator.GetRandomName -) - -// API: account API. -type API struct { - client *scw.Client -} - -// NewAPI returns a API object from a Scaleway client. -func NewAPI(client *scw.Client) *API { - return &API{ - client: client, - } -} - -type ListSSHKeysRequestOrderBy string - -const ( - ListSSHKeysRequestOrderByCreatedAtAsc = ListSSHKeysRequestOrderBy("created_at_asc") - ListSSHKeysRequestOrderByCreatedAtDesc = ListSSHKeysRequestOrderBy("created_at_desc") - ListSSHKeysRequestOrderByUpdatedAtAsc = ListSSHKeysRequestOrderBy("updated_at_asc") - ListSSHKeysRequestOrderByUpdatedAtDesc = ListSSHKeysRequestOrderBy("updated_at_desc") - ListSSHKeysRequestOrderByNameAsc = ListSSHKeysRequestOrderBy("name_asc") - ListSSHKeysRequestOrderByNameDesc = ListSSHKeysRequestOrderBy("name_desc") -) - -func (enum ListSSHKeysRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListSSHKeysRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListSSHKeysRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListSSHKeysRequestOrderBy(ListSSHKeysRequestOrderBy(tmp).String()) - return nil -} - -// ListSSHKeysResponse: list ssh keys response. -type ListSSHKeysResponse struct { - SSHKeys []*SSHKey `json:"ssh_keys"` - - TotalCount uint32 `json:"total_count"` -} - -// SSHKey: ssh key. -type SSHKey struct { - ID string `json:"id"` - - Name string `json:"name"` - - PublicKey string `json:"public_key"` - - Fingerprint string `json:"fingerprint"` - - CreatedAt *time.Time `json:"created_at"` - - UpdatedAt *time.Time `json:"updated_at"` - - CreationInfo *SSHKeyCreationInfo `json:"creation_info"` - - OrganizationID string `json:"organization_id"` - - ProjectID string `json:"project_id"` -} - -type SSHKeyCreationInfo struct { - Address string `json:"address"` - - UserAgent string `json:"user_agent"` - - CountryCode string `json:"country_code"` -} - -// Service API - -type ListSSHKeysRequest struct { - // OrderBy: default value: created_at_asc - OrderBy ListSSHKeysRequestOrderBy `json:"-"` - - Page *int32 `json:"-"` - - PageSize *uint32 `json:"-"` - - Name *string `json:"-"` - - OrganizationID *string `json:"-"` - - ProjectID *string `json:"-"` -} - -// ListSSHKeys: list all SSH keys of your project. -func (s *API) ListSSHKeys(req *ListSSHKeysRequest, opts ...scw.RequestOption) (*ListSSHKeysResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "name", req.Name) - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - parameter.AddToQuery(query, "project_id", req.ProjectID) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/account/v2alpha1/ssh-keys", - Query: query, - Headers: http.Header{}, - } - - var resp ListSSHKeysResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -type CreateSSHKeyRequest struct { - // Name: the name of the SSH key. - Name string `json:"name"` - // PublicKey: SSH public key. Currently ssh-rsa, ssh-dss (DSA), ssh-ed25519 and ecdsa keys with NIST curves are supported. - PublicKey string `json:"public_key"` - // Deprecated: OrganizationID: use project_id field instead. - // Precisely one of OrganizationID, ProjectID must be set. - OrganizationID *string `json:"organization_id,omitempty"` - // ProjectID: project owning the resource. - // Precisely one of OrganizationID, ProjectID must be set. - ProjectID *string `json:"project_id,omitempty"` -} - -// CreateSSHKey: add an SSH key to your project. -func (s *API) CreateSSHKey(req *CreateSSHKeyRequest, opts ...scw.RequestOption) (*SSHKey, error) { - var err error - - defaultProjectID, exist := s.client.GetDefaultProjectID() - if exist && req.OrganizationID == nil && req.ProjectID == nil { - req.ProjectID = &defaultProjectID - } - - defaultOrganizationID, exist := s.client.GetDefaultOrganizationID() - if exist && req.OrganizationID == nil && req.ProjectID == nil { - req.OrganizationID = &defaultOrganizationID - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/account/v2alpha1/ssh-keys", - Headers: http.Header{}, - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SSHKey - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -type GetSSHKeyRequest struct { - // SSHKeyID: the ID of the SSH key. - SSHKeyID string `json:"-"` -} - -// GetSSHKey: get an SSH key from your project. -func (s *API) GetSSHKey(req *GetSSHKeyRequest, opts ...scw.RequestOption) (*SSHKey, error) { - var err error - - if fmt.Sprint(req.SSHKeyID) == "" { - return nil, errors.New("field SSHKeyID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/account/v2alpha1/ssh-key/" + fmt.Sprint(req.SSHKeyID) + "", - Headers: http.Header{}, - } - - var resp SSHKey - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -type UpdateSSHKeyRequest struct { - SSHKeyID string `json:"-"` - // Name: name of the SSH key. - Name *string `json:"name"` -} - -// UpdateSSHKey: update an SSH key on your project. -func (s *API) UpdateSSHKey(req *UpdateSSHKeyRequest, opts ...scw.RequestOption) (*SSHKey, error) { - var err error - - if fmt.Sprint(req.SSHKeyID) == "" { - return nil, errors.New("field SSHKeyID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "PATCH", - Path: "/account/v2alpha1/ssh-key/" + fmt.Sprint(req.SSHKeyID) + "", - Headers: http.Header{}, - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp SSHKey - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -type DeleteSSHKeyRequest struct { - SSHKeyID string `json:"-"` -} - -// DeleteSSHKey: remove an SSH key from your project. -func (s *API) DeleteSSHKey(req *DeleteSSHKeyRequest, opts ...scw.RequestOption) error { - var err error - - if fmt.Sprint(req.SSHKeyID) == "" { - return errors.New("field SSHKeyID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/account/v2alpha1/ssh-key/" + fmt.Sprint(req.SSHKeyID) + "", - Headers: http.Header{}, - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListSSHKeysResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListSSHKeysResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListSSHKeysResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.SSHKeys = append(r.SSHKeys, results.SSHKeys...) - r.TotalCount += uint32(len(results.SSHKeys)) - return uint32(len(results.SSHKeys)), nil -} From e059a31421161c409c14b5288720487ec036bece Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 22 Nov 2024 16:51:33 +0100 Subject: [PATCH 090/163] feat(k8s): add repo_uri field to NodeMetadata (#2327) --- api/k8s/v1/k8s_sdk.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 4f530eef6..04c0979d5 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -1964,6 +1964,8 @@ type NodeMetadata struct { HasGpu bool `json:"has_gpu"` ExternalIP string `json:"external_ip"` + + RepoURI string `json:"repo_uri"` } // RebootNodeRequest: reboot node request. From 0396f60f5b709b8cdfc1fa1c088d2ca94f118161 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 25 Nov 2024 17:38:21 +0100 Subject: [PATCH 091/163] fix(rdb): add documentation about password validation (#2328) --- api/rdb/v1/rdb_sdk.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/rdb/v1/rdb_sdk.go b/api/rdb/v1/rdb_sdk.go index ed036bcc8..46f7e6b84 100644 --- a/api/rdb/v1/rdb_sdk.go +++ b/api/rdb/v1/rdb_sdk.go @@ -1815,7 +1815,7 @@ type CreateInstanceRequest struct { // UserName: username created when the Database Instance is created. UserName string `json:"user_name"` - // Password: password of the user. + // Password: password of the user. Password must be between 8 and 128 characters, contain at least one digit, one uppercase, one lowercase and one special character. Password string `json:"password"` // NodeType: type of node to use for the Database Instance. @@ -1903,7 +1903,7 @@ type CreateUserRequest struct { // Name: name of the user you want to create. Name string `json:"name"` - // Password: password of the user you want to create. + // Password: password of the user you want to create. Password must be between 8 and 128 characters, contain at least one digit, one uppercase, one lowercase and one special character. Password string `json:"password"` // IsAdmin: defines whether the user will have administrative privileges. @@ -2811,7 +2811,7 @@ type UpdateUserRequest struct { // Name: name of the database user. Name string `json:"-"` - // Password: password of the database user. + // Password: password of the database user. Password must be between 8 and 128 characters, contain at least one digit, one uppercase, one lowercase and one special character. Password *string `json:"password,omitempty"` // IsAdmin: defines whether or not this user got administrative privileges. From 94736bc9e407c002ad37dde4871c5a07ddf1ddd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Nov 2024 17:49:45 +0100 Subject: [PATCH 092/163] chore: remove billing/v2alpha1 (#2329) --- api/billing/v2alpha1/billing_sdk.go | 670 ---------------------------- sdk_compilation_test.go | 1 - 2 files changed, 671 deletions(-) delete mode 100644 api/billing/v2alpha1/billing_sdk.go diff --git a/api/billing/v2alpha1/billing_sdk.go b/api/billing/v2alpha1/billing_sdk.go deleted file mode 100644 index 8ebde39b9..000000000 --- a/api/billing/v2alpha1/billing_sdk.go +++ /dev/null @@ -1,670 +0,0 @@ -// This file was automatically generated. DO NOT EDIT. -// If you have any remark or suggestion do not hesitate to open an issue. - -// Package billing provides methods and message types of the billing v2alpha1 API. -package billing - -import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/marshaler" - "github.com/scaleway/scaleway-sdk-go/namegenerator" - "github.com/scaleway/scaleway-sdk-go/parameter" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -// always import dependencies -var ( - _ fmt.Stringer - _ json.Unmarshaler - _ url.URL - _ net.IP - _ http.Header - _ bytes.Reader - _ time.Time - _ = strings.Join - - _ scw.ScalewayRequest - _ marshaler.Duration - _ scw.File - _ = parameter.AddToQuery - _ = namegenerator.GetRandomName -) - -type DiscountDiscountMode string - -const ( - // Unknown discount mode. - DiscountDiscountModeUnknownDiscountMode = DiscountDiscountMode("unknown_discount_mode") - // A rate discount that reduces each customer bill by the discount value percentage. - DiscountDiscountModeDiscountModeRate = DiscountDiscountMode("discount_mode_rate") - // A value discount that reduces the amount of the customer bill by the discount value. - DiscountDiscountModeDiscountModeValue = DiscountDiscountMode("discount_mode_value") - // A fixed sum to be deducted from the user's bills. - DiscountDiscountModeDiscountModeSplittable = DiscountDiscountMode("discount_mode_splittable") -) - -func (enum DiscountDiscountMode) String() string { - if enum == "" { - // return default value if empty - return "unknown_discount_mode" - } - return string(enum) -} - -func (enum DiscountDiscountMode) Values() []DiscountDiscountMode { - return []DiscountDiscountMode{ - "unknown_discount_mode", - "discount_mode_rate", - "discount_mode_value", - "discount_mode_splittable", - } -} - -func (enum DiscountDiscountMode) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *DiscountDiscountMode) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = DiscountDiscountMode(DiscountDiscountMode(tmp).String()) - return nil -} - -type DiscountFilterType string - -const ( - // Unknown filter type. - DiscountFilterTypeUnknownType = DiscountFilterType("unknown_type") - // Product category, such as Compute, Network, Observability. - DiscountFilterTypeProductCategory = DiscountFilterType("product_category") - // Products within the Product category. For example, VPC, Private Networks, and Public Gateways are products in the Network category. - DiscountFilterTypeProduct = DiscountFilterType("product") - // The offer of a product. For example, "VPC Public Gateway S", "VPC Public Gateway M" for the VPC product. - DiscountFilterTypeProductOffer = DiscountFilterType("product_offer") - // Identifies the reference based on category, product, range, size, region, and zone. It can sometimes include different product options, such as licenses and monthly payments. - DiscountFilterTypeProductReference = DiscountFilterType("product_reference") - // Region name like "FR-PAR", "NL-AMS", "PL-WAW". - DiscountFilterTypeRegion = DiscountFilterType("region") - // Zone name like "FR-PAR-1", "FR-PAR-2", "FR-PAR-3". - DiscountFilterTypeZone = DiscountFilterType("zone") -) - -func (enum DiscountFilterType) String() string { - if enum == "" { - // return default value if empty - return "unknown_type" - } - return string(enum) -} - -func (enum DiscountFilterType) Values() []DiscountFilterType { - return []DiscountFilterType{ - "unknown_type", - "product_category", - "product", - "product_offer", - "product_reference", - "region", - "zone", - } -} - -func (enum DiscountFilterType) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *DiscountFilterType) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = DiscountFilterType(DiscountFilterType(tmp).String()) - return nil -} - -type DownloadInvoiceRequestFileType string - -const ( - DownloadInvoiceRequestFileTypePdf = DownloadInvoiceRequestFileType("pdf") -) - -func (enum DownloadInvoiceRequestFileType) String() string { - if enum == "" { - // return default value if empty - return "pdf" - } - return string(enum) -} - -func (enum DownloadInvoiceRequestFileType) Values() []DownloadInvoiceRequestFileType { - return []DownloadInvoiceRequestFileType{ - "pdf", - } -} - -func (enum DownloadInvoiceRequestFileType) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *DownloadInvoiceRequestFileType) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = DownloadInvoiceRequestFileType(DownloadInvoiceRequestFileType(tmp).String()) - return nil -} - -type InvoiceType string - -const ( - InvoiceTypeUnknownType = InvoiceType("unknown_type") - InvoiceTypePeriodic = InvoiceType("periodic") - InvoiceTypePurchase = InvoiceType("purchase") -) - -func (enum InvoiceType) String() string { - if enum == "" { - // return default value if empty - return "unknown_type" - } - return string(enum) -} - -func (enum InvoiceType) Values() []InvoiceType { - return []InvoiceType{ - "unknown_type", - "periodic", - "purchase", - } -} - -func (enum InvoiceType) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *InvoiceType) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = InvoiceType(InvoiceType(tmp).String()) - return nil -} - -type ListDiscountsRequestOrderBy string - -const ( - // Order discounts by creation date (descending chronological order). - ListDiscountsRequestOrderByCreationDateDesc = ListDiscountsRequestOrderBy("creation_date_desc") - // Order discounts by creation date (ascending chronological order). - ListDiscountsRequestOrderByCreationDateAsc = ListDiscountsRequestOrderBy("creation_date_asc") -) - -func (enum ListDiscountsRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "creation_date_desc" - } - return string(enum) -} - -func (enum ListDiscountsRequestOrderBy) Values() []ListDiscountsRequestOrderBy { - return []ListDiscountsRequestOrderBy{ - "creation_date_desc", - "creation_date_asc", - } -} - -func (enum ListDiscountsRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListDiscountsRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListDiscountsRequestOrderBy(ListDiscountsRequestOrderBy(tmp).String()) - return nil -} - -type ListInvoicesRequestOrderBy string - -const ( - ListInvoicesRequestOrderByInvoiceNumberDesc = ListInvoicesRequestOrderBy("invoice_number_desc") - ListInvoicesRequestOrderByInvoiceNumberAsc = ListInvoicesRequestOrderBy("invoice_number_asc") - ListInvoicesRequestOrderByStartDateDesc = ListInvoicesRequestOrderBy("start_date_desc") - ListInvoicesRequestOrderByStartDateAsc = ListInvoicesRequestOrderBy("start_date_asc") - ListInvoicesRequestOrderByIssuedDateDesc = ListInvoicesRequestOrderBy("issued_date_desc") - ListInvoicesRequestOrderByIssuedDateAsc = ListInvoicesRequestOrderBy("issued_date_asc") - ListInvoicesRequestOrderByDueDateDesc = ListInvoicesRequestOrderBy("due_date_desc") - ListInvoicesRequestOrderByDueDateAsc = ListInvoicesRequestOrderBy("due_date_asc") - ListInvoicesRequestOrderByTotalUntaxedDesc = ListInvoicesRequestOrderBy("total_untaxed_desc") - ListInvoicesRequestOrderByTotalUntaxedAsc = ListInvoicesRequestOrderBy("total_untaxed_asc") - ListInvoicesRequestOrderByTotalTaxedDesc = ListInvoicesRequestOrderBy("total_taxed_desc") - ListInvoicesRequestOrderByTotalTaxedAsc = ListInvoicesRequestOrderBy("total_taxed_asc") - ListInvoicesRequestOrderByInvoiceTypeDesc = ListInvoicesRequestOrderBy("invoice_type_desc") - ListInvoicesRequestOrderByInvoiceTypeAsc = ListInvoicesRequestOrderBy("invoice_type_asc") -) - -func (enum ListInvoicesRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "invoice_number_desc" - } - return string(enum) -} - -func (enum ListInvoicesRequestOrderBy) Values() []ListInvoicesRequestOrderBy { - return []ListInvoicesRequestOrderBy{ - "invoice_number_desc", - "invoice_number_asc", - "start_date_desc", - "start_date_asc", - "issued_date_desc", - "issued_date_asc", - "due_date_desc", - "due_date_asc", - "total_untaxed_desc", - "total_untaxed_asc", - "total_taxed_desc", - "total_taxed_asc", - "invoice_type_desc", - "invoice_type_asc", - } -} - -func (enum ListInvoicesRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListInvoicesRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListInvoicesRequestOrderBy(ListInvoicesRequestOrderBy(tmp).String()) - return nil -} - -// DiscountCoupon: discount coupon. -type DiscountCoupon struct { - // Description: the description of the coupon. - Description *string `json:"description"` -} - -// DiscountFilter: discount filter. -type DiscountFilter struct { - // Type: type of the filter. - // Default value: unknown_type - Type DiscountFilterType `json:"type"` - - // Value: value of filter, it can be a product/range/region/zone value. - Value string `json:"value"` - - // Exclude: boolean to describe if filter is an excluding filter. - Exclude bool `json:"exclude"` -} - -// GetConsumptionResponseConsumption: get consumption response consumption. -type GetConsumptionResponseConsumption struct { - // Value: monetary value of the consumption. - Value *scw.Money `json:"value"` - - // Description: description of the consumption. - Description string `json:"description"` - - // ProjectID: project ID of the consumption. - ProjectID string `json:"project_id"` - - // Category: category of the consumption. - Category string `json:"category"` - - // OperationPath: unique identifier of the product. - OperationPath string `json:"operation_path"` -} - -// Discount: discount. -type Discount struct { - // ID: the ID of the discount. - ID string `json:"id"` - - // CreationDate: the creation date of the discount. - CreationDate *time.Time `json:"creation_date"` - - // OrganizationID: the organization ID of the discount. - OrganizationID string `json:"organization_id"` - - // Description: the description of the discount. - Description string `json:"description"` - - // Value: the initial value of the discount. - Value float64 `json:"value"` - - // ValueUsed: the value indicating how much of the discount has been used. - ValueUsed float64 `json:"value_used"` - - // ValueRemaining: the remaining value of the discount. - ValueRemaining float64 `json:"value_remaining"` - - // Mode: the mode of the discount. - // Default value: unknown_discount_mode - Mode DiscountDiscountMode `json:"mode"` - - // StartDate: the start date of the discount. - StartDate *time.Time `json:"start_date"` - - // StopDate: the stop date of the discount. - StopDate *time.Time `json:"stop_date"` - - // Coupon: the description of the coupon. - Coupon *DiscountCoupon `json:"coupon"` - - // Filters: list of products/ranges/regions/zones to limit the usability of discounts. - Filters []*DiscountFilter `json:"filters"` -} - -// Invoice: invoice. -type Invoice struct { - // ID: invoice ID. - ID string `json:"id"` - - // StartDate: start date of the billing period. - StartDate *time.Time `json:"start_date"` - - // IssuedDate: date when the invoice was sent to the customer. - IssuedDate *time.Time `json:"issued_date"` - - // DueDate: payment time limit, set according to the Organization's payment conditions. - DueDate *time.Time `json:"due_date"` - - // TotalUntaxed: total amount, untaxed. - TotalUntaxed *scw.Money `json:"total_untaxed"` - - // TotalTaxed: total amount, taxed. - TotalTaxed *scw.Money `json:"total_taxed"` - - // InvoiceType: type of invoice. - // Default value: unknown_type - InvoiceType InvoiceType `json:"invoice_type"` - - // Number: invoice number. - Number int32 `json:"number"` -} - -// DownloadInvoiceRequest: download invoice request. -type DownloadInvoiceRequest struct { - // InvoiceID: invoice ID. - InvoiceID string `json:"-"` - - // FileType: wanted file type. - // Default value: pdf - FileType DownloadInvoiceRequestFileType `json:"-"` -} - -// GetConsumptionRequest: get consumption request. -type GetConsumptionRequest struct { - // OrganizationID: filter by organization ID. - OrganizationID string `json:"-"` -} - -// GetConsumptionResponse: get consumption response. -type GetConsumptionResponse struct { - // Consumptions: detailed consumption list. - Consumptions []*GetConsumptionResponseConsumption `json:"consumptions"` - - // UpdatedAt: last consumption update date. - UpdatedAt *time.Time `json:"updated_at"` -} - -// ListDiscountsRequest: list discounts request. -type ListDiscountsRequest struct { - // OrderBy: order discounts in the response by their description. - // Default value: creation_date_desc - OrderBy ListDiscountsRequestOrderBy `json:"-"` - - // Page: positive integer to choose the page to return. - Page *int32 `json:"-"` - - // PageSize: positive integer lower or equal to 100 to select the number of items to return. - PageSize *uint32 `json:"-"` - - // OrganizationID: ID of the organization. - OrganizationID *string `json:"-"` -} - -// ListDiscountsResponse: list discounts response. -type ListDiscountsResponse struct { - // TotalCount: total number of discounts. - TotalCount uint64 `json:"total_count"` - - // Discounts: paginated returned discounts. - Discounts []*Discount `json:"discounts"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListDiscountsResponse) UnsafeGetTotalCount() uint64 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListDiscountsResponse) UnsafeAppend(res interface{}) (uint64, error) { - results, ok := res.(*ListDiscountsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Discounts = append(r.Discounts, results.Discounts...) - r.TotalCount += uint64(len(results.Discounts)) - return uint64(len(results.Discounts)), nil -} - -// ListInvoicesRequest: list invoices request. -type ListInvoicesRequest struct { - // OrganizationID: organization ID to filter for, only invoices from this Organization will be returned. - OrganizationID *string `json:"-"` - - // StartedAfter: invoice's `start_date` is greater or equal to `started_after`. - StartedAfter *time.Time `json:"-"` - - // StartedBefore: invoice's `start_date` precedes `started_before`. - StartedBefore *time.Time `json:"-"` - - // InvoiceType: invoice type. It can either be `periodic` or `purchase`. - // Default value: unknown_type - InvoiceType InvoiceType `json:"-"` - - // Page: positive integer to choose the page to return. - Page *int32 `json:"-"` - - // PageSize: positive integer lower or equal to 100 to select the number of items to return. - PageSize *uint32 `json:"-"` - - // OrderBy: how invoices are ordered in the response. - // Default value: invoice_number_desc - OrderBy ListInvoicesRequestOrderBy `json:"-"` -} - -// ListInvoicesResponse: list invoices response. -type ListInvoicesResponse struct { - // TotalCount: total number of invoices. - TotalCount uint32 `json:"total_count"` - - // Invoices: paginated returned invoices. - Invoices []*Invoice `json:"invoices"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListInvoicesResponse) UnsafeGetTotalCount() uint32 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListInvoicesResponse) UnsafeAppend(res interface{}) (uint32, error) { - results, ok := res.(*ListInvoicesResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Invoices = append(r.Invoices, results.Invoices...) - r.TotalCount += uint32(len(results.Invoices)) - return uint32(len(results.Invoices)), nil -} - -// This API allows you to manage and query your Scaleway billing and consumption. -type API struct { - client *scw.Client -} - -// NewAPI returns a API object from a Scaleway client. -func NewAPI(client *scw.Client) *API { - return &API{ - client: client, - } -} - -// GetConsumption: The consumption reflects the amount of money you have spent for the products you have used. -// The consumption value is monetary and is not computed in real time. -func (s *API) GetConsumption(req *GetConsumptionRequest, opts ...scw.RequestOption) (*GetConsumptionResponse, error) { - var err error - - if req.OrganizationID == "" { - defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() - req.OrganizationID = defaultOrganizationID - } - - query := url.Values{} - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/billing/v2alpha1/consumption", - Query: query, - } - - var resp GetConsumptionResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListInvoices: List all your invoices, filtering by `start_date` and `invoice_type`. Each invoice has its own ID. -func (s *API) ListInvoices(req *ListInvoicesRequest, opts ...scw.RequestOption) (*ListInvoicesResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - parameter.AddToQuery(query, "started_after", req.StartedAfter) - parameter.AddToQuery(query, "started_before", req.StartedBefore) - parameter.AddToQuery(query, "invoice_type", req.InvoiceType) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "order_by", req.OrderBy) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/billing/v2alpha1/invoices", - Query: query, - } - - var resp ListInvoicesResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DownloadInvoice: Download a specific invoice, specified by its ID. -func (s *API) DownloadInvoice(req *DownloadInvoiceRequest, opts ...scw.RequestOption) (*scw.File, error) { - var err error - - query := url.Values{} - parameter.AddToQuery(query, "file_type", req.FileType) - - if fmt.Sprint(req.InvoiceID) == "" { - return nil, errors.New("field InvoiceID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/billing/v2alpha1/invoices/" + fmt.Sprint(req.InvoiceID) + "/download", - Query: query, - } - - var resp scw.File - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListDiscounts: List all discounts for an organization and usable categories/products/offers/references/regions/zones where the discount can be applied. -func (s *API) ListDiscounts(req *ListDiscountsRequest, opts ...scw.RequestOption) (*ListDiscountsResponse, error) { - var err error - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/billing/v2alpha1/discounts", - Query: query, - } - - var resp ListDiscountsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} diff --git a/sdk_compilation_test.go b/sdk_compilation_test.go index 090415f4d..07068fee5 100644 --- a/sdk_compilation_test.go +++ b/sdk_compilation_test.go @@ -6,7 +6,6 @@ import ( _ "github.com/scaleway/scaleway-sdk-go/api/account/v3" _ "github.com/scaleway/scaleway-sdk-go/api/applesilicon/v1alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/baremetal/v1" - _ "github.com/scaleway/scaleway-sdk-go/api/billing/v2alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/billing/v2beta1" _ "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1" _ "github.com/scaleway/scaleway-sdk-go/api/cockpit/v1" From e5e70ce83cab9b89efbc9f2562d1b587b9b8b042 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 26 Nov 2024 16:14:44 +0100 Subject: [PATCH 093/163] feat(ipam): add apple silicon resource types (#2330) --- api/ipam/v1/ipam_sdk.go | 38 +++++++++++++++++++---------------- api/ipam/v1alpha1/ipam_sdk.go | 38 ++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/api/ipam/v1/ipam_sdk.go b/api/ipam/v1/ipam_sdk.go index 1436f3e9b..3ad408cd9 100644 --- a/api/ipam/v1/ipam_sdk.go +++ b/api/ipam/v1/ipam_sdk.go @@ -87,23 +87,25 @@ func (enum *ListIPsRequestOrderBy) UnmarshalJSON(data []byte) error { type ResourceType string const ( - ResourceTypeUnknownType = ResourceType("unknown_type") - ResourceTypeCustom = ResourceType("custom") - ResourceTypeInstanceServer = ResourceType("instance_server") - ResourceTypeInstanceIP = ResourceType("instance_ip") - ResourceTypeInstancePrivateNic = ResourceType("instance_private_nic") - ResourceTypeLBServer = ResourceType("lb_server") - ResourceTypeFipIP = ResourceType("fip_ip") - ResourceTypeVpcGateway = ResourceType("vpc_gateway") - ResourceTypeVpcGatewayNetwork = ResourceType("vpc_gateway_network") - ResourceTypeK8sNode = ResourceType("k8s_node") - ResourceTypeK8sCluster = ResourceType("k8s_cluster") - ResourceTypeRdbInstance = ResourceType("rdb_instance") - ResourceTypeRedisCluster = ResourceType("redis_cluster") - ResourceTypeBaremetalServer = ResourceType("baremetal_server") - ResourceTypeBaremetalPrivateNic = ResourceType("baremetal_private_nic") - ResourceTypeLlmDeployment = ResourceType("llm_deployment") - ResourceTypeMgdbInstance = ResourceType("mgdb_instance") + ResourceTypeUnknownType = ResourceType("unknown_type") + ResourceTypeCustom = ResourceType("custom") + ResourceTypeInstanceServer = ResourceType("instance_server") + ResourceTypeInstanceIP = ResourceType("instance_ip") + ResourceTypeInstancePrivateNic = ResourceType("instance_private_nic") + ResourceTypeLBServer = ResourceType("lb_server") + ResourceTypeFipIP = ResourceType("fip_ip") + ResourceTypeVpcGateway = ResourceType("vpc_gateway") + ResourceTypeVpcGatewayNetwork = ResourceType("vpc_gateway_network") + ResourceTypeK8sNode = ResourceType("k8s_node") + ResourceTypeK8sCluster = ResourceType("k8s_cluster") + ResourceTypeRdbInstance = ResourceType("rdb_instance") + ResourceTypeRedisCluster = ResourceType("redis_cluster") + ResourceTypeBaremetalServer = ResourceType("baremetal_server") + ResourceTypeBaremetalPrivateNic = ResourceType("baremetal_private_nic") + ResourceTypeLlmDeployment = ResourceType("llm_deployment") + ResourceTypeMgdbInstance = ResourceType("mgdb_instance") + ResourceTypeAppleSiliconServer = ResourceType("apple_silicon_server") + ResourceTypeAppleSiliconPrivateNic = ResourceType("apple_silicon_private_nic") ) func (enum ResourceType) String() string { @@ -133,6 +135,8 @@ func (enum ResourceType) Values() []ResourceType { "baremetal_private_nic", "llm_deployment", "mgdb_instance", + "apple_silicon_server", + "apple_silicon_private_nic", } } diff --git a/api/ipam/v1alpha1/ipam_sdk.go b/api/ipam/v1alpha1/ipam_sdk.go index 4eb8f11cd..bf08a443e 100644 --- a/api/ipam/v1alpha1/ipam_sdk.go +++ b/api/ipam/v1alpha1/ipam_sdk.go @@ -87,22 +87,25 @@ func (enum *ListIPsRequestOrderBy) UnmarshalJSON(data []byte) error { type ResourceType string const ( - ResourceTypeUnknownType = ResourceType("unknown_type") - ResourceTypeCustom = ResourceType("custom") - ResourceTypeInstanceServer = ResourceType("instance_server") - ResourceTypeInstanceIP = ResourceType("instance_ip") - ResourceTypeInstancePrivateNic = ResourceType("instance_private_nic") - ResourceTypeLBServer = ResourceType("lb_server") - ResourceTypeFipIP = ResourceType("fip_ip") - ResourceTypeVpcGateway = ResourceType("vpc_gateway") - ResourceTypeVpcGatewayNetwork = ResourceType("vpc_gateway_network") - ResourceTypeK8sNode = ResourceType("k8s_node") - ResourceTypeK8sCluster = ResourceType("k8s_cluster") - ResourceTypeRdbInstance = ResourceType("rdb_instance") - ResourceTypeRedisCluster = ResourceType("redis_cluster") - ResourceTypeBaremetalServer = ResourceType("baremetal_server") - ResourceTypeBaremetalPrivateNic = ResourceType("baremetal_private_nic") - ResourceTypeLlmDeployment = ResourceType("llm_deployment") + ResourceTypeUnknownType = ResourceType("unknown_type") + ResourceTypeCustom = ResourceType("custom") + ResourceTypeInstanceServer = ResourceType("instance_server") + ResourceTypeInstanceIP = ResourceType("instance_ip") + ResourceTypeInstancePrivateNic = ResourceType("instance_private_nic") + ResourceTypeLBServer = ResourceType("lb_server") + ResourceTypeFipIP = ResourceType("fip_ip") + ResourceTypeVpcGateway = ResourceType("vpc_gateway") + ResourceTypeVpcGatewayNetwork = ResourceType("vpc_gateway_network") + ResourceTypeK8sNode = ResourceType("k8s_node") + ResourceTypeK8sCluster = ResourceType("k8s_cluster") + ResourceTypeRdbInstance = ResourceType("rdb_instance") + ResourceTypeRedisCluster = ResourceType("redis_cluster") + ResourceTypeBaremetalServer = ResourceType("baremetal_server") + ResourceTypeBaremetalPrivateNic = ResourceType("baremetal_private_nic") + ResourceTypeLlmDeployment = ResourceType("llm_deployment") + ResourceTypeMgdbInstance = ResourceType("mgdb_instance") + ResourceTypeAppleSiliconServer = ResourceType("apple_silicon_server") + ResourceTypeAppleSiliconPrivateNic = ResourceType("apple_silicon_private_nic") ) func (enum ResourceType) String() string { @@ -131,6 +134,9 @@ func (enum ResourceType) Values() []ResourceType { "baremetal_server", "baremetal_private_nic", "llm_deployment", + "mgdb_instance", + "apple_silicon_server", + "apple_silicon_private_nic", } } From b0d5bdbdf6d5b393f93b64e518f3bddda0f18a5e Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 27 Nov 2024 17:38:59 +0100 Subject: [PATCH 094/163] feat(instance): set some fields of VolumeServer as optional (#2332) --- api/instance/v1/instance_sdk.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index 7bd83e43e..ba4917631 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -1475,16 +1475,16 @@ type ServerMaintenance struct { type VolumeServer struct { ID string `json:"id"` - Name string `json:"name"` + Name *string `json:"name"` // Deprecated ExportURI *string `json:"export_uri"` - Organization string `json:"organization"` + Organization *string `json:"organization"` Server *ServerSummary `json:"server"` - Size scw.Size `json:"size"` + Size *scw.Size `json:"size"` // VolumeType: default value: l_ssd VolumeType VolumeServerVolumeType `json:"volume_type"` @@ -1494,9 +1494,9 @@ type VolumeServer struct { ModificationDate *time.Time `json:"modification_date"` // State: default value: available - State VolumeServerState `json:"state"` + State *VolumeServerState `json:"state"` - Project string `json:"project"` + Project *string `json:"project"` Boot bool `json:"boot"` From 730918071fbc0f8944d447a67d9cab3e472e650f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Thu, 28 Nov 2024 15:20:00 +0100 Subject: [PATCH 095/163] chore: purge ipfs/v1alpha1 (#2333) --- api/ipfs/v1alpha1/ipfs_sdk.go | 1447 --------------------------------- 1 file changed, 1447 deletions(-) delete mode 100644 api/ipfs/v1alpha1/ipfs_sdk.go diff --git a/api/ipfs/v1alpha1/ipfs_sdk.go b/api/ipfs/v1alpha1/ipfs_sdk.go deleted file mode 100644 index 320d0a83c..000000000 --- a/api/ipfs/v1alpha1/ipfs_sdk.go +++ /dev/null @@ -1,1447 +0,0 @@ -// This file was automatically generated. DO NOT EDIT. -// If you have any remark or suggestion do not hesitate to open an issue. - -// Package ipfs provides methods and message types of the ipfs v1alpha1 API. -package ipfs - -import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/scaleway/scaleway-sdk-go/errors" - "github.com/scaleway/scaleway-sdk-go/marshaler" - "github.com/scaleway/scaleway-sdk-go/namegenerator" - "github.com/scaleway/scaleway-sdk-go/parameter" - "github.com/scaleway/scaleway-sdk-go/scw" -) - -// always import dependencies -var ( - _ fmt.Stringer - _ json.Unmarshaler - _ url.URL - _ net.IP - _ http.Header - _ bytes.Reader - _ time.Time - _ = strings.Join - - _ scw.ScalewayRequest - _ marshaler.Duration - _ scw.File - _ = parameter.AddToQuery - _ = namegenerator.GetRandomName -) - -type ListNamesRequestOrderBy string - -const ( - ListNamesRequestOrderByCreatedAtAsc = ListNamesRequestOrderBy("created_at_asc") - ListNamesRequestOrderByCreatedAtDesc = ListNamesRequestOrderBy("created_at_desc") -) - -func (enum ListNamesRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListNamesRequestOrderBy) Values() []ListNamesRequestOrderBy { - return []ListNamesRequestOrderBy{ - "created_at_asc", - "created_at_desc", - } -} - -func (enum ListNamesRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListNamesRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListNamesRequestOrderBy(ListNamesRequestOrderBy(tmp).String()) - return nil -} - -type ListPinsRequestOrderBy string - -const ( - ListPinsRequestOrderByCreatedAtAsc = ListPinsRequestOrderBy("created_at_asc") - ListPinsRequestOrderByCreatedAtDesc = ListPinsRequestOrderBy("created_at_desc") -) - -func (enum ListPinsRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListPinsRequestOrderBy) Values() []ListPinsRequestOrderBy { - return []ListPinsRequestOrderBy{ - "created_at_asc", - "created_at_desc", - } -} - -func (enum ListPinsRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListPinsRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListPinsRequestOrderBy(ListPinsRequestOrderBy(tmp).String()) - return nil -} - -type ListVolumesRequestOrderBy string - -const ( - ListVolumesRequestOrderByCreatedAtAsc = ListVolumesRequestOrderBy("created_at_asc") - ListVolumesRequestOrderByCreatedAtDesc = ListVolumesRequestOrderBy("created_at_desc") -) - -func (enum ListVolumesRequestOrderBy) String() string { - if enum == "" { - // return default value if empty - return "created_at_asc" - } - return string(enum) -} - -func (enum ListVolumesRequestOrderBy) Values() []ListVolumesRequestOrderBy { - return []ListVolumesRequestOrderBy{ - "created_at_asc", - "created_at_desc", - } -} - -func (enum ListVolumesRequestOrderBy) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *ListVolumesRequestOrderBy) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = ListVolumesRequestOrderBy(ListVolumesRequestOrderBy(tmp).String()) - return nil -} - -type NameStatus string - -const ( - NameStatusUnknownStatus = NameStatus("unknown_status") - NameStatusQueued = NameStatus("queued") - NameStatusPublishing = NameStatus("publishing") - NameStatusFailed = NameStatus("failed") - NameStatusPublished = NameStatus("published") -) - -func (enum NameStatus) String() string { - if enum == "" { - // return default value if empty - return "unknown_status" - } - return string(enum) -} - -func (enum NameStatus) Values() []NameStatus { - return []NameStatus{ - "unknown_status", - "queued", - "publishing", - "failed", - "published", - } -} - -func (enum NameStatus) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *NameStatus) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = NameStatus(NameStatus(tmp).String()) - return nil -} - -type PinDetails string - -const ( - PinDetailsUnknownDetails = PinDetails("unknown_details") - PinDetailsPinningLookingForProvider = PinDetails("pinning_looking_for_provider") - PinDetailsPinningInProgress = PinDetails("pinning_in_progress") - PinDetailsPinningBlocksFetched = PinDetails("pinning_blocks_fetched") - PinDetailsPinningFetchingURLData = PinDetails("pinning_fetching_url_data") - PinDetailsPinnedOk = PinDetails("pinned_ok") - PinDetailsUnpinnedOk = PinDetails("unpinned_ok") - PinDetailsUnpinningInProgress = PinDetails("unpinning_in_progress") - PinDetailsFailedContainsBannedCid = PinDetails("failed_contains_banned_cid") - PinDetailsFailedPinning = PinDetails("failed_pinning") - PinDetailsFailedPinningNoProvider = PinDetails("failed_pinning_no_provider") - PinDetailsFailedPinningBadCidFormat = PinDetails("failed_pinning_bad_cid_format") - PinDetailsFailedPinningTimeout = PinDetails("failed_pinning_timeout") - PinDetailsFailedPinningTooBigContent = PinDetails("failed_pinning_too_big_content") - PinDetailsFailedPinningUnreachableURL = PinDetails("failed_pinning_unreachable_url") - PinDetailsFailedPinningBadURLFormat = PinDetails("failed_pinning_bad_url_format") - PinDetailsFailedPinningNoURLContentLength = PinDetails("failed_pinning_no_url_content_length") - PinDetailsFailedPinningBadURLStatusCode = PinDetails("failed_pinning_bad_url_status_code") - PinDetailsFailedUnpinning = PinDetails("failed_unpinning") - PinDetailsCheckingCoherence = PinDetails("checking_coherence") - PinDetailsRescheduled = PinDetails("rescheduled") -) - -func (enum PinDetails) String() string { - if enum == "" { - // return default value if empty - return "unknown_details" - } - return string(enum) -} - -func (enum PinDetails) Values() []PinDetails { - return []PinDetails{ - "unknown_details", - "pinning_looking_for_provider", - "pinning_in_progress", - "pinning_blocks_fetched", - "pinning_fetching_url_data", - "pinned_ok", - "unpinned_ok", - "unpinning_in_progress", - "failed_contains_banned_cid", - "failed_pinning", - "failed_pinning_no_provider", - "failed_pinning_bad_cid_format", - "failed_pinning_timeout", - "failed_pinning_too_big_content", - "failed_pinning_unreachable_url", - "failed_pinning_bad_url_format", - "failed_pinning_no_url_content_length", - "failed_pinning_bad_url_status_code", - "failed_unpinning", - "checking_coherence", - "rescheduled", - } -} - -func (enum PinDetails) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *PinDetails) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = PinDetails(PinDetails(tmp).String()) - return nil -} - -type PinStatus string - -const ( - PinStatusUnknownStatus = PinStatus("unknown_status") - PinStatusQueued = PinStatus("queued") - PinStatusPinning = PinStatus("pinning") - PinStatusFailed = PinStatus("failed") - PinStatusPinned = PinStatus("pinned") -) - -func (enum PinStatus) String() string { - if enum == "" { - // return default value if empty - return "unknown_status" - } - return string(enum) -} - -func (enum PinStatus) Values() []PinStatus { - return []PinStatus{ - "unknown_status", - "queued", - "pinning", - "failed", - "pinned", - } -} - -func (enum PinStatus) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`"%s"`, enum)), nil -} - -func (enum *PinStatus) UnmarshalJSON(data []byte) error { - tmp := "" - - if err := json.Unmarshal(data, &tmp); err != nil { - return err - } - - *enum = PinStatus(PinStatus(tmp).String()) - return nil -} - -// PinCIDMeta: pin cid meta. -type PinCIDMeta struct { - ID *string `json:"id"` -} - -// PinCID: pin cid. -type PinCID struct { - Cid *string `json:"cid"` - - Name *string `json:"name"` - - Origins []string `json:"origins"` - - Meta *PinCIDMeta `json:"meta"` -} - -// PinInfo: pin info. -type PinInfo struct { - ID *string `json:"id"` - - URL *string `json:"url"` - - Size *uint64 `json:"size"` - - Progress *uint32 `json:"progress"` - - // StatusDetails: default value: unknown_details - StatusDetails PinDetails `json:"status_details"` -} - -// Name: name. -type Name struct { - NameID string `json:"name_id"` - - ProjectID string `json:"project_id"` - - CreatedAt *time.Time `json:"created_at"` - - UpdatedAt *time.Time `json:"updated_at"` - - Tags []string `json:"tags"` - - Name string `json:"name"` - - Key string `json:"key"` - - // Status: default value: unknown_status - Status NameStatus `json:"status"` - - Value string `json:"value"` - - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"region"` -} - -// Pin: pin. -type Pin struct { - PinID string `json:"pin_id"` - - // Status: default value: unknown_status - Status PinStatus `json:"status"` - - CreatedAt *time.Time `json:"created_at"` - - Cid *PinCID `json:"cid"` - - Delegates []string `json:"delegates"` - - Info *PinInfo `json:"info"` -} - -// Volume: volume. -type Volume struct { - ID string `json:"id"` - - ProjectID string `json:"project_id"` - - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"region"` - - CountPin uint64 `json:"count_pin"` - - CreatedAt *time.Time `json:"created_at"` - - UpdatedAt *time.Time `json:"updated_at"` - - Tags []string `json:"tags"` - - Name string `json:"name"` - - Size *uint64 `json:"size"` -} - -// CreatePinByCIDRequest: create pin by cid request. -type CreatePinByCIDRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // VolumeID: volume ID on which you want to pin your content. - VolumeID string `json:"volume_id"` - - // Cid: cID containing the content you want to pin. - Cid string `json:"cid"` - - // Origins: node containing the content you want to pin. - Origins []string `json:"origins"` - - // Name: pin name. - Name *string `json:"name,omitempty"` -} - -// CreatePinByURLRequest: create pin by url request. -type CreatePinByURLRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // VolumeID: volume ID on which you want to pin your content. - VolumeID string `json:"volume_id"` - - // URL: URL containing the content you want to pin. - URL string `json:"url"` - - // Name: pin name. - Name *string `json:"name,omitempty"` -} - -// CreateVolumeRequest: create volume request. -type CreateVolumeRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: project ID. - ProjectID string `json:"project_id"` - - // Name: volume name. - Name string `json:"name"` -} - -// DeletePinRequest: delete pin request. -type DeletePinRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // PinID: pin ID you want to remove from the volume. - PinID string `json:"-"` - - // VolumeID: volume ID. - VolumeID string `json:"volume_id"` -} - -// DeleteVolumeRequest: delete volume request. -type DeleteVolumeRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // VolumeID: volume ID. - VolumeID string `json:"-"` -} - -// ExportKeyNameResponse: export key name response. -type ExportKeyNameResponse struct { - NameID string `json:"name_id"` - - ProjectID string `json:"project_id"` - - CreatedAt *time.Time `json:"created_at"` - - UpdatedAt *time.Time `json:"updated_at"` - - PublicKey string `json:"public_key"` - - PrivateKey string `json:"private_key"` -} - -// GetPinRequest: get pin request. -type GetPinRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // PinID: pin ID of which you want to obtain information. - PinID string `json:"-"` - - // VolumeID: volume ID. - VolumeID string `json:"volume_id"` -} - -// GetVolumeRequest: get volume request. -type GetVolumeRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // VolumeID: volume ID. - VolumeID string `json:"-"` -} - -// IpnsAPICreateNameRequest: ipns api create name request. -type IpnsAPICreateNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: project ID. - ProjectID string `json:"project_id"` - - // Name: name for your records. - Name string `json:"name"` - - // Value: value you want to associate with your records, CID or IPNS key. - Value string `json:"value"` -} - -// IpnsAPIDeleteNameRequest: ipns api delete name request. -type IpnsAPIDeleteNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // NameID: name ID you wish to delete. - NameID string `json:"-"` -} - -// IpnsAPIExportKeyNameRequest: ipns api export key name request. -type IpnsAPIExportKeyNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // NameID: name ID whose keys you want to export. - NameID string `json:"-"` -} - -// IpnsAPIGetNameRequest: ipns api get name request. -type IpnsAPIGetNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // NameID: name ID whose information you want to retrieve. - NameID string `json:"-"` -} - -// IpnsAPIImportKeyNameRequest: ipns api import key name request. -type IpnsAPIImportKeyNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: project ID. - ProjectID string `json:"project_id"` - - // Name: name for your records. - Name string `json:"name"` - - // PrivateKey: base64 private key. - PrivateKey string `json:"private_key"` - - // Value: value you want to associate with your records, CID or IPNS key. - Value string `json:"value"` -} - -// IpnsAPIListNamesRequest: ipns api list names request. -type IpnsAPIListNamesRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: project ID. - ProjectID *string `json:"-"` - - // OrganizationID: organization ID. - OrganizationID *string `json:"-"` - - // OrderBy: sort the order of the returned names. - // Default value: created_at_asc - OrderBy ListNamesRequestOrderBy `json:"-"` - - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: maximum number of names to return per page. - PageSize *uint32 `json:"-"` -} - -// IpnsAPIUpdateNameRequest: ipns api update name request. -type IpnsAPIUpdateNameRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // NameID: name ID you wish to update. - NameID string `json:"-"` - - // Name: new name you want to associate with your record. - Name *string `json:"name,omitempty"` - - // Tags: new tags you want to associate with your record. - Tags *[]string `json:"tags,omitempty"` - - // Value: value you want to associate with your records, CID or IPNS key. - Value *string `json:"value,omitempty"` -} - -// ListNamesResponse: list names response. -type ListNamesResponse struct { - Names []*Name `json:"names"` - - TotalCount uint64 `json:"total_count"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListNamesResponse) UnsafeGetTotalCount() uint64 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListNamesResponse) UnsafeAppend(res interface{}) (uint64, error) { - results, ok := res.(*ListNamesResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Names = append(r.Names, results.Names...) - r.TotalCount += uint64(len(results.Names)) - return uint64(len(results.Names)), nil -} - -// ListPinsRequest: list pins request. -type ListPinsRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // VolumeID: volume ID of which you want to list the pins. - VolumeID string `json:"-"` - - // ProjectID: project ID. - ProjectID *string `json:"-"` - - // OrganizationID: organization ID. - OrganizationID *string `json:"-"` - - // OrderBy: sort order of the returned Volume. - // Default value: created_at_asc - OrderBy ListPinsRequestOrderBy `json:"-"` - - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: maximum number of volumes to return per page. - PageSize *uint32 `json:"-"` - - // Status: list pins by status. - // Default value: unknown_status - Status PinStatus `json:"-"` -} - -// ListPinsResponse: list pins response. -type ListPinsResponse struct { - TotalCount uint64 `json:"total_count"` - - Pins []*Pin `json:"pins"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListPinsResponse) UnsafeGetTotalCount() uint64 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListPinsResponse) UnsafeAppend(res interface{}) (uint64, error) { - results, ok := res.(*ListPinsResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Pins = append(r.Pins, results.Pins...) - r.TotalCount += uint64(len(results.Pins)) - return uint64(len(results.Pins)), nil -} - -// ListVolumesRequest: list volumes request. -type ListVolumesRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // ProjectID: project ID, only volumes belonging to this project will be listed. - ProjectID string `json:"-"` - - // OrderBy: sort the order of the returned volumes. - // Default value: created_at_asc - OrderBy ListVolumesRequestOrderBy `json:"-"` - - // Page: page number. - Page *int32 `json:"-"` - - // PageSize: maximum number of volumes to return per page. - PageSize *uint32 `json:"-"` -} - -// ListVolumesResponse: list volumes response. -type ListVolumesResponse struct { - Volumes []*Volume `json:"volumes"` - - TotalCount uint64 `json:"total_count"` -} - -// UnsafeGetTotalCount should not be used -// Internal usage only -func (r *ListVolumesResponse) UnsafeGetTotalCount() uint64 { - return r.TotalCount -} - -// UnsafeAppend should not be used -// Internal usage only -func (r *ListVolumesResponse) UnsafeAppend(res interface{}) (uint64, error) { - results, ok := res.(*ListVolumesResponse) - if !ok { - return 0, errors.New("%T type cannot be appended to type %T", res, r) - } - - r.Volumes = append(r.Volumes, results.Volumes...) - r.TotalCount += uint64(len(results.Volumes)) - return uint64(len(results.Volumes)), nil -} - -// ReplacePinRequest: replace pin request. -type ReplacePinRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // PinID: pin ID whose information you wish to replace. - PinID string `json:"-"` - - // VolumeID: volume ID. - VolumeID string `json:"volume_id"` - - // Cid: new CID you want to pin in place of the old one. - Cid string `json:"cid"` - - // Name: new name to replace. - Name *string `json:"name,omitempty"` - - // Origins: node containing the content you want to pin. - Origins []string `json:"origins"` -} - -// ReplacePinResponse: replace pin response. -type ReplacePinResponse struct { - Pin *Pin `json:"pin"` -} - -// UpdateVolumeRequest: update volume request. -type UpdateVolumeRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // VolumeID: volume ID. - VolumeID string `json:"-"` - - // Name: volume name. - Name *string `json:"name,omitempty"` - - // Tags: tags of the volume. - Tags *[]string `json:"tags,omitempty"` -} - -// IPFS Pinning service API. -type API struct { - client *scw.Client -} - -// NewAPI returns a API object from a Scaleway client. -func NewAPI(client *scw.Client) *API { - return &API{ - client: client, - } -} -func (s *API) Regions() []scw.Region { - return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} -} - -// CreateVolume: Create a new volume from a Project ID. Volume is identified by an ID and used to host pin references. -// Volume is personal (at least to your organization) even if IPFS blocks and CID are available to anyone. -// Should be the first command you made because every pin must be attached to a volume. -func (s *API) CreateVolume(req *CreateVolumeRequest, opts ...scw.RequestOption) (*Volume, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/volumes", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Volume - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetVolume: Retrieve information about a specific volume. -func (s *API) GetVolume(req *GetVolumeRequest, opts ...scw.RequestOption) (*Volume, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.VolumeID) == "" { - return nil, errors.New("field VolumeID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/volumes/" + fmt.Sprint(req.VolumeID) + "", - } - - var resp Volume - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListVolumes: Retrieve information about all volumes from a Project ID. -func (s *API) ListVolumes(req *ListVolumesRequest, opts ...scw.RequestOption) (*ListVolumesResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/volumes", - Query: query, - } - - var resp ListVolumesResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// UpdateVolume: Update volume information (tag, name...). -func (s *API) UpdateVolume(req *UpdateVolumeRequest, opts ...scw.RequestOption) (*Volume, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.VolumeID) == "" { - return nil, errors.New("field VolumeID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "PATCH", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/volumes/" + fmt.Sprint(req.VolumeID) + "", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Volume - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeleteVolume: Delete a volume by its ID and every pin attached to this volume. This process can take a while to conclude, depending on the size of your pinned content. -func (s *API) DeleteVolume(req *DeleteVolumeRequest, opts ...scw.RequestOption) error { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.VolumeID) == "" { - return errors.New("field VolumeID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/volumes/" + fmt.Sprint(req.VolumeID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// CreatePinByURL: Will fetch and store the content pointed by the provided URL. The content must be available on the public IPFS network. -// The content (IPFS blocks) will be host by the pinning service until pin deletion. -// From that point, any other IPFS peer can fetch and host your content: Make sure to pin public or encrypted content. -// Many pin requests (from different users) can target the same CID. -// A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. -func (s *API) CreatePinByURL(req *CreatePinByURLRequest, opts ...scw.RequestOption) (*Pin, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/pins/create-by-url", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Pin - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// CreatePinByCID: Will fetch and store the content pointed by the provided CID. The content must be available on the public IPFS network. -// The content (IPFS blocks) will be host by the pinning service until pin deletion. -// From that point, any other IPFS peer can fetch and host your content: Make sure to pin public or encrypted content. -// Many pin requests (from different users) can target the same CID. -// A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. -func (s *API) CreatePinByCID(req *CreatePinByCIDRequest, opts ...scw.RequestOption) (*Pin, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/pins/create-by-cid", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Pin - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ReplacePin: Deletes the given resource ID and pins the new CID in its place. -// Will fetch and store the content pointed by the provided CID. The content must be available on the public IPFS network. -// The content (IPFS blocks) is hosted by the pinning service until the pin is deleted. -// While the content is available any other IPFS peer can fetch and host your content. For this reason, we recommend that you pin either public or encrypted content. -// Several different pin requests can target the same CID. -// A pin is defined by its ID (UUID), its status (queued, pinning, pinned or failed) and target CID. -func (s *API) ReplacePin(req *ReplacePinRequest, opts ...scw.RequestOption) (*ReplacePinResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.PinID) == "" { - return nil, errors.New("field PinID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/pins/" + fmt.Sprint(req.PinID) + "/replace", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp ReplacePinResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetPin: Retrieve information about the provided **pin ID**, such as status, last modification, and CID. -func (s *API) GetPin(req *GetPinRequest, opts ...scw.RequestOption) (*Pin, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - query := url.Values{} - parameter.AddToQuery(query, "volume_id", req.VolumeID) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.PinID) == "" { - return nil, errors.New("field PinID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/pins/" + fmt.Sprint(req.PinID) + "", - Query: query, - } - - var resp Pin - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ListPins: Retrieve information about all pins within a volume. -func (s *API) ListPins(req *ListPinsRequest, opts ...scw.RequestOption) (*ListPinsResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "volume_id", req.VolumeID) - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - parameter.AddToQuery(query, "status", req.Status) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/pins", - Query: query, - } - - var resp ListPinsResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeletePin: An unpin request means that you no longer own the content. -// This content can therefore be removed and no longer provided on the IPFS network. -func (s *API) DeletePin(req *DeletePinRequest, opts ...scw.RequestOption) error { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - query := url.Values{} - parameter.AddToQuery(query, "volume_id", req.VolumeID) - - if fmt.Sprint(req.Region) == "" { - return errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.PinID) == "" { - return errors.New("field PinID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/pins/" + fmt.Sprint(req.PinID) + "", - Query: query, - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -type IpnsAPI struct { - client *scw.Client -} - -// NewIpnsAPI returns a IpnsAPI object from a Scaleway client. -func NewIpnsAPI(client *scw.Client) *IpnsAPI { - return &IpnsAPI{ - client: client, - } -} -func (s *IpnsAPI) Regions() []scw.Region { - return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} -} - -// CreateName: You can use the `ipns key` command to list and generate more names and their respective keys. -func (s *IpnsAPI) CreateName(req *IpnsAPICreateNameRequest, opts ...scw.RequestOption) (*Name, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/names", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Name - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// GetName: Retrieve information about a specific name. -func (s *IpnsAPI) GetName(req *IpnsAPIGetNameRequest, opts ...scw.RequestOption) (*Name, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.NameID) == "" { - return nil, errors.New("field NameID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/names/" + fmt.Sprint(req.NameID) + "", - } - - var resp Name - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// DeleteName: Delete a name by its ID. -func (s *IpnsAPI) DeleteName(req *IpnsAPIDeleteNameRequest, opts ...scw.RequestOption) error { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.NameID) == "" { - return errors.New("field NameID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "DELETE", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/names/" + fmt.Sprint(req.NameID) + "", - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - -// ListNames: Retrieve information about all names from a Project ID. -func (s *IpnsAPI) ListNames(req *IpnsAPIListNamesRequest, opts ...scw.RequestOption) (*ListNamesResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultPageSize, exist := s.client.GetDefaultPageSize() - if (req.PageSize == nil || *req.PageSize == 0) && exist { - req.PageSize = &defaultPageSize - } - - query := url.Values{} - parameter.AddToQuery(query, "project_id", req.ProjectID) - parameter.AddToQuery(query, "organization_id", req.OrganizationID) - parameter.AddToQuery(query, "order_by", req.OrderBy) - parameter.AddToQuery(query, "page", req.Page) - parameter.AddToQuery(query, "page_size", req.PageSize) - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/names", - Query: query, - } - - var resp ListNamesResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// UpdateName: Update name information (CID, tag, name...). -func (s *IpnsAPI) UpdateName(req *IpnsAPIUpdateNameRequest, opts ...scw.RequestOption) (*Name, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.NameID) == "" { - return nil, errors.New("field NameID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "PATCH", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/names/" + fmt.Sprint(req.NameID) + "", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Name - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ExportKeyName: Export a private key by its ID. -func (s *IpnsAPI) ExportKeyName(req *IpnsAPIExportKeyNameRequest, opts ...scw.RequestOption) (*ExportKeyNameResponse, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - if fmt.Sprint(req.NameID) == "" { - return nil, errors.New("field NameID cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "GET", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/names/" + fmt.Sprint(req.NameID) + "/export-key", - } - - var resp ExportKeyNameResponse - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} - -// ImportKeyName: Import a private key. -func (s *IpnsAPI) ImportKeyName(req *IpnsAPIImportKeyNameRequest, opts ...scw.RequestOption) (*Name, error) { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - if req.ProjectID == "" { - defaultProjectID, _ := s.client.GetDefaultProjectID() - req.ProjectID = defaultProjectID - } - - if fmt.Sprint(req.Region) == "" { - return nil, errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/ipfs/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/names/import-key", - } - - err = scwReq.SetBody(req) - if err != nil { - return nil, err - } - - var resp Name - - err = s.client.Do(scwReq, &resp, opts...) - if err != nil { - return nil, err - } - return &resp, nil -} From 87e7668b445f68241b63506b2df134f4a13dfd4e Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 29 Nov 2024 10:38:23 +0100 Subject: [PATCH 096/163] feat(edge_services): fix plan_cost description (#2335) --- api/edge_services/v1alpha1/edge_services_sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index 2edd0ba85..122b1ddca 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -1219,7 +1219,7 @@ type GetBillingResponse struct { // CurrentPlan: information on the currently-selected, active Edge Services subscription plan. CurrentPlan *PlanDetails `json:"current_plan"` - // PlanCost: price of the current subscription plan. + // PlanCost: cost to date (this month) for Edge Service subscription plans. This comprises the pro-rata cost of the current subscription plan, and any previous subscription plans that were active earlier in the month. PlanCost *scw.Money `json:"plan_cost"` // PipelineNumber: total number of pipelines currently configured. From 023aa8142bc12f01257c405daed23998d2c7b1fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jules=20Cast=C3=A9ran?= Date: Fri, 29 Nov 2024 10:45:24 +0100 Subject: [PATCH 097/163] feat(block): allow waiting for specific snapshot status (#2334) --- api/block/v1alpha1/snapshot_utils.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/api/block/v1alpha1/snapshot_utils.go b/api/block/v1alpha1/snapshot_utils.go index d91b5c798..11803e310 100644 --- a/api/block/v1alpha1/snapshot_utils.go +++ b/api/block/v1alpha1/snapshot_utils.go @@ -14,6 +14,11 @@ type WaitForSnapshotRequest struct { Zone scw.Zone Timeout *time.Duration RetryInterval *time.Duration + + // If set, will wait until this specific status has been reached or the + // snapshot has an error status. This is useful when we need to wait for + // the snapshot to transition from "in_use" to "available". + TerminalStatus *SnapshotStatus } // WaitForSnapshot wait for the snapshot to be in a "terminal state" before returning. @@ -28,11 +33,16 @@ func (s *API) WaitForSnapshot(req *WaitForSnapshotRequest, opts ...scw.RequestOp } terminalStatus := map[SnapshotStatus]struct{}{ - SnapshotStatusAvailable: {}, - SnapshotStatusInUse: {}, - SnapshotStatusError: {}, - SnapshotStatusLocked: {}, - SnapshotStatusDeleted: {}, + SnapshotStatusError: {}, + SnapshotStatusLocked: {}, + SnapshotStatusDeleted: {}, + } + + if req.TerminalStatus != nil { + terminalStatus[*req.TerminalStatus] = struct{}{} + } else { + terminalStatus[SnapshotStatusAvailable] = struct{}{} + terminalStatus[SnapshotStatusInUse] = struct{}{} } snapshot, err := async.WaitSync(&async.WaitSyncConfig{ From ade887d56d41a0ef45646a9e65bc4868f2e8163a Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 29 Nov 2024 11:33:08 +0100 Subject: [PATCH 098/163] feat(billing): update ListDiscount order_by to accept start_date and expiration_date (#2336) --- api/billing/v2beta1/billing_sdk.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/api/billing/v2beta1/billing_sdk.go b/api/billing/v2beta1/billing_sdk.go index 29551b3e7..d6727ce13 100644 --- a/api/billing/v2beta1/billing_sdk.go +++ b/api/billing/v2beta1/billing_sdk.go @@ -360,6 +360,14 @@ const ( ListDiscountsRequestOrderByCreationDateDesc = ListDiscountsRequestOrderBy("creation_date_desc") // Order discounts by creation date (ascending chronological order). ListDiscountsRequestOrderByCreationDateAsc = ListDiscountsRequestOrderBy("creation_date_asc") + // Order discounts by start date (descending chronological order). + ListDiscountsRequestOrderByStartDateDesc = ListDiscountsRequestOrderBy("start_date_desc") + // Order discounts by start date (ascending chronological order). + ListDiscountsRequestOrderByStartDateAsc = ListDiscountsRequestOrderBy("start_date_asc") + // Order discounts by stop date (descending chronological order). + ListDiscountsRequestOrderByStopDateDesc = ListDiscountsRequestOrderBy("stop_date_desc") + // Order discounts by stop date (ascending chronological order). + ListDiscountsRequestOrderByStopDateAsc = ListDiscountsRequestOrderBy("stop_date_asc") ) func (enum ListDiscountsRequestOrderBy) String() string { @@ -374,6 +382,10 @@ func (enum ListDiscountsRequestOrderBy) Values() []ListDiscountsRequestOrderBy { return []ListDiscountsRequestOrderBy{ "creation_date_desc", "creation_date_asc", + "start_date_desc", + "start_date_asc", + "stop_date_desc", + "stop_date_asc", } } From 8d738b4a8976fe188d8867111a3f5522e345aeaa Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 29 Nov 2024 11:33:25 +0100 Subject: [PATCH 099/163] feat(instance): create CheckQuotasOrganizationBlockMigration endpoint (#2337) --- api/instance/v1/instance_sdk.go | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index ba4917631..aecc228e8 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -2108,6 +2108,14 @@ type AttachServerVolumeResponse struct { Server *Server `json:"server"` } +// CheckBlockMigrationOrganizationQuotasRequest: check block migration organization quotas request. +type CheckBlockMigrationOrganizationQuotasRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + Organization string `json:"organization,omitempty"` +} + // CreateIPRequest: create ip request. type CreateIPRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -6641,3 +6649,38 @@ func (s *API) ApplyBlockMigration(req *ApplyBlockMigrationRequest, opts ...scw.R } return nil } + +// CheckBlockMigrationOrganizationQuotas: +func (s *API) CheckBlockMigrationOrganizationQuotas(req *CheckBlockMigrationOrganizationQuotasRequest, opts ...scw.RequestOption) error { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if req.Organization == "" { + defaultOrganization, _ := s.client.GetDefaultOrganizationID() + req.Organization = defaultOrganization + } + + if fmt.Sprint(req.Zone) == "" { + return errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/instance/v1/zones/" + fmt.Sprint(req.Zone) + "/block-migration/check-organization-quotas", + } + + err = scwReq.SetBody(req) + if err != nil { + return err + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From 76fccaad82168826d3e0a7c554ddaa1ab506cf81 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 29 Nov 2024 11:35:44 +0100 Subject: [PATCH 100/163] feat(audit_trail): enable v1alpha1 (#2338) Co-authored-by: Yacine Fodil <105779815+yfodil@users.noreply.github.com> --- api/audit_trail/v1alpha1/audit_trail_sdk.go | 398 ++++++++++++++++++++ api/domain/v2beta1/domain_sdk.go | 2 +- 2 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 api/audit_trail/v1alpha1/audit_trail_sdk.go diff --git a/api/audit_trail/v1alpha1/audit_trail_sdk.go b/api/audit_trail/v1alpha1/audit_trail_sdk.go new file mode 100644 index 000000000..a6ddb3c95 --- /dev/null +++ b/api/audit_trail/v1alpha1/audit_trail_sdk.go @@ -0,0 +1,398 @@ +// This file was automatically generated. DO NOT EDIT. +// If you have any remark or suggestion do not hesitate to open an issue. + +// Package audit_trail provides methods and message types of the audit_trail v1alpha1 API. +package audit_trail + +import ( + "bytes" + "encoding/json" + "fmt" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/scaleway/scaleway-sdk-go/errors" + "github.com/scaleway/scaleway-sdk-go/marshaler" + "github.com/scaleway/scaleway-sdk-go/namegenerator" + "github.com/scaleway/scaleway-sdk-go/parameter" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +// always import dependencies +var ( + _ fmt.Stringer + _ json.Unmarshaler + _ url.URL + _ net.IP + _ http.Header + _ bytes.Reader + _ time.Time + _ = strings.Join + + _ scw.ScalewayRequest + _ marshaler.Duration + _ scw.File + _ = parameter.AddToQuery + _ = namegenerator.GetRandomName +) + +type ListEventsRequestOrderBy string + +const ( + ListEventsRequestOrderByRecordedAtDesc = ListEventsRequestOrderBy("recorded_at_desc") + ListEventsRequestOrderByRecordedAtAsc = ListEventsRequestOrderBy("recorded_at_asc") +) + +func (enum ListEventsRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "recorded_at_desc" + } + return string(enum) +} + +func (enum ListEventsRequestOrderBy) Values() []ListEventsRequestOrderBy { + return []ListEventsRequestOrderBy{ + "recorded_at_desc", + "recorded_at_asc", + } +} + +func (enum ListEventsRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListEventsRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListEventsRequestOrderBy(ListEventsRequestOrderBy(tmp).String()) + return nil +} + +type ResourceType string + +const ( + ResourceTypeUnknownType = ResourceType("unknown_type") + ResourceTypeSecmSecret = ResourceType("secm_secret") + ResourceTypeSecmSecretVersion = ResourceType("secm_secret_version") + ResourceTypeKubeCluster = ResourceType("kube_cluster") + ResourceTypeKubePool = ResourceType("kube_pool") + ResourceTypeKubeNode = ResourceType("kube_node") +) + +func (enum ResourceType) String() string { + if enum == "" { + // return default value if empty + return "unknown_type" + } + return string(enum) +} + +func (enum ResourceType) Values() []ResourceType { + return []ResourceType{ + "unknown_type", + "secm_secret", + "secm_secret_version", + "kube_cluster", + "kube_pool", + "kube_node", + } +} + +func (enum ResourceType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ResourceType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ResourceType(ResourceType(tmp).String()) + return nil +} + +// KubernetesClusterInfo: kubernetes cluster info. +type KubernetesClusterInfo struct { +} + +// KubernetesNodeInfo: kubernetes node info. +type KubernetesNodeInfo struct { + ID string `json:"id"` + + Name string `json:"name"` +} + +// KubernetesPoolInfo: kubernetes pool info. +type KubernetesPoolInfo struct { + ID string `json:"id"` + + Name string `json:"name"` +} + +// SecretManagerSecretInfo: secret manager secret info. +type SecretManagerSecretInfo struct { + Path string `json:"path"` +} + +// SecretManagerSecretVersionInfo: secret manager secret version info. +type SecretManagerSecretVersionInfo struct { + Revision uint32 `json:"revision"` +} + +// EventPrincipal: event principal. +type EventPrincipal struct { + ID string `json:"id"` +} + +// Resource: resource. +type Resource struct { + ID string `json:"id"` + + // Type: default value: unknown_type + Type ResourceType `json:"type"` + + CreatedAt *time.Time `json:"created_at"` + + UpdatedAt *time.Time `json:"updated_at"` + + DeletedAt *time.Time `json:"deleted_at"` + + Name *string `json:"name"` + + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + SecmSecretInfo *SecretManagerSecretInfo `json:"secm_secret_info,omitempty"` + + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + SecmSecretVersionInfo *SecretManagerSecretVersionInfo `json:"secm_secret_version_info,omitempty"` + + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + KubeClusterInfo *KubernetesClusterInfo `json:"kube_cluster_info,omitempty"` + + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + KubePoolInfo *KubernetesPoolInfo `json:"kube_pool_info,omitempty"` + + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + KubeNodeInfo *KubernetesNodeInfo `json:"kube_node_info,omitempty"` +} + +// Event: event. +type Event struct { + ID string `json:"id"` + + RecordedAt *time.Time `json:"recorded_at"` + + Locality string `json:"locality"` + + Principal *EventPrincipal `json:"principal"` + + OrganizationID string `json:"organization_id"` + + ProjectID *string `json:"project_id"` + + SourceIP net.IP `json:"source_ip"` + + UserAgent *string `json:"user_agent"` + + ProductName string `json:"product_name"` + + ServiceName string `json:"service_name"` + + MethodName string `json:"method_name"` + + Resource *Resource `json:"resource"` + + RequestID string `json:"request_id"` + + RequestBody *scw.JSONObject `json:"request_body"` + + StatusCode uint32 `json:"status_code"` +} + +// Product: product. +type Product struct { + Title string `json:"title"` + + Name string `json:"name"` +} + +// ListEventsRequest: list events request. +type ListEventsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ProjectID: (Optional) ID of the Project containing the Audit Trail events. + ProjectID *string `json:"-"` + + // OrganizationID: ID of the Organization containing the Audit Trail events. + OrganizationID string `json:"-"` + + // ResourceType: (Optional) Returns a paginated list of Scaleway resources' features. + // Default value: unknown_type + ResourceType ResourceType `json:"-"` + + // MethodName: (Optional) Name of the method or the API call performed. + MethodName *string `json:"-"` + + // Status: (Optional) HTTP status code of the request. Returns either `200` if the request was successful or `403` if the permission was denied. + Status *uint32 `json:"-"` + + // RecordedAfter: (Optional) The `recorded_after` parameter defines the earliest timestamp from which Audit Trail events are retrieved. Returns `one hour ago` by default. + RecordedAfter *time.Time `json:"-"` + + // RecordedBefore: (Optional) The `recorded_before` parameter defines the latest timestamp up to which Audit Trail events are retrieved. Returns `now` by default. + RecordedBefore *time.Time `json:"-"` + + // OrderBy: default value: recorded_at_desc + OrderBy ListEventsRequestOrderBy `json:"-"` + + PageSize *uint32 `json:"-"` + + PageToken *string `json:"-"` + + // ProductName: (Optional) Name of the Scaleway resource in a hyphenated format. + ProductName *string `json:"-"` +} + +// ListEventsResponse: list events response. +type ListEventsResponse struct { + // Events: single page of events matching the requested criteria. + Events []*Event `json:"events"` + + // NextPageToken: page token to use in following calls to keep listing. + NextPageToken *string `json:"next_page_token"` +} + +// ListProductsRequest: list products request. +type ListProductsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` +} + +// ListProductsResponse: list products response. +type ListProductsResponse struct { + Products []*Product `json:"products"` + + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListProductsResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListProductsResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListProductsResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Products = append(r.Products, results.Products...) + r.TotalCount += uint64(len(results.Products)) + return uint64(len(results.Products)), nil +} + +// This API allows you to ensure accountability and security by recording events and changes performed within your Scaleway Organization. +type API struct { + client *scw.Client +} + +// NewAPI returns a API object from a Scaleway client. +func NewAPI(client *scw.Client) *API { + return &API{ + client: client, + } +} +func (s *API) Regions() []scw.Region { + return []scw.Region{scw.RegionFrPar, scw.RegionNlAms} +} + +// ListEvents: Retrieve the list of Audit Trail events for a Scaleway Organization and/or Project. You must specify the `organization_id` and optionally, the `project_id`. +func (s *API) ListEvents(req *ListEventsRequest, opts ...scw.RequestOption) (*ListEventsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if req.OrganizationID == "" { + defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() + req.OrganizationID = defaultOrganizationID + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "resource_type", req.ResourceType) + parameter.AddToQuery(query, "method_name", req.MethodName) + parameter.AddToQuery(query, "status", req.Status) + parameter.AddToQuery(query, "recorded_after", req.RecordedAfter) + parameter.AddToQuery(query, "recorded_before", req.RecordedBefore) + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "page_token", req.PageToken) + parameter.AddToQuery(query, "product_name", req.ProductName) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/audit-trail/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/events", + Query: query, + } + + var resp ListEventsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListProducts: Retrieve the list of Scaleway resources for which you have Audit Trail events. +func (s *API) ListProducts(req *ListProductsRequest, opts ...scw.RequestOption) (*ListProductsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/audit-trail/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/products", + } + + var resp ListProductsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/domain/v2beta1/domain_sdk.go b/api/domain/v2beta1/domain_sdk.go index 0ac2dac5b..9494be43e 100644 --- a/api/domain/v2beta1/domain_sdk.go +++ b/api/domain/v2beta1/domain_sdk.go @@ -14,12 +14,12 @@ import ( "strings" "time" + std "github.com/scaleway/scaleway-sdk-go/api/std" "github.com/scaleway/scaleway-sdk-go/errors" "github.com/scaleway/scaleway-sdk-go/marshaler" "github.com/scaleway/scaleway-sdk-go/namegenerator" "github.com/scaleway/scaleway-sdk-go/parameter" "github.com/scaleway/scaleway-sdk-go/scw" - std "github.com/scaleway/scaleway-sdk-go/api/std" ) // always import dependencies From 40eaf67c11d6b29b62c8177465b1596b0ca57c48 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 29 Nov 2024 17:02:37 +0100 Subject: [PATCH 101/163] feat(audit_trail): add Kubernetes ACL resource (#2339) --- api/audit_trail/v1alpha1/audit_trail_sdk.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/api/audit_trail/v1alpha1/audit_trail_sdk.go b/api/audit_trail/v1alpha1/audit_trail_sdk.go index a6ddb3c95..98fb697c7 100644 --- a/api/audit_trail/v1alpha1/audit_trail_sdk.go +++ b/api/audit_trail/v1alpha1/audit_trail_sdk.go @@ -85,6 +85,7 @@ const ( ResourceTypeKubeCluster = ResourceType("kube_cluster") ResourceTypeKubePool = ResourceType("kube_pool") ResourceTypeKubeNode = ResourceType("kube_node") + ResourceTypeKubeACL = ResourceType("kube_acl") ) func (enum ResourceType) String() string { @@ -103,6 +104,7 @@ func (enum ResourceType) Values() []ResourceType { "kube_cluster", "kube_pool", "kube_node", + "kube_acl", } } @@ -121,6 +123,10 @@ func (enum *ResourceType) UnmarshalJSON(data []byte) error { return nil } +// KubernetesACLInfo: kubernetes acl info. +type KubernetesACLInfo struct { +} + // KubernetesClusterInfo: kubernetes cluster info. type KubernetesClusterInfo struct { } @@ -169,20 +175,23 @@ type Resource struct { Name *string `json:"name"` - // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo, KubeACLInfo must be set. SecmSecretInfo *SecretManagerSecretInfo `json:"secm_secret_info,omitempty"` - // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo, KubeACLInfo must be set. SecmSecretVersionInfo *SecretManagerSecretVersionInfo `json:"secm_secret_version_info,omitempty"` - // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo, KubeACLInfo must be set. KubeClusterInfo *KubernetesClusterInfo `json:"kube_cluster_info,omitempty"` - // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo, KubeACLInfo must be set. KubePoolInfo *KubernetesPoolInfo `json:"kube_pool_info,omitempty"` - // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo must be set. + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo, KubeACLInfo must be set. KubeNodeInfo *KubernetesNodeInfo `json:"kube_node_info,omitempty"` + + // Precisely one of SecmSecretInfo, SecmSecretVersionInfo, KubeClusterInfo, KubePoolInfo, KubeNodeInfo, KubeACLInfo must be set. + KubeACLInfo *KubernetesACLInfo `json:"kube_acl_info,omitempty"` } // Event: event. From eced26f4687ee07e8e5073f63d6bb31f5c968de9 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 3 Dec 2024 14:30:10 +0100 Subject: [PATCH 102/163] fix: define openapi groups for audit trail (#2340) --- api/audit_trail/v1alpha1/audit_trail_sdk.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/api/audit_trail/v1alpha1/audit_trail_sdk.go b/api/audit_trail/v1alpha1/audit_trail_sdk.go index 98fb697c7..e0bbc3ae1 100644 --- a/api/audit_trail/v1alpha1/audit_trail_sdk.go +++ b/api/audit_trail/v1alpha1/audit_trail_sdk.go @@ -196,41 +196,58 @@ type Resource struct { // Event: event. type Event struct { + // ID: ID of the event. ID string `json:"id"` + // RecordedAt: timestamp of the event. RecordedAt *time.Time `json:"recorded_at"` + // Locality: locality of the resource attached to the event. Locality string `json:"locality"` + // Principal: user or IAM application at the origin of the event. Principal *EventPrincipal `json:"principal"` + // OrganizationID: organization ID containing the event. OrganizationID string `json:"organization_id"` + // ProjectID: (Optional) Project of the resource attached to the event. ProjectID *string `json:"project_id"` + // SourceIP: IP address at the origin of the event. SourceIP net.IP `json:"source_ip"` + // UserAgent: user Agent at the origin of the event. UserAgent *string `json:"user_agent"` + // ProductName: product name of the resource attached to the event. ProductName string `json:"product_name"` + // ServiceName: API name called to trigger the event. ServiceName string `json:"service_name"` + // MethodName: API method called to trigger the event. MethodName string `json:"method_name"` + // Resource: resource attached to the event. Resource *Resource `json:"resource"` + // RequestID: unique identifier of the request at the origin of the event. RequestID string `json:"request_id"` + // RequestBody: request at the origin of the event. RequestBody *scw.JSONObject `json:"request_body"` + // StatusCode: HTTP status code resulting of the API call. StatusCode uint32 `json:"status_code"` } // Product: product. type Product struct { + // Title: product title. Title string `json:"title"` + // Name: product name. Name string `json:"name"` } @@ -289,8 +306,10 @@ type ListProductsRequest struct { // ListProductsResponse: list products response. type ListProductsResponse struct { + // Products: list of all products integrated with Audit Trail. Products []*Product `json:"products"` + // TotalCount: number of integrated products. TotalCount uint64 `json:"total_count"` } From 92def899c316f6c3d5d306272abd1039f638d6d6 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 3 Dec 2024 16:48:45 +0100 Subject: [PATCH 103/163] feat(ipam): add support for resource_id filtering in ListIPsRequest (#2341) --- api/ipam/v1/ipam_sdk.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/ipam/v1/ipam_sdk.go b/api/ipam/v1/ipam_sdk.go index 3ad408cd9..cbf34b722 100644 --- a/api/ipam/v1/ipam_sdk.go +++ b/api/ipam/v1/ipam_sdk.go @@ -339,6 +339,9 @@ type ListIPsRequest struct { // ResourceID: resource ID to filter for. Only IPs attached to this resource will be returned. ResourceID *string `json:"-"` + // ResourceIDs: resource IDs to filter for. Only IPs attached to at least one of these resources will be returned. + ResourceIDs []string `json:"-"` + // ResourceType: resource type to filter for. Only IPs attached to this type of resource will be returned. // Default value: unknown_type ResourceType ResourceType `json:"-"` @@ -640,6 +643,7 @@ func (s *API) ListIPs(req *ListIPsRequest, opts ...scw.RequestOption) (*ListIPsR parameter.AddToQuery(query, "vpc_id", req.VpcID) parameter.AddToQuery(query, "attached", req.Attached) parameter.AddToQuery(query, "resource_id", req.ResourceID) + parameter.AddToQuery(query, "resource_ids", req.ResourceIDs) parameter.AddToQuery(query, "resource_type", req.ResourceType) parameter.AddToQuery(query, "mac_address", req.MacAddress) parameter.AddToQuery(query, "tags", req.Tags) From 6e1399167b4e0a7e56fe7fb2a5b8223541cea3ce Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 3 Dec 2024 16:49:10 +0100 Subject: [PATCH 104/163] feat(webhosting): add created at field in hosting summary (#2342) --- api/webhosting/v1/webhosting_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index d8d82ea57..9d8f8656a 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -636,6 +636,9 @@ type HostingSummary struct { // ProjectID: ID of the Scaleway Project the Web Hosting plan belongs to. ProjectID string `json:"project_id"` + // CreatedAt: date on which the Web Hosting plan was created. + CreatedAt *time.Time `json:"created_at"` + // UpdatedAt: date on which the Web Hosting plan was last updated. UpdatedAt *time.Time `json:"updated_at"` From dcee497d0883bed06eb534906f232c7bba32d630 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:29:38 +0100 Subject: [PATCH 105/163] chore(deps): bump golang.org/x/text from 0.20.0 to 0.21.0 (#2344) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index a6c2e72a5..47ca6c8e7 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,6 @@ go 1.17 require ( github.com/dnaeon/go-vcr v1.2.0 - golang.org/x/text v0.20.0 + golang.org/x/text v0.21.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 8a741aeb8..febc11cbc 100644 --- a/go.sum +++ b/go.sum @@ -27,7 +27,7 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -54,8 +54,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= -golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= From 1e60263d7dd0dbb011f4e2315cfbcb4f1e2f2fc0 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 5 Dec 2024 11:12:49 +0100 Subject: [PATCH 106/163] feat(mnq): allow filtering nats credentials listing by project id (#2343) Co-authored-by: Laure-di <62625835+Laure-di@users.noreply.github.com> --- api/mnq/v1beta1/mnq_sdk.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/mnq/v1beta1/mnq_sdk.go b/api/mnq/v1beta1/mnq_sdk.go index 3a677b782..039f25108 100644 --- a/api/mnq/v1beta1/mnq_sdk.go +++ b/api/mnq/v1beta1/mnq_sdk.go @@ -670,6 +670,9 @@ type NatsAPIListNatsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` + // ProjectID: include only NATS accounts in this Project. + ProjectID *string `json:"-"` + // NatsAccountID: include only credentials for this NATS account. NatsAccountID *string `json:"-"` @@ -1230,6 +1233,7 @@ func (s *NatsAPI) ListNatsCredentials(req *NatsAPIListNatsCredentialsRequest, op } query := url.Values{} + parameter.AddToQuery(query, "project_id", req.ProjectID) parameter.AddToQuery(query, "nats_account_id", req.NatsAccountID) parameter.AddToQuery(query, "page", req.Page) parameter.AddToQuery(query, "page_size", req.PageSize) From fc15bacdbfe056cca68a4fd782e1e927ed7a645a Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 9 Dec 2024 09:58:27 +0100 Subject: [PATCH 107/163] docs(mnq): follow the renaming of the product on the current API (#2345) --- api/mnq/v1beta1/mnq_sdk.go | 96 +++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/api/mnq/v1beta1/mnq_sdk.go b/api/mnq/v1beta1/mnq_sdk.go index 039f25108..4137871ea 100644 --- a/api/mnq/v1beta1/mnq_sdk.go +++ b/api/mnq/v1beta1/mnq_sdk.go @@ -338,25 +338,25 @@ type File struct { // SnsPermissions: sns permissions. type SnsPermissions struct { - // CanPublish: defines whether the credentials bearer can publish messages to the service (publish to SNS topics). + // CanPublish: defines whether the credentials bearer can publish messages to the service (publish to Topics and Events topics). CanPublish *bool `json:"can_publish"` // CanReceive: defines whether the credentials bearer can receive messages from the service (configure subscriptions). CanReceive *bool `json:"can_receive"` - // CanManage: defines whether the credentials bearer can manage the associated SNS topics or subscriptions. + // CanManage: defines whether the credentials bearer can manage the associated Topics and Events topics or subscriptions. CanManage *bool `json:"can_manage"` } // SqsPermissions: sqs permissions. type SqsPermissions struct { - // CanPublish: defines whether the credentials bearer can publish messages to the service (send messages to SQS queues). + // CanPublish: defines whether the credentials bearer can publish messages to the service (send messages to Queues queues). CanPublish *bool `json:"can_publish"` - // CanReceive: defines whether the credentials bearer can receive messages from SQS queues. + // CanReceive: defines whether the credentials bearer can receive messages from Queues queues. CanReceive *bool `json:"can_receive"` - // CanManage: defines whether the credentials bearer can manage the associated SQS queues. + // CanManage: defines whether the credentials bearer can manage the associated Queues queues. CanManage *bool `json:"can_manage"` } @@ -431,7 +431,7 @@ type SnsCredentials struct { // AccessKey: access key ID. AccessKey string `json:"access_key"` - // SecretKey: secret key ID (Only returned by **Create SNS Credentials** call). + // SecretKey: secret key ID (Only returned by **Create Topics and Events Credentials** call). SecretKey string `json:"secret_key"` // SecretChecksum: checksum of the Secret key. @@ -464,7 +464,7 @@ type SqsCredentials struct { // AccessKey: access key ID. AccessKey string `json:"access_key"` - // SecretKey: secret key ID (Only returned by **Create SQS Credentials** call). + // SecretKey: secret key ID (Only returned by **Create Queues Credentials** call). SecretKey string `json:"secret_key"` // SecretChecksum: checksum of the Secret key. @@ -535,7 +535,7 @@ type ListSnsCredentialsResponse struct { // TotalCount: total count of existing credentials (matching any filters specified). TotalCount uint64 `json:"total_count"` - // SnsCredentials: sNS credentials on this page. + // SnsCredentials: topics and Events credentials on this page. SnsCredentials []*SnsCredentials `json:"sns_credentials"` } @@ -563,7 +563,7 @@ type ListSqsCredentialsResponse struct { // TotalCount: total count of existing credentials (matching any filters specified). TotalCount uint64 `json:"total_count"` - // SqsCredentials: sQS credentials on this page. + // SqsCredentials: queues credentials on this page. SqsCredentials []*SqsCredentials `json:"sqs_credentials"` } @@ -704,7 +704,7 @@ type SnsAPIActivateSnsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project on which to activate the SNS service. + // ProjectID: project on which to activate the Topics and Events service. ProjectID string `json:"project_id"` } @@ -713,7 +713,7 @@ type SnsAPICreateSnsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project containing the SNS credentials. + // ProjectID: project containing the Topics and Events credentials. ProjectID string `json:"project_id"` // Name: name of the credentials. @@ -728,7 +728,7 @@ type SnsAPIDeactivateSnsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project on which to deactivate the SNS service. + // ProjectID: project on which to deactivate the Topics and Events service. ProjectID string `json:"project_id"` } @@ -746,7 +746,7 @@ type SnsAPIGetSnsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // SnsCredentialsID: ID of the SNS credentials to get. + // SnsCredentialsID: ID of the Topics and Events credentials to get. SnsCredentialsID string `json:"-"` } @@ -755,7 +755,7 @@ type SnsAPIGetSnsInfoRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project to retrieve SNS info from. + // ProjectID: project to retrieve Topics and Events info from. ProjectID string `json:"project_id"` } @@ -764,7 +764,7 @@ type SnsAPIListSnsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: include only SNS credentials in this Project. + // ProjectID: include only Topics and Events credentials in this Project. ProjectID *string `json:"-"` // Page: page number to return. @@ -783,7 +783,7 @@ type SnsAPIUpdateSnsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // SnsCredentialsID: ID of the SNS credentials to update. + // SnsCredentialsID: ID of the Topics and Events credentials to update. SnsCredentialsID string `json:"-"` // Name: name of the credentials. @@ -801,17 +801,17 @@ type SnsInfo struct { // Region: region of the service. Region scw.Region `json:"region"` - // CreatedAt: sNS creation date. + // CreatedAt: topics and Events creation date. CreatedAt *time.Time `json:"created_at"` - // UpdatedAt: sNS last modification date. + // UpdatedAt: topics and Events last modification date. UpdatedAt *time.Time `json:"updated_at"` - // Status: sNS activation status. + // Status: topics and Events activation status. // Default value: unknown_status Status SnsInfoStatus `json:"status"` - // SnsEndpointURL: endpoint of the SNS service for this region and project. + // SnsEndpointURL: endpoint of the Topics and Events service for this region and project. SnsEndpointURL string `json:"sns_endpoint_url"` } @@ -820,7 +820,7 @@ type SqsAPIActivateSqsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project on which to activate the SQS service. + // ProjectID: project on which to activate the Queues service. ProjectID string `json:"project_id"` } @@ -829,7 +829,7 @@ type SqsAPICreateSqsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project containing the SQS credentials. + // ProjectID: project containing the Queues credentials. ProjectID string `json:"project_id"` // Name: name of the credentials. @@ -844,7 +844,7 @@ type SqsAPIDeactivateSqsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project on which to deactivate the SQS service. + // ProjectID: project on which to deactivate the Queues service. ProjectID string `json:"project_id"` } @@ -862,7 +862,7 @@ type SqsAPIGetSqsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // SqsCredentialsID: ID of the SQS credentials to get. + // SqsCredentialsID: ID of the Queues credentials to get. SqsCredentialsID string `json:"-"` } @@ -871,7 +871,7 @@ type SqsAPIGetSqsInfoRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: project to retrieve SQS info from. + // ProjectID: project to retrieve Queues info from. ProjectID string `json:"project_id"` } @@ -880,7 +880,7 @@ type SqsAPIListSqsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // ProjectID: include only SQS credentials in this Project. + // ProjectID: include only Queues credentials in this Project. ProjectID *string `json:"-"` // Page: page number to return. @@ -899,7 +899,7 @@ type SqsAPIUpdateSqsCredentialsRequest struct { // Region: region to target. If none is passed will use default region from the config. Region scw.Region `json:"-"` - // SqsCredentialsID: ID of the SQS credentials to update. + // SqsCredentialsID: ID of the Queues credentials to update. SqsCredentialsID string `json:"-"` // Name: name of the credentials. @@ -917,21 +917,21 @@ type SqsInfo struct { // Region: region of the service. Region scw.Region `json:"region"` - // CreatedAt: sQS creation date. + // CreatedAt: queues creation date. CreatedAt *time.Time `json:"created_at"` - // UpdatedAt: sQS last modification date. + // UpdatedAt: queues last modification date. UpdatedAt *time.Time `json:"updated_at"` - // Status: sQS activation status. + // Status: queues activation status. // Default value: unknown_status Status SqsInfoStatus `json:"status"` - // SqsEndpointURL: endpoint of the SQS service for this region and project. + // SqsEndpointURL: endpoint of the Queues service for this region and project. SqsEndpointURL string `json:"sqs_endpoint_url"` } -// This API allows you to manage Scaleway Messaging and Queuing NATS accounts. +// This API allows you to manage Scaleway NATS accounts. type NatsAPI struct { client *scw.Client } @@ -1258,7 +1258,7 @@ func (s *NatsAPI) ListNatsCredentials(req *NatsAPIListNatsCredentialsRequest, op return &resp, nil } -// This API allows you to manage your Scaleway Messaging and Queuing SNS brokers. +// This API allows you to manage your Scaleway Topics and Events. type SnsAPI struct { client *scw.Client } @@ -1273,7 +1273,7 @@ func (s *SnsAPI) Regions() []scw.Region { return []scw.Region{scw.RegionFrPar, scw.RegionNlAms} } -// ActivateSns: Activate SNS for the specified Project ID. SNS must be activated before any usage. Activating SNS does not trigger any billing, and you can deactivate at any time. +// ActivateSns: Activate Topics and Events for the specified Project ID. Topics and Events must be activated before any usage. Activating Topics and Events does not trigger any billing, and you can deactivate at any time. func (s *SnsAPI) ActivateSns(req *SnsAPIActivateSnsRequest, opts ...scw.RequestOption) (*SnsInfo, error) { var err error @@ -1310,7 +1310,7 @@ func (s *SnsAPI) ActivateSns(req *SnsAPIActivateSnsRequest, opts ...scw.RequestO return &resp, nil } -// GetSnsInfo: Retrieve the SNS information of the specified Project ID. Informations include the activation status and the SNS API endpoint URL. +// GetSnsInfo: Retrieve the Topics and Events information of the specified Project ID. Informations include the activation status and the Topics and Events API endpoint URL. func (s *SnsAPI) GetSnsInfo(req *SnsAPIGetSnsInfoRequest, opts ...scw.RequestOption) (*SnsInfo, error) { var err error @@ -1346,7 +1346,7 @@ func (s *SnsAPI) GetSnsInfo(req *SnsAPIGetSnsInfoRequest, opts ...scw.RequestOpt return &resp, nil } -// DeactivateSns: Deactivate SNS for the specified Project ID.You must delete all topics and credentials before this call or you need to set the force_delete parameter. +// DeactivateSns: Deactivate Topics and Events for the specified Project ID. You must delete all topics and credentials before this call or you need to set the force_delete parameter. func (s *SnsAPI) DeactivateSns(req *SnsAPIDeactivateSnsRequest, opts ...scw.RequestOption) (*SnsInfo, error) { var err error @@ -1383,7 +1383,7 @@ func (s *SnsAPI) DeactivateSns(req *SnsAPIDeactivateSnsRequest, opts ...scw.Requ return &resp, nil } -// CreateSnsCredentials: Create a set of credentials for SNS, specified by a Project ID. Credentials give the bearer access to topics, and the level of permissions can be defined granularly. +// CreateSnsCredentials: Create a set of credentials for Topics and Events, specified by a Project ID. Credentials give the bearer access to topics, and the level of permissions can be defined granularly. func (s *SnsAPI) CreateSnsCredentials(req *SnsAPICreateSnsCredentialsRequest, opts ...scw.RequestOption) (*SnsCredentials, error) { var err error @@ -1424,7 +1424,7 @@ func (s *SnsAPI) CreateSnsCredentials(req *SnsAPICreateSnsCredentialsRequest, op return &resp, nil } -// DeleteSnsCredentials: Delete a set of SNS credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access SNS. +// DeleteSnsCredentials: Delete a set of Topics and Events credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access Topics and Events. func (s *SnsAPI) DeleteSnsCredentials(req *SnsAPIDeleteSnsCredentialsRequest, opts ...scw.RequestOption) error { var err error @@ -1453,7 +1453,7 @@ func (s *SnsAPI) DeleteSnsCredentials(req *SnsAPIDeleteSnsCredentialsRequest, op return nil } -// UpdateSnsCredentials: Update a set of SNS credentials. You can update the credentials' name, or their permissions. +// UpdateSnsCredentials: Update a set of Topics and Events credentials. You can update the credentials' name, or their permissions. func (s *SnsAPI) UpdateSnsCredentials(req *SnsAPIUpdateSnsCredentialsRequest, opts ...scw.RequestOption) (*SnsCredentials, error) { var err error @@ -1520,7 +1520,7 @@ func (s *SnsAPI) GetSnsCredentials(req *SnsAPIGetSnsCredentialsRequest, opts ... return &resp, nil } -// ListSnsCredentials: List existing SNS credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. +// ListSnsCredentials: List existing Topics and Events credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. func (s *SnsAPI) ListSnsCredentials(req *SnsAPIListSnsCredentialsRequest, opts ...scw.RequestOption) (*ListSnsCredentialsResponse, error) { var err error @@ -1559,7 +1559,7 @@ func (s *SnsAPI) ListSnsCredentials(req *SnsAPIListSnsCredentialsRequest, opts . return &resp, nil } -// This API allows you to manage your Scaleway Messaging and Queuing SQS brokers. +// This API allows you to manage your Scaleway Queues. type SqsAPI struct { client *scw.Client } @@ -1574,7 +1574,7 @@ func (s *SqsAPI) Regions() []scw.Region { return []scw.Region{scw.RegionFrPar, scw.RegionNlAms} } -// ActivateSqs: Activate SQS for the specified Project ID. SQS must be activated before any usage such as creating credentials and queues. Activating SQS does not trigger any billing, and you can deactivate at any time. +// ActivateSqs: Activate Queues for the specified Project ID. Queues must be activated before any usage such as creating credentials and queues. Activating Queues does not trigger any billing, and you can deactivate at any time. func (s *SqsAPI) ActivateSqs(req *SqsAPIActivateSqsRequest, opts ...scw.RequestOption) (*SqsInfo, error) { var err error @@ -1611,7 +1611,7 @@ func (s *SqsAPI) ActivateSqs(req *SqsAPIActivateSqsRequest, opts ...scw.RequestO return &resp, nil } -// GetSqsInfo: Retrieve the SQS information of the specified Project ID. Informations include the activation status and the SQS API endpoint URL. +// GetSqsInfo: Retrieve the Queues information of the specified Project ID. Informations include the activation status and the Queues API endpoint URL. func (s *SqsAPI) GetSqsInfo(req *SqsAPIGetSqsInfoRequest, opts ...scw.RequestOption) (*SqsInfo, error) { var err error @@ -1647,7 +1647,7 @@ func (s *SqsAPI) GetSqsInfo(req *SqsAPIGetSqsInfoRequest, opts ...scw.RequestOpt return &resp, nil } -// DeactivateSqs: Deactivate SQS for the specified Project ID. You must delete all queues and credentials before this call or you need to set the force_delete parameter. +// DeactivateSqs: Deactivate Queues for the specified Project ID. You must delete all queues and credentials before this call or you need to set the force_delete parameter. func (s *SqsAPI) DeactivateSqs(req *SqsAPIDeactivateSqsRequest, opts ...scw.RequestOption) (*SqsInfo, error) { var err error @@ -1684,7 +1684,7 @@ func (s *SqsAPI) DeactivateSqs(req *SqsAPIDeactivateSqsRequest, opts ...scw.Requ return &resp, nil } -// CreateSqsCredentials: Create a set of credentials for SQS, specified by a Project ID. Credentials give the bearer access to queues, and the level of permissions can be defined granularly. +// CreateSqsCredentials: Create a set of credentials for Queues, specified by a Project ID. Credentials give the bearer access to queues, and the level of permissions can be defined granularly. func (s *SqsAPI) CreateSqsCredentials(req *SqsAPICreateSqsCredentialsRequest, opts ...scw.RequestOption) (*SqsCredentials, error) { var err error @@ -1725,7 +1725,7 @@ func (s *SqsAPI) CreateSqsCredentials(req *SqsAPICreateSqsCredentialsRequest, op return &resp, nil } -// DeleteSqsCredentials: Delete a set of SQS credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access SQS. +// DeleteSqsCredentials: Delete a set of Queues credentials, specified by their credentials ID. Deleting credentials is irreversible and cannot be undone. The credentials can then no longer be used to access Queues. func (s *SqsAPI) DeleteSqsCredentials(req *SqsAPIDeleteSqsCredentialsRequest, opts ...scw.RequestOption) error { var err error @@ -1754,7 +1754,7 @@ func (s *SqsAPI) DeleteSqsCredentials(req *SqsAPIDeleteSqsCredentialsRequest, op return nil } -// UpdateSqsCredentials: Update a set of SQS credentials. You can update the credentials' name, or their permissions. +// UpdateSqsCredentials: Update a set of Queues credentials. You can update the credentials' name, or their permissions. func (s *SqsAPI) UpdateSqsCredentials(req *SqsAPIUpdateSqsCredentialsRequest, opts ...scw.RequestOption) (*SqsCredentials, error) { var err error @@ -1821,7 +1821,7 @@ func (s *SqsAPI) GetSqsCredentials(req *SqsAPIGetSqsCredentialsRequest, opts ... return &resp, nil } -// ListSqsCredentials: List existing SQS credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. +// ListSqsCredentials: List existing Queues credentials in the specified region. The response contains only the metadata for the credentials, not the credentials themselves. func (s *SqsAPI) ListSqsCredentials(req *SqsAPIListSqsCredentialsRequest, opts ...scw.RequestOption) (*ListSqsCredentialsResponse, error) { var err error From 672339d5829b416af35e2b56ad3182fcdcbd5689 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 9 Dec 2024 10:11:12 +0100 Subject: [PATCH 108/163] feat(k8s): add temporary acl_available field on Cluster (#2346) --- api/k8s/v1/k8s_sdk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 04c0979d5..4d67da9e7 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -1188,8 +1188,8 @@ type Cluster struct { // Deprecated: SbsCsiEnabled: defines whether the SBS-enabled CSI starting from v0.3 is installed on the cluster. SbsCsiEnabled *bool `json:"sbs_csi_enabled,omitempty"` - // Deprecated: FullVpcIntegratonEnabled: defines whether VPC is fully integrated on the cluster. - FullVpcIntegratonEnabled *bool `json:"full_vpc_integraton_enabled,omitempty"` + // Deprecated: ACLAvailable: defines whether ACL is available on the cluster. + ACLAvailable *bool `json:"acl_available,omitempty"` } // Node: node. From cdff8a8dc7b33379f12ab797246bc0e8c877f18d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 9 Dec 2024 10:15:46 +0100 Subject: [PATCH 109/163] feat(k8s): remove routed IP migration (#2347) Co-authored-by: Jonathan R. --- api/k8s/v1/k8s_sdk.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 4d67da9e7..2e576006c 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -1182,9 +1182,6 @@ type Cluster struct { // CommitmentEndsAt: date on which it will be possible to switch to a smaller offer. CommitmentEndsAt *time.Time `json:"commitment_ends_at"` - // Deprecated: RoutedIPEnabled: defines whether routed IPs are enabled for nodes of this cluster. - RoutedIPEnabled *bool `json:"routed_ip_enabled,omitempty"` - // Deprecated: SbsCsiEnabled: defines whether the SBS-enabled CSI starting from v0.3 is installed on the cluster. SbsCsiEnabled *bool `json:"sbs_csi_enabled,omitempty"` From 3844574f2f0d81abe8cf2c065416826bf62f2896 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 9 Dec 2024 10:21:49 +0100 Subject: [PATCH 110/163] feat(webhosting): update public v1 hosting message (#2348) Co-authored-by: Jonathan R. --- api/webhosting/v1/webhosting_sdk.go | 223 ++++++++++++++++------------ 1 file changed, 132 insertions(+), 91 deletions(-) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index 9d8f8656a..88799e077 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -40,42 +40,42 @@ var ( _ = namegenerator.GetRandomName ) -type HostingDNSStatus string +type DNSRecordsStatus string const ( - HostingDNSStatusUnknownDNSStatus = HostingDNSStatus("unknown_dns_status") - HostingDNSStatusValid = HostingDNSStatus("valid") - HostingDNSStatusInvalid = HostingDNSStatus("invalid") + DNSRecordsStatusUnknownStatus = DNSRecordsStatus("unknown_status") + DNSRecordsStatusValid = DNSRecordsStatus("valid") + DNSRecordsStatusInvalid = DNSRecordsStatus("invalid") ) -func (enum HostingDNSStatus) String() string { +func (enum DNSRecordsStatus) String() string { if enum == "" { // return default value if empty - return "unknown_dns_status" + return "unknown_status" } return string(enum) } -func (enum HostingDNSStatus) Values() []HostingDNSStatus { - return []HostingDNSStatus{ - "unknown_dns_status", +func (enum DNSRecordsStatus) Values() []DNSRecordsStatus { + return []DNSRecordsStatus{ + "unknown_status", "valid", "invalid", } } -func (enum HostingDNSStatus) MarshalJSON() ([]byte, error) { +func (enum DNSRecordsStatus) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf(`"%s"`, enum)), nil } -func (enum *HostingDNSStatus) UnmarshalJSON(data []byte) error { +func (enum *DNSRecordsStatus) UnmarshalJSON(data []byte) error { tmp := "" if err := json.Unmarshal(data, &tmp); err != nil { return err } - *enum = HostingDNSStatus(HostingDNSStatus(tmp).String()) + *enum = DNSRecordsStatus(DNSRecordsStatus(tmp).String()) return nil } @@ -520,6 +520,54 @@ func (enum *OfferOptionWarning) UnmarshalJSON(data []byte) error { return nil } +type PlatformPlatformGroup string + +const ( + PlatformPlatformGroupUnknownGroup = PlatformPlatformGroup("unknown_group") + PlatformPlatformGroupDefault = PlatformPlatformGroup("default") + PlatformPlatformGroupPremium = PlatformPlatformGroup("premium") +) + +func (enum PlatformPlatformGroup) String() string { + if enum == "" { + // return default value if empty + return "unknown_group" + } + return string(enum) +} + +func (enum PlatformPlatformGroup) Values() []PlatformPlatformGroup { + return []PlatformPlatformGroup{ + "unknown_group", + "default", + "premium", + } +} + +func (enum PlatformPlatformGroup) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *PlatformPlatformGroup) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = PlatformPlatformGroup(PlatformPlatformGroup(tmp).String()) + return nil +} + +// PlatformControlPanelURLs: platform control panel ur ls. +type PlatformControlPanelURLs struct { + // Dashboard: URL to connect to the hosting control panel dashboard. + Dashboard string `json:"dashboard"` + + // Webmail: URL to connect to the hosting Webmail interface. + Webmail string `json:"webmail"` +} + // OfferOption: offer option. type OfferOption struct { // ID: option ID. @@ -546,6 +594,15 @@ type OfferOption struct { QuotaWarning OfferOptionWarning `json:"quota_warning"` } +// PlatformControlPanel: platform control panel. +type PlatformControlPanel struct { + // Name: name of the control panel. + Name string `json:"name"` + + // URLs: URL to connect to cPanel dashboard and to Webmail interface. + URLs *PlatformControlPanelURLs `json:"urls"` +} + // CreateHostingRequestDomainConfiguration: create hosting request domain configuration. type CreateHostingRequestDomainConfiguration struct { UpdateNameservers bool `json:"update_nameservers"` @@ -566,24 +623,62 @@ type OfferOptionRequest struct { Quantity int64 `json:"quantity"` } -// HostingCpanelURLs: hosting cpanel ur ls. -type HostingCpanelURLs struct { - Dashboard string `json:"dashboard"` +// HostingUser: hosting user. +type HostingUser struct { + // Username: main Web Hosting cPanel username. + Username string `json:"username"` - Webmail string `json:"webmail"` + // OneTimePassword: one-time-password used for the first login or reset password, empty after first use. + OneTimePassword *string `json:"one_time_password"` + + // ContactEmail: contact email used for the hosting. + ContactEmail string `json:"contact_email"` } -// HostingOption: hosting option. -type HostingOption struct { - // ID: option ID. +// Offer: offer. +type Offer struct { + // ID: offer ID. ID string `json:"id"` - // Name: option name. - // Default value: unknown_name - Name OfferOptionName `json:"name"` + // BillingOperationPath: unique identifier used for billing. + BillingOperationPath string `json:"billing_operation_path"` + + // Options: options available for the offer. + Options []*OfferOption `json:"options"` - // Quantity: option quantity. - Quantity int32 `json:"quantity"` + // Price: price of the offer. + Price *scw.Money `json:"price"` + + // Available: if a hosting_id was specified in the call, defines whether the offer is available for a specified hosting plan to migrate (update) to. + Available bool `json:"available"` + + // ControlPanelName: name of the control panel. + ControlPanelName string `json:"control_panel_name"` + + // EndOfLife: indicates if the offer has reached its end of life. + EndOfLife bool `json:"end_of_life"` +} + +// Platform: platform. +type Platform struct { + // Hostname: hostname of the host platform. + Hostname string `json:"hostname"` + + // Number: number of the host platform. + Number int32 `json:"number"` + + // GroupName: group name of the hosting's host platform. + // Default value: unknown_group + GroupName PlatformPlatformGroup `json:"group_name"` + + // IPv4: iPv4 address of the hosting's host platform. + IPv4 net.IP `json:"ipv4"` + + // IPv6: iPv6 address of the hosting's host platform. + IPv6 net.IP `json:"ipv6"` + + // ControlPanel: details of the platform control panel. + ControlPanel *PlatformControlPanel `json:"control_panel"` } // ControlPanel: control panel. @@ -665,30 +760,6 @@ type MailAccount struct { Username string `json:"username"` } -// Offer: offer. -type Offer struct { - // ID: offer ID. - ID string `json:"id"` - - // BillingOperationPath: unique identifier used for billing. - BillingOperationPath string `json:"billing_operation_path"` - - // Options: options available for the offer. - Options []*OfferOption `json:"options"` - - // Price: price of the offer. - Price *scw.Money `json:"price"` - - // Available: if a hosting_id was specified in the call, defines whether the offer is available for a specified hosting plan to migrate (update) to. - Available bool `json:"available"` - - // ControlPanelName: name of the control panel. - ControlPanelName string `json:"control_panel_name"` - - // EndOfLife: indicates if the offer has reached its end of life. - EndOfLife bool `json:"end_of_life"` -} - // Website: website. type Website struct { // Domain: the domain of the website. @@ -956,60 +1027,30 @@ type Hosting struct { // Default value: unknown_status Status HostingStatus `json:"status"` - // PlatformHostname: hostname of the host platform. - PlatformHostname string `json:"platform_hostname"` - - // PlatformNumber: number of the host platform. - PlatformNumber int32 `json:"platform_number"` - - // OfferID: ID of the active offer for the Web Hosting plan. - OfferID string `json:"offer_id"` - - // OfferName: name of the active offer for the Web Hosting plan. - OfferName string `json:"offer_name"` - // Domain: main domain associated with the Web Hosting plan. Domain string `json:"domain"` + // Offer: details of the Web Hosting plan offer and options. + Offer *Offer `json:"offer"` + + // Platform: details of the hosting platform. + Platform *Platform `json:"platform"` + // Tags: list of tags associated with the Web Hosting plan. Tags []string `json:"tags"` - // Options: list of the Web Hosting plan options. - Options []*HostingOption `json:"options"` - // DNSStatus: DNS status of the Web Hosting plan. - // Default value: unknown_dns_status - DNSStatus HostingDNSStatus `json:"dns_status"` - - // CpanelURLs: URL to connect to cPanel dashboard and to Webmail interface. - CpanelURLs *HostingCpanelURLs `json:"cpanel_urls"` - - // Username: main Web Hosting cPanel username. - Username string `json:"username"` - - // OfferEndOfLife: indicates if the hosting offer has reached its end of life. - OfferEndOfLife bool `json:"offer_end_of_life"` - - // ControlPanelName: name of the control panel. - ControlPanelName string `json:"control_panel_name"` - - // PlatformGroup: group of the hosting's host server/platform. - PlatformGroup string `json:"platform_group"` - - // IPv4: iPv4 address of the hosting's host server. - IPv4 string `json:"ipv4"` + // Default value: unknown_status + DNSStatus DNSRecordsStatus `json:"dns_status"` - // IPv6: iPv6 address of the hosting's host server. - IPv6 string `json:"ipv6"` + // IPv4: current IPv4 address of the hosting. + IPv4 net.IP `json:"ipv4"` // Protected: whether the hosting is protected or not. Protected bool `json:"protected"` - // OneTimePassword: one-time-password used for the first login or reset password, empty after first use. - OneTimePassword string `json:"one_time_password"` - - // ContactEmail: contact email used for the hosting. - ContactEmail string `json:"contact_email"` + // User: details of the hosting user. + User *HostingUser `json:"user"` // Region: region where the Web Hosting plan is hosted. Region scw.Region `json:"region"` @@ -2067,7 +2108,7 @@ func NewHostingAPI(client *scw.Client) *HostingAPI { } } func (s *HostingAPI) Regions() []scw.Region { - return []scw.Region{scw.RegionFrPar, scw.RegionNlAms} + return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} } // CreateHosting: Order a Web Hosting plan, specifying the offer type required via the `offer_id` parameter. From cb4590f1bf86e6c94be796e467d669e9a8cab4be Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 9 Dec 2024 11:39:32 +0100 Subject: [PATCH 111/163] feat(webhosting): update v1 uuid and add offer option price (#2351) Co-authored-by: devtools-ci-cd --- api/webhosting/v1/webhosting_sdk.go | 293 +++++++++++++++++++++++++++- 1 file changed, 292 insertions(+), 1 deletion(-) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index 88799e077..4a50e2e5e 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -40,6 +40,92 @@ var ( _ = namegenerator.GetRandomName ) +type DNSRecordStatus string + +const ( + DNSRecordStatusUnknownStatus = DNSRecordStatus("unknown_status") + DNSRecordStatusValid = DNSRecordStatus("valid") + DNSRecordStatusInvalid = DNSRecordStatus("invalid") +) + +func (enum DNSRecordStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum DNSRecordStatus) Values() []DNSRecordStatus { + return []DNSRecordStatus{ + "unknown_status", + "valid", + "invalid", + } +} + +func (enum DNSRecordStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *DNSRecordStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = DNSRecordStatus(DNSRecordStatus(tmp).String()) + return nil +} + +type DNSRecordType string + +const ( + DNSRecordTypeUnknownType = DNSRecordType("unknown_type") + DNSRecordTypeA = DNSRecordType("a") + DNSRecordTypeCname = DNSRecordType("cname") + DNSRecordTypeMx = DNSRecordType("mx") + DNSRecordTypeTxt = DNSRecordType("txt") + DNSRecordTypeNs = DNSRecordType("ns") + DNSRecordTypeAaaa = DNSRecordType("aaaa") +) + +func (enum DNSRecordType) String() string { + if enum == "" { + // return default value if empty + return "unknown_type" + } + return string(enum) +} + +func (enum DNSRecordType) Values() []DNSRecordType { + return []DNSRecordType{ + "unknown_type", + "a", + "cname", + "mx", + "txt", + "ns", + "aaaa", + } +} + +func (enum DNSRecordType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *DNSRecordType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = DNSRecordType(DNSRecordType(tmp).String()) + return nil +} + type DNSRecordsStatus string const ( @@ -434,6 +520,45 @@ func (enum *ListWebsitesRequestOrderBy) UnmarshalJSON(data []byte) error { return nil } +type NameserverStatus string + +const ( + NameserverStatusUnknownStatus = NameserverStatus("unknown_status") + NameserverStatusValid = NameserverStatus("valid") + NameserverStatusInvalid = NameserverStatus("invalid") +) + +func (enum NameserverStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum NameserverStatus) Values() []NameserverStatus { + return []NameserverStatus{ + "unknown_status", + "valid", + "invalid", + } +} + +func (enum NameserverStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *NameserverStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = NameserverStatus(NameserverStatus(tmp).String()) + return nil +} + type OfferOptionName string const ( @@ -592,6 +717,9 @@ type OfferOption struct { // QuotaWarning: defines a warning if the maximum value for the option has been reached. // Default value: unknown_warning QuotaWarning OfferOptionWarning `json:"quota_warning"` + + // Price: price of the option for 1 value. + Price *scw.Money `json:"price"` } // PlatformControlPanel: platform control panel. @@ -623,6 +751,42 @@ type OfferOptionRequest struct { Quantity int64 `json:"quantity"` } +// DNSRecord: dns record. +type DNSRecord struct { + // Name: record name. + Name string `json:"name"` + + // Type: record type. + // Default value: unknown_type + Type DNSRecordType `json:"type"` + + // TTL: record time-to-live. + TTL uint32 `json:"ttl"` + + // Value: record value. + Value string `json:"value"` + + // Priority: record priority level. + Priority *uint32 `json:"priority"` + + // Status: record status. + // Default value: unknown_status + Status DNSRecordStatus `json:"status"` +} + +// Nameserver: nameserver. +type Nameserver struct { + // Hostname: hostname of the nameserver. + Hostname string `json:"hostname"` + + // Status: status of the nameserver. + // Default value: unknown_status + Status NameserverStatus `json:"status"` + + // IsDefault: defines whether the nameserver is the default one. + IsDefault bool `json:"is_default"` +} + // HostingUser: hosting user. type HostingUser struct { // Username: main Web Hosting cPanel username. @@ -772,6 +936,12 @@ type Website struct { SslStatus bool `json:"ssl_status"` } +// CheckUserOwnsDomainResponse: check user owns domain response. +type CheckUserOwnsDomainResponse struct { + // OwnsDomain: indicates whether the specified project owns the domain. + OwnsDomain bool `json:"owns_domain"` +} + // ControlPanelAPIListControlPanelsRequest: control panel api list control panels request. type ControlPanelAPIListControlPanelsRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -784,6 +954,40 @@ type ControlPanelAPIListControlPanelsRequest struct { PageSize *uint32 `json:"-"` } +// DNSAPICheckUserOwnsDomainRequest: dnsapi check user owns domain request. +type DNSAPICheckUserOwnsDomainRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // Domain: domain for which ownership is to be verified. + Domain string `json:"-"` + + // ProjectID: ID of the project currently in use. + ProjectID string `json:"project_id"` +} + +// DNSAPIGetDomainDNSRecordsRequest: dnsapi get domain dns records request. +type DNSAPIGetDomainDNSRecordsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // Domain: domain associated with the DNS records. + Domain string `json:"-"` +} + +// DNSRecords: dns records. +type DNSRecords struct { + // Records: list of DNS records. + Records []*DNSRecord `json:"records"` + + // NameServers: list of nameservers. + NameServers []*Nameserver `json:"name_servers"` + + // Status: status of the records. + // Default value: unknown_status + Status DNSRecordsStatus `json:"status"` +} + // DatabaseAPIAssignDatabaseUserRequest: database api assign database user request. type DatabaseAPIAssignDatabaseUserRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1570,7 +1774,7 @@ func NewControlPanelAPI(client *scw.Client) *ControlPanelAPI { } } func (s *ControlPanelAPI) Regions() []scw.Region { - return []scw.Region{scw.RegionFrPar, scw.RegionNlAms} + return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} } // ListControlPanels: "List the control panels type: cpanel or plesk.". @@ -2041,6 +2245,93 @@ func (s *DatabaseAPI) UnassignDatabaseUser(req *DatabaseAPIUnassignDatabaseUserR return &resp, nil } +// This API allows you to manage your Web Hosting services. +type DnsAPI struct { + client *scw.Client +} + +// NewDnsAPI returns a DnsAPI object from a Scaleway client. +func NewDnsAPI(client *scw.Client) *DnsAPI { + return &DnsAPI{ + client: client, + } +} +func (s *DnsAPI) Regions() []scw.Region { + return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} +} + +// GetDomainDNSRecords: Get the set of DNS records of a specified domain associated with a Web Hosting plan's domain. +func (s *DnsAPI) GetDomainDNSRecords(req *DNSAPIGetDomainDNSRecordsRequest, opts ...scw.RequestOption) (*DNSRecords, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.Domain) == "" { + return nil, errors.New("field Domain cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/webhosting/v1/regions/" + fmt.Sprint(req.Region) + "/domains/" + fmt.Sprint(req.Domain) + "/dns-records", + } + + var resp DNSRecords + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CheckUserOwnsDomain: "Check whether you own this domain or not.". +func (s *DnsAPI) CheckUserOwnsDomain(req *DNSAPICheckUserOwnsDomainRequest, opts ...scw.RequestOption) (*CheckUserOwnsDomainResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.Domain) == "" { + return nil, errors.New("field Domain cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/webhosting/v1/regions/" + fmt.Sprint(req.Region) + "/domains/" + fmt.Sprint(req.Domain) + "/check-ownership", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp CheckUserOwnsDomainResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // This API allows you to manage your offer for your Web Hosting services. type OfferAPI struct { client *scw.Client From b224dc3826a85f028c935cb6d824172f36359389 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 9 Dec 2024 15:13:40 +0100 Subject: [PATCH 112/163] feat(iam): add organization security settings methods (#2352) --- api/iam/v1alpha1/iam_sdk.go | 106 +++++++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 7 deletions(-) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 26e2f09e9..9e17a1c7f 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -1412,7 +1412,7 @@ type CreateUserRequest struct { // Tags: tags associated with the user. Tags []string `json:"tags"` - // Member: a new IAM Member to create. + // Member: details of IAM member. Private Beta feature. // Precisely one of Email, Member must be set. Member *CreateUserRequestMember `json:"member,omitempty"` } @@ -1500,6 +1500,12 @@ type GetLogRequest struct { LogID string `json:"-"` } +// GetOrganizationSecuritySettingsRequest: get organization security settings request. +type GetOrganizationSecuritySettingsRequest struct { + // OrganizationID: ID of the Organization. + OrganizationID string `json:"-"` +} + // GetPolicyRequest: get policy request. type GetPolicyRequest struct { // PolicyID: id of policy to search. @@ -2145,6 +2151,18 @@ type LockUserRequest struct { UserID string `json:"-"` } +// OrganizationSecuritySettings: organization security settings. +type OrganizationSecuritySettings struct { + // EnforcePasswordRenewal: defines whether password renewal is enforced during first login. + EnforcePasswordRenewal bool `json:"enforce_password_renewal"` + + // GracePeriodDuration: duration of the grace period to renew password or enable MFA. + GracePeriodDuration *scw.Duration `json:"grace_period_duration"` + + // LoginAttemptsBeforeLocked: number of login attempts before the account is locked. + LoginAttemptsBeforeLocked uint32 `json:"login_attempts_before_locked"` +} + // RemoveGroupMemberRequest: remove group member request. type RemoveGroupMemberRequest struct { // GroupID: ID of the group. @@ -2231,6 +2249,21 @@ type UpdateGroupRequest struct { Tags *[]string `json:"tags,omitempty"` } +// UpdateOrganizationSecuritySettingsRequest: update organization security settings request. +type UpdateOrganizationSecuritySettingsRequest struct { + // OrganizationID: ID of the Organization. + OrganizationID string `json:"-"` + + // EnforcePasswordRenewal: defines whether password renewal is enforced during first login. + EnforcePasswordRenewal *bool `json:"enforce_password_renewal,omitempty"` + + // GracePeriodDuration: duration of the grace period to renew password or enable MFA. + GracePeriodDuration *scw.Duration `json:"grace_period_duration,omitempty"` + + // LoginAttemptsBeforeLocked: number of login attempts before the account is locked. + LoginAttemptsBeforeLocked *uint32 `json:"login_attempts_before_locked,omitempty"` +} + // UpdatePolicyRequest: update policy request. type UpdatePolicyRequest struct { // PolicyID: id of policy to update. @@ -2293,7 +2326,7 @@ type UpdateUserRequest struct { // Tags: new tags for the user (maximum of 10 tags). Tags *[]string `json:"tags,omitempty"` - // Email: new email for the user (only available on Members). + // Email: iAM member email. Email *string `json:"email,omitempty"` } @@ -2573,7 +2606,7 @@ func (s *API) CreateUser(req *CreateUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } -// UpdateUserPassword: Update an user's password. +// UpdateUserPassword: Update an user's password. Private Beta feature. func (s *API) UpdateUserPassword(req *UpdateUserPasswordRequest, opts ...scw.RequestOption) (*User, error) { var err error @@ -2600,7 +2633,7 @@ func (s *API) UpdateUserPassword(req *UpdateUserPasswordRequest, opts ...scw.Req return &resp, nil } -// LockUser: Lock a user. Note that a locked user cannot log in or use API keys until the locked status is removed. +// LockUser: Lock a member. A locked member cannot log in or use API keys until the locked status is removed. Private Beta feature. func (s *API) LockUser(req *LockUserRequest, opts ...scw.RequestOption) (*User, error) { var err error @@ -2627,7 +2660,7 @@ func (s *API) LockUser(req *LockUserRequest, opts ...scw.RequestOption) (*User, return &resp, nil } -// UnlockUser: Unlock a user. +// UnlockUser: Unlock a member. Private Beta feature. func (s *API) UnlockUser(req *UnlockUserRequest, opts ...scw.RequestOption) (*User, error) { var err error @@ -2654,7 +2687,7 @@ func (s *API) UnlockUser(req *UnlockUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } -// ListGracePeriods: List the grace periods of a user. +// ListGracePeriods: List the grace periods of a member. Private Beta feature. func (s *API) ListGracePeriods(req *ListGracePeriodsRequest, opts ...scw.RequestOption) (*ListGracePeriodsResponse, error) { var err error @@ -3362,7 +3395,7 @@ func (s *API) ListAPIKeys(req *ListAPIKeysRequest, opts ...scw.RequestOption) (* return &resp, nil } -// CreateAPIKey: Create an API key. You must specify the `application_id` or the `user_id` and the description. You can also specify the `default_project_id` which is the Project ID of your preferred Project, to use with Object Storage. The `access_key` and `secret_key` values are returned in the response. Note that he secret key is only showed once. Make sure that you copy and store both keys somewhere safe. +// CreateAPIKey: Create an API key. You must specify the `application_id` or the `user_id` and the description. You can also specify the `default_project_id`, which is the Project ID of your preferred Project, to use with Object Storage. The `access_key` and `secret_key` values are returned in the response. Note that the secret key is only shown once. Make sure that you copy and store both keys somewhere safe. func (s *API) CreateAPIKey(req *CreateAPIKeyRequest, opts ...scw.RequestOption) (*APIKey, error) { var err error @@ -3678,3 +3711,62 @@ func (s *API) GetLog(req *GetLogRequest, opts ...scw.RequestOption) (*Log, error } return &resp, nil } + +// GetOrganizationSecuritySettings: Retrieve information about the security settings of an Organization, specified by the `organization_id` parameter. +func (s *API) GetOrganizationSecuritySettings(req *GetOrganizationSecuritySettingsRequest, opts ...scw.RequestOption) (*OrganizationSecuritySettings, error) { + var err error + + if req.OrganizationID == "" { + defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() + req.OrganizationID = defaultOrganizationID + } + + if fmt.Sprint(req.OrganizationID) == "" { + return nil, errors.New("field OrganizationID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/iam/v1alpha1/organizations/" + fmt.Sprint(req.OrganizationID) + "/security-settings", + } + + var resp OrganizationSecuritySettings + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateOrganizationSecuritySettings: Update the security settings of an Organization. +func (s *API) UpdateOrganizationSecuritySettings(req *UpdateOrganizationSecuritySettingsRequest, opts ...scw.RequestOption) (*OrganizationSecuritySettings, error) { + var err error + + if req.OrganizationID == "" { + defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() + req.OrganizationID = defaultOrganizationID + } + + if fmt.Sprint(req.OrganizationID) == "" { + return nil, errors.New("field OrganizationID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/iam/v1alpha1/organizations/" + fmt.Sprint(req.OrganizationID) + "/security-settings", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp OrganizationSecuritySettings + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From 92afa47368ef55309240fe3bd69bcea756a87933 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 9 Dec 2024 16:31:25 +0100 Subject: [PATCH 113/163] feat(iam): add `username` order by in `ListUsers` (#2353) --- api/iam/v1alpha1/iam_sdk.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 9e17a1c7f..a049c444b 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -565,6 +565,10 @@ const ( ListUsersRequestOrderByLastLoginAsc = ListUsersRequestOrderBy("last_login_asc") // Last login descending. ListUsersRequestOrderByLastLoginDesc = ListUsersRequestOrderBy("last_login_desc") + // Username ascending. + ListUsersRequestOrderByUsernameAsc = ListUsersRequestOrderBy("username_asc") + // Username descending. + ListUsersRequestOrderByUsernameDesc = ListUsersRequestOrderBy("username_desc") ) func (enum ListUsersRequestOrderBy) String() string { @@ -585,6 +589,8 @@ func (enum ListUsersRequestOrderBy) Values() []ListUsersRequestOrderBy { "email_desc", "last_login_asc", "last_login_desc", + "username_asc", + "username_desc", } } From 1b02856ec1b1c520ddf3b470fa15e6cc849ca1c9 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 11 Dec 2024 16:06:21 +0100 Subject: [PATCH 114/163] feat: update generated APIs (#2354) --- api/ipam/v1/ipam_sdk.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/api/ipam/v1/ipam_sdk.go b/api/ipam/v1/ipam_sdk.go index cbf34b722..f35bea714 100644 --- a/api/ipam/v1/ipam_sdk.go +++ b/api/ipam/v1/ipam_sdk.go @@ -336,6 +336,9 @@ type ListIPsRequest struct { // Attached: defines whether to filter only for IPs which are attached to a resource. Attached *bool `json:"-"` + // ResourceName: attached resource name to filter for, only IPs attached to a resource with this string within their name will be returned. + ResourceName *string `json:"-"` + // ResourceID: resource ID to filter for. Only IPs attached to this resource will be returned. ResourceID *string `json:"-"` @@ -346,6 +349,9 @@ type ListIPsRequest struct { // Default value: unknown_type ResourceType ResourceType `json:"-"` + // ResourceTypes: resource types to filter for. Only IPs attached to these types of resources will be returned. + ResourceTypes []ResourceType `json:"-"` + // MacAddress: mAC address to filter for. Only IPs attached to a resource with this MAC address will be returned. MacAddress *string `json:"-"` @@ -358,11 +364,8 @@ type ListIPsRequest struct { // IsIPv6: defines whether to filter only for IPv4s or IPv6s. IsIPv6 *bool `json:"-"` - // ResourceName: attached resource name to filter for, only IPs attached to a resource with this string within their name will be returned. - ResourceName *string `json:"-"` - - // ResourceTypes: resource types to filter for. Only IPs attached to these types of resources will be returned. - ResourceTypes []ResourceType `json:"-"` + // IPIDs: IP IDs to filter for. Only IPs with these UUIDs will be returned. + IPIDs []string `json:"-"` } // ListIPsResponse: list i ps response. @@ -642,15 +645,16 @@ func (s *API) ListIPs(req *ListIPsRequest, opts ...scw.RequestOption) (*ListIPsR parameter.AddToQuery(query, "project_id", req.ProjectID) parameter.AddToQuery(query, "vpc_id", req.VpcID) parameter.AddToQuery(query, "attached", req.Attached) + parameter.AddToQuery(query, "resource_name", req.ResourceName) parameter.AddToQuery(query, "resource_id", req.ResourceID) parameter.AddToQuery(query, "resource_ids", req.ResourceIDs) parameter.AddToQuery(query, "resource_type", req.ResourceType) + parameter.AddToQuery(query, "resource_types", req.ResourceTypes) parameter.AddToQuery(query, "mac_address", req.MacAddress) parameter.AddToQuery(query, "tags", req.Tags) parameter.AddToQuery(query, "organization_id", req.OrganizationID) parameter.AddToQuery(query, "is_ipv6", req.IsIPv6) - parameter.AddToQuery(query, "resource_name", req.ResourceName) - parameter.AddToQuery(query, "resource_types", req.ResourceTypes) + parameter.AddToQuery(query, "ip_ids", req.IPIDs) parameter.AddToQuery(query, "zonal", req.Zonal) parameter.AddToQuery(query, "private_network_id", req.PrivateNetworkID) parameter.AddToQuery(query, "subnet_id", req.SubnetID) From 520fa31dea856a4b340a208dde0c0d53458e7ce7 Mon Sep 17 00:00:00 2001 From: "Jonathan R." Date: Thu, 12 Dec 2024 16:12:52 +0100 Subject: [PATCH 115/163] feat(rdb): fetch latest engine version from API (#2317) --- api/rdb/v1/rdb_utils.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/api/rdb/v1/rdb_utils.go b/api/rdb/v1/rdb_utils.go index 77338451a..77c08c8f2 100644 --- a/api/rdb/v1/rdb_utils.go +++ b/api/rdb/v1/rdb_utils.go @@ -1,6 +1,7 @@ package rdb import ( + "fmt" "time" "github.com/scaleway/scaleway-sdk-go/errors" @@ -199,3 +200,25 @@ func (s *API) WaitForReadReplica(req *WaitForReadReplicaRequest, opts ...scw.Req } return readReplica.(*ReadReplica), nil } + +func (s *API) FetchLatestEngineVersion(engineName string) (*EngineVersion, error) { + engines, err := s.ListDatabaseEngines(&ListDatabaseEnginesRequest{}) + if err != nil { + return nil, err + } + + var latestEngineVersion *EngineVersion + for _, engine := range engines.Engines { + if engine.Name == engineName { + if len(engine.Versions) > 0 { + latestEngineVersion = engine.Versions[0] + break + } + } + } + + if latestEngineVersion == nil { + return nil, fmt.Errorf("no versions found for engine: %s", engineName) + } + return latestEngineVersion, nil +} From 5acb8bbb6aa760f0020662cd0c382db9aea7421e Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 12 Dec 2024 16:13:24 +0100 Subject: [PATCH 116/163] docs(iam): improve and add private beta disclosure to IAM members features (#2349) Co-authored-by: Jonathan R. From 87ddc26f6cd6de31661e03d72f65a217a43d2661 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 12 Dec 2024 16:13:59 +0100 Subject: [PATCH 117/163] feat(audit_trail): add integrated methods in ListProducts (#2355) --- api/audit_trail/v1alpha1/audit_trail_sdk.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/api/audit_trail/v1alpha1/audit_trail_sdk.go b/api/audit_trail/v1alpha1/audit_trail_sdk.go index e0bbc3ae1..7bfe5bcdc 100644 --- a/api/audit_trail/v1alpha1/audit_trail_sdk.go +++ b/api/audit_trail/v1alpha1/audit_trail_sdk.go @@ -194,6 +194,13 @@ type Resource struct { KubeACLInfo *KubernetesACLInfo `json:"kube_acl_info,omitempty"` } +// ProductService: product service. +type ProductService struct { + Name string `json:"name"` + + Methods []string `json:"methods"` +} + // Event: event. type Event struct { // ID: ID of the event. @@ -249,6 +256,9 @@ type Product struct { // Name: product name. Name string `json:"name"` + + // Services: specifies the API versions of the products integrated with Audit Trail. Each version defines the methods logged by Audit Trail. + Services []*ProductService `json:"services"` } // ListEventsRequest: list events request. From 0d220e058bfcbd245665b58a09b59d2dd44f84d0 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 12 Dec 2024 16:14:23 +0100 Subject: [PATCH 118/163] feat(iam): add `UpdateUserUsername` (#2356) --- api/iam/v1alpha1/iam_sdk.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index a049c444b..6250e7cdb 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -2336,6 +2336,13 @@ type UpdateUserRequest struct { Email *string `json:"email,omitempty"` } +// UpdateUserUsernameRequest: update user username request. +type UpdateUserUsernameRequest struct { + UserID string `json:"-"` + + Username string `json:"username"` +} + // This API allows you to manage Identity and Access Management (IAM) across your Scaleway Organizations, Projects and resources. type API struct { client *scw.Client @@ -2612,6 +2619,33 @@ func (s *API) CreateUser(req *CreateUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } +// UpdateUserUsername: +func (s *API) UpdateUserUsername(req *UpdateUserUsernameRequest, opts ...scw.RequestOption) (*User, error) { + var err error + + if fmt.Sprint(req.UserID) == "" { + return nil, errors.New("field UserID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/iam/v1alpha1/users/" + fmt.Sprint(req.UserID) + "/update-username", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp User + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // UpdateUserPassword: Update an user's password. Private Beta feature. func (s *API) UpdateUserPassword(req *UpdateUserPasswordRequest, opts ...scw.RequestOption) (*User, error) { var err error From 28dc6fb25840ff4a1bb25c2f20bf2f5d79f99d72 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 13 Dec 2024 17:06:53 +0100 Subject: [PATCH 119/163] feat(webhosting): edit method to allow user creation (#2357) --- api/webhosting/v1/webhosting_sdk.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index 4a50e2e5e..d451f9e12 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -731,6 +731,13 @@ type PlatformControlPanel struct { URLs *PlatformControlPanelURLs `json:"urls"` } +// CreateDatabaseRequestUser: create database request user. +type CreateDatabaseRequestUser struct { + Username string `json:"username"` + + Password string `json:"password"` +} + // CreateHostingRequestDomainConfiguration: create hosting request domain configuration. type CreateHostingRequestDomainConfiguration struct { UpdateNameservers bool `json:"update_nameservers"` @@ -1028,6 +1035,14 @@ type DatabaseAPICreateDatabaseRequest struct { // DatabaseName: name of the database to be created. DatabaseName string `json:"database_name"` + + // NewUser: (Optional) Username and password to create a user and link to the database. + // Precisely one of NewUser, ExistingUsername must be set. + NewUser *CreateDatabaseRequestUser `json:"new_user,omitempty"` + + // ExistingUsername: (Optional) Username to link an existing user to the database. + // Precisely one of NewUser, ExistingUsername must be set. + ExistingUsername *string `json:"existing_username,omitempty"` } // DatabaseAPICreateDatabaseUserRequest: database api create database user request. From c784ebeab26fe4d5af8f63eab37a8ad7184e36d6 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 13 Dec 2024 17:08:49 +0100 Subject: [PATCH 120/163] docs(iam): document `UpdateUserUsername` (#2358) --- api/iam/v1alpha1/iam_sdk.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 6250e7cdb..0aace9398 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -2338,8 +2338,10 @@ type UpdateUserRequest struct { // UpdateUserUsernameRequest: update user username request. type UpdateUserUsernameRequest struct { + // UserID: ID of the user to update. UserID string `json:"-"` + // Username: the new username. Username string `json:"username"` } @@ -2619,7 +2621,7 @@ func (s *API) CreateUser(req *CreateUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } -// UpdateUserUsername: +// UpdateUserUsername: Update an user's username. Private Beta feature. func (s *API) UpdateUserUsername(req *UpdateUserUsernameRequest, opts ...scw.RequestOption) (*User, error) { var err error From efb548ebcdcba78eee48d93b12dd5b9b9312588d Mon Sep 17 00:00:00 2001 From: Pablo RUTH Date: Mon, 16 Dec 2024 14:09:55 +0100 Subject: [PATCH 121/163] fix: don't try to read/unmarshal response content when empty (#2361) Co-authored-by: Pablo RUTH --- scw/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scw/client.go b/scw/client.go index 9cd76b44e..a39db9b48 100644 --- a/scw/client.go +++ b/scw/client.go @@ -230,7 +230,7 @@ func (c *Client) do(req *ScalewayRequest, res interface{}) (sdkErr error) { return sdkErr } - if res != nil { + if res != nil && httpResponse.ContentLength > 0 { contentType := httpResponse.Header.Get("Content-Type") if strings.HasPrefix(contentType, "application/json") { From 5efaec4f1587390603588209ac5de801dfc6967e Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 16 Dec 2024 14:20:14 +0100 Subject: [PATCH 122/163] feat(webhosting): add dns status and offer name to hosting summary (#2359) --- api/webhosting/v1/webhosting_sdk.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index d451f9e12..5a53fd673 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -918,6 +918,13 @@ type HostingSummary struct { // Protected: whether the hosting is protected or not. Protected bool `json:"protected"` + // DNSStatus: DNS status of the Web Hosting plan. + // Default value: unknown_status + DNSStatus DNSRecordsStatus `json:"dns_status"` + + // OfferName: name of the active offer for the Web Hosting plan. + OfferName string `json:"offer_name"` + // Region: region where the Web Hosting plan is hosted. Region scw.Region `json:"region"` } From d43b2b5b564505b396140d71b351148c94e5b7a2 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 16 Dec 2024 14:20:48 +0100 Subject: [PATCH 123/163] feat(marketplace): add description for the label field (#2360) --- api/marketplace/v2/marketplace_sdk.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/marketplace/v2/marketplace_sdk.go b/api/marketplace/v2/marketplace_sdk.go index 1afaae249..12639f459 100644 --- a/api/marketplace/v2/marketplace_sdk.go +++ b/api/marketplace/v2/marketplace_sdk.go @@ -240,6 +240,7 @@ type Image struct { ValidUntil *time.Time `json:"valid_until"` // Label: typically an identifier for a distribution (ex. "ubuntu_focal"). + // This label can be used in the image field of the server creation request. Label string `json:"label"` } @@ -257,7 +258,7 @@ type LocalImage struct { // Zone: availability Zone where this local image is available. Zone scw.Zone `json:"zone"` - // Label: image label this image belongs to. + // Label: this label can be used in the image field of the server creation request. Label string `json:"label"` // Type: type of this local image. From cd1f7447cd0814c0b045e456bdf58093515e7fa4 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 16 Dec 2024 14:23:21 +0100 Subject: [PATCH 124/163] feat(vpcgw): enable v2 (#2362) Co-authored-by: Yacine Fodil <105779815+yfodil@users.noreply.github.com> --- api/tem/v1alpha1/tem_sdk.go | 6 + api/vpcgw/v2/vpcgw_sdk.go | 1918 +++++++++++++++++++++++++++++++++++ 2 files changed, 1924 insertions(+) create mode 100644 api/vpcgw/v2/vpcgw_sdk.go diff --git a/api/tem/v1alpha1/tem_sdk.go b/api/tem/v1alpha1/tem_sdk.go index b43fabacf..d8e0aaffa 100644 --- a/api/tem/v1alpha1/tem_sdk.go +++ b/api/tem/v1alpha1/tem_sdk.go @@ -634,6 +634,10 @@ const ( WebhookEventTypeEmailSpam = WebhookEventType("email_spam") // The email hard-bounced with a "mailbox not found" error. WebhookEventTypeEmailMailboxNotFound = WebhookEventType("email_mailbox_not_found") + // The email was blocked before it was sent, as the recipient matches a blocklist. + WebhookEventTypeEmailBlocklisted = WebhookEventType("email_blocklisted") + // A new blocklist is created. + WebhookEventTypeBlocklistCreated = WebhookEventType("blocklist_created") ) func (enum WebhookEventType) String() string { @@ -653,6 +657,8 @@ func (enum WebhookEventType) Values() []WebhookEventType { "email_delivered", "email_spam", "email_mailbox_not_found", + "email_blocklisted", + "blocklist_created", } } diff --git a/api/vpcgw/v2/vpcgw_sdk.go b/api/vpcgw/v2/vpcgw_sdk.go new file mode 100644 index 000000000..6ec161c19 --- /dev/null +++ b/api/vpcgw/v2/vpcgw_sdk.go @@ -0,0 +1,1918 @@ +// This file was automatically generated. DO NOT EDIT. +// If you have any remark or suggestion do not hesitate to open an issue. + +// Package vpcgw provides methods and message types of the vpcgw v2 API. +package vpcgw + +import ( + "bytes" + "encoding/json" + "fmt" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/scaleway/scaleway-sdk-go/errors" + "github.com/scaleway/scaleway-sdk-go/marshaler" + "github.com/scaleway/scaleway-sdk-go/namegenerator" + "github.com/scaleway/scaleway-sdk-go/parameter" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +// always import dependencies +var ( + _ fmt.Stringer + _ json.Unmarshaler + _ url.URL + _ net.IP + _ http.Header + _ bytes.Reader + _ time.Time + _ = strings.Join + + _ scw.ScalewayRequest + _ marshaler.Duration + _ scw.File + _ = parameter.AddToQuery + _ = namegenerator.GetRandomName +) + +type GatewayNetworkStatus string + +const ( + GatewayNetworkStatusUnknownStatus = GatewayNetworkStatus("unknown_status") + GatewayNetworkStatusCreated = GatewayNetworkStatus("created") + GatewayNetworkStatusAttaching = GatewayNetworkStatus("attaching") + GatewayNetworkStatusConfiguring = GatewayNetworkStatus("configuring") + GatewayNetworkStatusReady = GatewayNetworkStatus("ready") + GatewayNetworkStatusDetaching = GatewayNetworkStatus("detaching") +) + +func (enum GatewayNetworkStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum GatewayNetworkStatus) Values() []GatewayNetworkStatus { + return []GatewayNetworkStatus{ + "unknown_status", + "created", + "attaching", + "configuring", + "ready", + "detaching", + } +} + +func (enum GatewayNetworkStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *GatewayNetworkStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = GatewayNetworkStatus(GatewayNetworkStatus(tmp).String()) + return nil +} + +type GatewayStatus string + +const ( + GatewayStatusUnknownStatus = GatewayStatus("unknown_status") + GatewayStatusStopped = GatewayStatus("stopped") + GatewayStatusAllocating = GatewayStatus("allocating") + GatewayStatusConfiguring = GatewayStatus("configuring") + GatewayStatusRunning = GatewayStatus("running") + GatewayStatusStopping = GatewayStatus("stopping") + GatewayStatusFailed = GatewayStatus("failed") + GatewayStatusDeleting = GatewayStatus("deleting") + GatewayStatusLocked = GatewayStatus("locked") +) + +func (enum GatewayStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum GatewayStatus) Values() []GatewayStatus { + return []GatewayStatus{ + "unknown_status", + "stopped", + "allocating", + "configuring", + "running", + "stopping", + "failed", + "deleting", + "locked", + } +} + +func (enum GatewayStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *GatewayStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = GatewayStatus(GatewayStatus(tmp).String()) + return nil +} + +type ListGatewayNetworksRequestOrderBy string + +const ( + ListGatewayNetworksRequestOrderByCreatedAtAsc = ListGatewayNetworksRequestOrderBy("created_at_asc") + ListGatewayNetworksRequestOrderByCreatedAtDesc = ListGatewayNetworksRequestOrderBy("created_at_desc") + ListGatewayNetworksRequestOrderByStatusAsc = ListGatewayNetworksRequestOrderBy("status_asc") + ListGatewayNetworksRequestOrderByStatusDesc = ListGatewayNetworksRequestOrderBy("status_desc") +) + +func (enum ListGatewayNetworksRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListGatewayNetworksRequestOrderBy) Values() []ListGatewayNetworksRequestOrderBy { + return []ListGatewayNetworksRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "status_asc", + "status_desc", + } +} + +func (enum ListGatewayNetworksRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListGatewayNetworksRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListGatewayNetworksRequestOrderBy(ListGatewayNetworksRequestOrderBy(tmp).String()) + return nil +} + +type ListGatewaysRequestOrderBy string + +const ( + ListGatewaysRequestOrderByCreatedAtAsc = ListGatewaysRequestOrderBy("created_at_asc") + ListGatewaysRequestOrderByCreatedAtDesc = ListGatewaysRequestOrderBy("created_at_desc") + ListGatewaysRequestOrderByNameAsc = ListGatewaysRequestOrderBy("name_asc") + ListGatewaysRequestOrderByNameDesc = ListGatewaysRequestOrderBy("name_desc") + ListGatewaysRequestOrderByTypeAsc = ListGatewaysRequestOrderBy("type_asc") + ListGatewaysRequestOrderByTypeDesc = ListGatewaysRequestOrderBy("type_desc") + ListGatewaysRequestOrderByStatusAsc = ListGatewaysRequestOrderBy("status_asc") + ListGatewaysRequestOrderByStatusDesc = ListGatewaysRequestOrderBy("status_desc") +) + +func (enum ListGatewaysRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListGatewaysRequestOrderBy) Values() []ListGatewaysRequestOrderBy { + return []ListGatewaysRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "name_asc", + "name_desc", + "type_asc", + "type_desc", + "status_asc", + "status_desc", + } +} + +func (enum ListGatewaysRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListGatewaysRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListGatewaysRequestOrderBy(ListGatewaysRequestOrderBy(tmp).String()) + return nil +} + +type ListIPsRequestOrderBy string + +const ( + ListIPsRequestOrderByCreatedAtAsc = ListIPsRequestOrderBy("created_at_asc") + ListIPsRequestOrderByCreatedAtDesc = ListIPsRequestOrderBy("created_at_desc") + ListIPsRequestOrderByAddressAsc = ListIPsRequestOrderBy("address_asc") + ListIPsRequestOrderByAddressDesc = ListIPsRequestOrderBy("address_desc") + ListIPsRequestOrderByReverseAsc = ListIPsRequestOrderBy("reverse_asc") + ListIPsRequestOrderByReverseDesc = ListIPsRequestOrderBy("reverse_desc") +) + +func (enum ListIPsRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListIPsRequestOrderBy) Values() []ListIPsRequestOrderBy { + return []ListIPsRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "address_asc", + "address_desc", + "reverse_asc", + "reverse_desc", + } +} + +func (enum ListIPsRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListIPsRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListIPsRequestOrderBy(ListIPsRequestOrderBy(tmp).String()) + return nil +} + +type ListPatRulesRequestOrderBy string + +const ( + ListPatRulesRequestOrderByCreatedAtAsc = ListPatRulesRequestOrderBy("created_at_asc") + ListPatRulesRequestOrderByCreatedAtDesc = ListPatRulesRequestOrderBy("created_at_desc") + ListPatRulesRequestOrderByPublicPortAsc = ListPatRulesRequestOrderBy("public_port_asc") + ListPatRulesRequestOrderByPublicPortDesc = ListPatRulesRequestOrderBy("public_port_desc") +) + +func (enum ListPatRulesRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListPatRulesRequestOrderBy) Values() []ListPatRulesRequestOrderBy { + return []ListPatRulesRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "public_port_asc", + "public_port_desc", + } +} + +func (enum ListPatRulesRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListPatRulesRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListPatRulesRequestOrderBy(ListPatRulesRequestOrderBy(tmp).String()) + return nil +} + +type PatRuleProtocol string + +const ( + PatRuleProtocolUnknownProtocol = PatRuleProtocol("unknown_protocol") + PatRuleProtocolBoth = PatRuleProtocol("both") + PatRuleProtocolTCP = PatRuleProtocol("tcp") + PatRuleProtocolUDP = PatRuleProtocol("udp") +) + +func (enum PatRuleProtocol) String() string { + if enum == "" { + // return default value if empty + return "unknown_protocol" + } + return string(enum) +} + +func (enum PatRuleProtocol) Values() []PatRuleProtocol { + return []PatRuleProtocol{ + "unknown_protocol", + "both", + "tcp", + "udp", + } +} + +func (enum PatRuleProtocol) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *PatRuleProtocol) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = PatRuleProtocol(PatRuleProtocol(tmp).String()) + return nil +} + +// GatewayNetwork: gateway network. +type GatewayNetwork struct { + // ID: ID of the Public Gateway-Private Network connection. + ID string `json:"id"` + + // CreatedAt: connection creation date. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: connection last modification date. + UpdatedAt *time.Time `json:"updated_at"` + + // GatewayID: ID of the connected Public Gateway. + GatewayID string `json:"gateway_id"` + + // PrivateNetworkID: ID of the connected Private Network. + PrivateNetworkID string `json:"private_network_id"` + + // MacAddress: mAC address of the gateway in the Private Network (if the gateway is up and running). + MacAddress *string `json:"mac_address"` + + // MasqueradeEnabled: defines whether the gateway masquerades traffic for this Private Network (Dynamic NAT). + MasqueradeEnabled bool `json:"masquerade_enabled"` + + // Status: current status of the Public Gateway's connection to the Private Network. + // Default value: unknown_status + Status GatewayNetworkStatus `json:"status"` + + // PushDefaultRoute: enabling the default route also enables masquerading. + PushDefaultRoute bool `json:"push_default_route"` + + // IpamIPID: use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + IpamIPID string `json:"ipam_ip_id"` + + // Zone: zone of the GatewayNetwork connection. + Zone scw.Zone `json:"zone"` +} + +// IP: ip. +type IP struct { + // ID: IP address ID. + ID string `json:"id"` + + // OrganizationID: owning Organization. + OrganizationID string `json:"organization_id"` + + // ProjectID: owning Project. + ProjectID string `json:"project_id"` + + // CreatedAt: IP address creation date. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: IP address last modification date. + UpdatedAt *time.Time `json:"updated_at"` + + // Tags: tags associated with the IP address. + Tags []string `json:"tags"` + + // Address: the IP address itself. + Address net.IP `json:"address"` + + // Reverse: reverse domain name for the IP address. + Reverse *string `json:"reverse"` + + // GatewayID: public Gateway associated with the IP address. + GatewayID *string `json:"gateway_id"` + + // Zone: zone of the IP address. + Zone scw.Zone `json:"zone"` +} + +// GatewayType: gateway type. +type GatewayType struct { + // Name: public Gateway type name. + Name string `json:"name"` + + // Bandwidth: bandwidth, in bps, of the Public Gateway. This is the public bandwidth to the outer Internet, and the internal bandwidth to each connected Private Networks. + Bandwidth uint64 `json:"bandwidth"` + + // Zone: zone the Public Gateway type is available in. + Zone scw.Zone `json:"zone"` +} + +// Gateway: gateway. +type Gateway struct { + // ID: ID of the gateway. + ID string `json:"id"` + + // OrganizationID: owning Organization. + OrganizationID string `json:"organization_id"` + + // ProjectID: owning Project. + ProjectID string `json:"project_id"` + + // CreatedAt: gateway creation date. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: gateway last modification date. + UpdatedAt *time.Time `json:"updated_at"` + + // Type: gateway type name (commercial offer). + Type string `json:"type"` + + // Bandwidth: bandwidth available of the gateway. + Bandwidth uint64 `json:"bandwidth"` + + // Status: current status of the gateway. + // Default value: unknown_status + Status GatewayStatus `json:"status"` + + // Name: name of the gateway. + Name string `json:"name"` + + // Tags: tags associated with the gateway. + Tags []string `json:"tags"` + + // IPv4: public IPv4 address of the gateway. + IPv4 *IP `json:"ipv4"` + + // GatewayNetworks: gatewayNetwork objects attached to the gateway (each one represents a connection to a Private Network). + GatewayNetworks []*GatewayNetwork `json:"gateway_networks"` + + // Version: version of the running gateway software. + Version *string `json:"version"` + + // CanUpgradeTo: newly available gateway software version that can be updated to. + CanUpgradeTo *string `json:"can_upgrade_to"` + + // BastionEnabled: defines whether SSH bastion is enabled on the gateway. + BastionEnabled bool `json:"bastion_enabled"` + + // BastionPort: port of the SSH bastion. + BastionPort uint32 `json:"bastion_port"` + + // SMTPEnabled: defines whether SMTP traffic is allowed to pass through the gateway. + SMTPEnabled bool `json:"smtp_enabled"` + + // IsLegacy: defines whether the gateway uses non-IPAM IP configurations. + IsLegacy bool `json:"is_legacy"` + + // Zone: zone of the gateway. + Zone scw.Zone `json:"zone"` +} + +// PatRule: pat rule. +type PatRule struct { + // ID: pAT rule ID. + ID string `json:"id"` + + // GatewayID: gateway the PAT rule applies to. + GatewayID string `json:"gateway_id"` + + // CreatedAt: pAT rule creation date. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: pAT rule last modification date. + UpdatedAt *time.Time `json:"updated_at"` + + // PublicPort: public port to listen on. + PublicPort uint32 `json:"public_port"` + + // PrivateIP: private IP address to forward data to. + PrivateIP net.IP `json:"private_ip"` + + // PrivatePort: private port to translate to. + PrivatePort uint32 `json:"private_port"` + + // Protocol: protocol the rule applies to. + // Default value: unknown_protocol + Protocol PatRuleProtocol `json:"protocol"` + + // Zone: zone of the PAT rule. + Zone scw.Zone `json:"zone"` +} + +// SetPatRulesRequestRule: set pat rules request rule. +type SetPatRulesRequestRule struct { + // PublicPort: public port to listen on. Uniquely identifies the rule, and a matching rule will be updated with the new parameters. + PublicPort uint32 `json:"public_port"` + + // PrivateIP: private IP to forward data to. + PrivateIP net.IP `json:"private_ip"` + + // PrivatePort: private port to translate to. + PrivatePort uint32 `json:"private_port"` + + // Protocol: protocol the rule should apply to. + // Default value: unknown_protocol + Protocol PatRuleProtocol `json:"protocol"` +} + +// CreateGatewayNetworkRequest: create gateway network request. +type CreateGatewayNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: public Gateway to connect. + GatewayID string `json:"gateway_id"` + + // PrivateNetworkID: private Network to connect. + PrivateNetworkID string `json:"private_network_id"` + + // EnableMasquerade: defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + EnableMasquerade bool `json:"enable_masquerade"` + + // PushDefaultRoute: enabling the default route also enables masquerading. + PushDefaultRoute bool `json:"push_default_route"` + + // IpamIPID: use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + IpamIPID *string `json:"ipam_ip_id,omitempty"` +} + +// CreateGatewayRequest: create gateway request. +type CreateGatewayRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ProjectID: scaleway Project to create the gateway in. + ProjectID string `json:"project_id"` + + // Name: name for the gateway. + Name string `json:"name"` + + // Tags: tags for the gateway. + Tags []string `json:"tags"` + + // Type: gateway type (commercial offer type). + Type string `json:"type"` + + // IPID: existing IP address to attach to the gateway. + IPID *string `json:"ip_id,omitempty"` + + // EnableSMTP: defines whether SMTP traffic should be allowed pass through the gateway. + EnableSMTP bool `json:"enable_smtp"` + + // EnableBastion: defines whether SSH bastion should be enabled the gateway. + EnableBastion bool `json:"enable_bastion"` + + // BastionPort: port of the SSH bastion. + BastionPort *uint32 `json:"bastion_port,omitempty"` +} + +// CreateIPRequest: create ip request. +type CreateIPRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ProjectID: project to create the IP address in. + ProjectID string `json:"project_id"` + + // Tags: tags to give to the IP address. + Tags []string `json:"tags"` +} + +// CreatePatRuleRequest: create pat rule request. +type CreatePatRuleRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the Gateway on which to create the rule. + GatewayID string `json:"gateway_id"` + + // PublicPort: public port to listen on. + PublicPort uint32 `json:"public_port"` + + // PrivateIP: private IP to forward data to. + PrivateIP net.IP `json:"private_ip"` + + // PrivatePort: private port to translate to. + PrivatePort uint32 `json:"private_port"` + + // Protocol: protocol the rule should apply to. + // Default value: unknown_protocol + Protocol PatRuleProtocol `json:"protocol"` +} + +// DeleteGatewayNetworkRequest: delete gateway network request. +type DeleteGatewayNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayNetworkID: ID of the GatewayNetwork to delete. + GatewayNetworkID string `json:"-"` +} + +// DeleteGatewayRequest: delete gateway request. +type DeleteGatewayRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway to delete. + GatewayID string `json:"-"` +} + +// DeleteIPRequest: delete ip request. +type DeleteIPRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // IPID: ID of the IP address to delete. + IPID string `json:"-"` +} + +// DeletePatRuleRequest: delete pat rule request. +type DeletePatRuleRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // PatRuleID: ID of the PAT rule to delete. + PatRuleID string `json:"-"` +} + +// GetGatewayNetworkRequest: get gateway network request. +type GetGatewayNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayNetworkID: ID of the GatewayNetwork to fetch. + GatewayNetworkID string `json:"-"` +} + +// GetGatewayRequest: get gateway request. +type GetGatewayRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway to fetch. + GatewayID string `json:"-"` +} + +// GetIPRequest: get ip request. +type GetIPRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // IPID: ID of the IP address to get. + IPID string `json:"-"` +} + +// GetPatRuleRequest: get pat rule request. +type GetPatRuleRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // PatRuleID: ID of the PAT rule to get. + PatRuleID string `json:"-"` +} + +// ListGatewayNetworksRequest: list gateway networks request. +type ListGatewayNetworksRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // OrderBy: order in which to return results. + // Default value: created_at_asc + OrderBy ListGatewayNetworksRequestOrderBy `json:"-"` + + // Page: page number. + Page *int32 `json:"-"` + + // PageSize: gatewayNetworks per page. + PageSize *uint32 `json:"-"` + + // Status: filter for GatewayNetworks with these status. Use `unknown` to include all statuses. + Status []GatewayNetworkStatus `json:"-"` + + // GatewayIDs: filter for GatewayNetworks connected to these gateways. + GatewayIDs []string `json:"-"` + + // PrivateNetworkIDs: filter for GatewayNetworks connected to these Private Networks. + PrivateNetworkIDs []string `json:"-"` + + // MasqueradeEnabled: filter for GatewayNetworks with this `enable_masquerade` setting. + MasqueradeEnabled *bool `json:"-"` +} + +// ListGatewayNetworksResponse: list gateway networks response. +type ListGatewayNetworksResponse struct { + // GatewayNetworks: gatewayNetworks on this page. + GatewayNetworks []*GatewayNetwork `json:"gateway_networks"` + + // TotalCount: total GatewayNetworks count matching the filter. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListGatewayNetworksResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListGatewayNetworksResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListGatewayNetworksResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.GatewayNetworks = append(r.GatewayNetworks, results.GatewayNetworks...) + r.TotalCount += uint64(len(results.GatewayNetworks)) + return uint64(len(results.GatewayNetworks)), nil +} + +// ListGatewayTypesRequest: list gateway types request. +type ListGatewayTypesRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` +} + +// ListGatewayTypesResponse: list gateway types response. +type ListGatewayTypesResponse struct { + // Types: available types of Public Gateway. + Types []*GatewayType `json:"types"` +} + +// ListGatewaysRequest: list gateways request. +type ListGatewaysRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // OrderBy: order in which to return results. + // Default value: created_at_asc + OrderBy ListGatewaysRequestOrderBy `json:"-"` + + // Page: page number to return. + Page *int32 `json:"-"` + + // PageSize: gateways per page. + PageSize *uint32 `json:"-"` + + // OrganizationID: include only gateways in this Organization. + OrganizationID *string `json:"-"` + + // ProjectID: include only gateways in this Project. + ProjectID *string `json:"-"` + + // Name: filter for gateways which have this search term in their name. + Name *string `json:"-"` + + // Tags: filter for gateways with these tags. + Tags []string `json:"-"` + + // Types: filter for gateways of these types. + Types []string `json:"-"` + + // Status: filter for gateways with these status. Use `unknown` to include all statuses. + Status []GatewayStatus `json:"-"` + + // PrivateNetworkIDs: filter for gateways attached to these Private Networks. + PrivateNetworkIDs []string `json:"-"` + + // IncludeLegacy: include also legacy gateways. + IncludeLegacy *bool `json:"-"` +} + +// ListGatewaysResponse: list gateways response. +type ListGatewaysResponse struct { + // Gateways: gateways on this page. + Gateways []*Gateway `json:"gateways"` + + // TotalCount: total count of gateways matching the filter. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListGatewaysResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListGatewaysResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListGatewaysResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Gateways = append(r.Gateways, results.Gateways...) + r.TotalCount += uint64(len(results.Gateways)) + return uint64(len(results.Gateways)), nil +} + +// ListIPsRequest: list i ps request. +type ListIPsRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // OrderBy: order in which to return results. + // Default value: created_at_asc + OrderBy ListIPsRequestOrderBy `json:"-"` + + // Page: page number. + Page *int32 `json:"-"` + + // PageSize: IP addresses per page. + PageSize *uint32 `json:"-"` + + // OrganizationID: include only gateways in this Organization. + OrganizationID *string `json:"-"` + + // ProjectID: filter for IP addresses in this Project. + ProjectID *string `json:"-"` + + // Tags: filter for IP addresses with these tags. + Tags []string `json:"-"` + + // Reverse: filter for IP addresses that have a reverse containing this string. + Reverse *string `json:"-"` + + // IsFree: filter based on whether the IP is attached to a gateway or not. + IsFree *bool `json:"-"` +} + +// ListIPsResponse: list i ps response. +type ListIPsResponse struct { + // IPs: IP addresses on this page. + IPs []*IP `json:"ips"` + + // TotalCount: total count of IP addresses matching the filter. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListIPsResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListIPsResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListIPsResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.IPs = append(r.IPs, results.IPs...) + r.TotalCount += uint64(len(results.IPs)) + return uint64(len(results.IPs)), nil +} + +// ListPatRulesRequest: list pat rules request. +type ListPatRulesRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // OrderBy: order in which to return results. + // Default value: created_at_asc + OrderBy ListPatRulesRequestOrderBy `json:"-"` + + // Page: page number. + Page *int32 `json:"-"` + + // PageSize: pAT rules per page. + PageSize *uint32 `json:"-"` + + // GatewayIDs: filter for PAT rules on these gateways. + GatewayIDs []string `json:"-"` + + // PrivateIPs: filter for PAT rules targeting these private ips. + PrivateIPs []string `json:"-"` + + // Protocol: filter for PAT rules with this protocol. + // Default value: unknown_protocol + Protocol PatRuleProtocol `json:"-"` +} + +// ListPatRulesResponse: list pat rules response. +type ListPatRulesResponse struct { + // PatRules: array of PAT rules matching the filter. + PatRules []*PatRule `json:"pat_rules"` + + // TotalCount: total count of PAT rules matching the filter. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListPatRulesResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListPatRulesResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListPatRulesResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.PatRules = append(r.PatRules, results.PatRules...) + r.TotalCount += uint64(len(results.PatRules)) + return uint64(len(results.PatRules)), nil +} + +// RefreshSSHKeysRequest: refresh ssh keys request. +type RefreshSSHKeysRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway to refresh SSH keys on. + GatewayID string `json:"-"` +} + +// SetPatRulesRequest: set pat rules request. +type SetPatRulesRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway on which to set the PAT rules. + GatewayID string `json:"gateway_id"` + + // PatRules: new list of PAT rules. + PatRules []*SetPatRulesRequestRule `json:"pat_rules"` +} + +// SetPatRulesResponse: set pat rules response. +type SetPatRulesResponse struct { + // PatRules: list of PAT rules. + PatRules []*PatRule `json:"pat_rules"` +} + +// UpdateGatewayNetworkRequest: update gateway network request. +type UpdateGatewayNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayNetworkID: ID of the GatewayNetwork to update. + GatewayNetworkID string `json:"-"` + + // EnableMasquerade: defines whether to enable masquerade (dynamic NAT) on the GatewayNetwork. + EnableMasquerade *bool `json:"enable_masquerade,omitempty"` + + // PushDefaultRoute: enabling the default route also enables masquerading. + PushDefaultRoute *bool `json:"push_default_route,omitempty"` + + // IpamIPID: use this IPAM-booked IP ID as the Gateway's IP in this Private Network. + IpamIPID *string `json:"ipam_ip_id,omitempty"` +} + +// UpdateGatewayRequest: update gateway request. +type UpdateGatewayRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway to update. + GatewayID string `json:"-"` + + // Name: name for the gateway. + Name *string `json:"name,omitempty"` + + // Tags: tags for the gateway. + Tags *[]string `json:"tags,omitempty"` + + // EnableBastion: defines whether SSH bastion should be enabled the gateway. + EnableBastion *bool `json:"enable_bastion,omitempty"` + + // BastionPort: port of the SSH bastion. + BastionPort *uint32 `json:"bastion_port,omitempty"` + + // EnableSMTP: defines whether SMTP traffic should be allowed to pass through the gateway. + EnableSMTP *bool `json:"enable_smtp,omitempty"` +} + +// UpdateIPRequest: update ip request. +type UpdateIPRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // IPID: ID of the IP address to update. + IPID string `json:"-"` + + // Tags: tags to give to the IP address. + Tags *[]string `json:"tags,omitempty"` + + // Reverse: reverse to set on the address. Empty string to unset. + Reverse *string `json:"reverse,omitempty"` + + // GatewayID: gateway to attach the IP address to. Empty string to detach. + GatewayID *string `json:"gateway_id,omitempty"` +} + +// UpdatePatRuleRequest: update pat rule request. +type UpdatePatRuleRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // PatRuleID: ID of the PAT rule to update. + PatRuleID string `json:"-"` + + // PublicPort: public port to listen on. + PublicPort *uint32 `json:"public_port,omitempty"` + + // PrivateIP: private IP to forward data to. + PrivateIP *net.IP `json:"private_ip,omitempty"` + + // PrivatePort: private port to translate to. + PrivatePort *uint32 `json:"private_port,omitempty"` + + // Protocol: protocol the rule should apply to. + // Default value: unknown_protocol + Protocol PatRuleProtocol `json:"protocol"` +} + +// UpgradeGatewayRequest: upgrade gateway request. +type UpgradeGatewayRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway to upgrade. + GatewayID string `json:"-"` + + // Type: gateway type (commercial offer). + Type *string `json:"type,omitempty"` +} + +// This API allows you to manage your Public Gateways. +type API struct { + client *scw.Client +} + +// NewAPI returns a API object from a Scaleway client. +func NewAPI(client *scw.Client) *API { + return &API{ + client: client, + } +} +func (s *API) Zones() []scw.Zone { + return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar2, scw.ZoneNlAms1, scw.ZoneNlAms2, scw.ZoneNlAms3, scw.ZonePlWaw1, scw.ZonePlWaw2, scw.ZonePlWaw3} +} + +// ListGateways: List Public Gateways in a given Scaleway Organization or Project. By default, results are displayed in ascending order of creation date. +func (s *API) ListGateways(req *ListGatewaysRequest, opts ...scw.RequestOption) (*ListGatewaysResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "tags", req.Tags) + parameter.AddToQuery(query, "types", req.Types) + parameter.AddToQuery(query, "status", req.Status) + parameter.AddToQuery(query, "private_network_ids", req.PrivateNetworkIDs) + parameter.AddToQuery(query, "include_legacy", req.IncludeLegacy) + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways", + Query: query, + } + + var resp ListGatewaysResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetGateway: Get details of a Public Gateway, specified by its gateway ID. The response object contains full details of the gateway, including its **name**, **type**, **status** and more. +func (s *API) GetGateway(req *GetGatewayRequest, opts ...scw.RequestOption) (*Gateway, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return nil, errors.New("field GatewayID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "", + } + + var resp Gateway + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateGateway: Create a new Public Gateway in the specified Scaleway Project, defining its **name**, **type** and other configuration details such as whether to enable SSH bastion. +func (s *API) CreateGateway(req *CreateGatewayRequest, opts ...scw.RequestOption) (*Gateway, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + if req.Name == "" { + req.Name = namegenerator.GetRandomName("gw") + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Gateway + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateGateway: Update the parameters of an existing Public Gateway, for example, its **name**, **tags**, **SSH bastion configuration**, and **DNS servers**. +func (s *API) UpdateGateway(req *UpdateGatewayRequest, opts ...scw.RequestOption) (*Gateway, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return nil, errors.New("field GatewayID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Gateway + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteGateway: Delete an existing Public Gateway, specified by its gateway ID. This action is irreversible. +func (s *API) DeleteGateway(req *DeleteGatewayRequest, opts ...scw.RequestOption) (*Gateway, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return nil, errors.New("field GatewayID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "", + } + + var resp Gateway + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpgradeGateway: Upgrade a given Public Gateway to the newest software version or to a different commercial offer type. This applies the latest bugfixes and features to your Public Gateway. Note that gateway service will be interrupted during the update. +func (s *API) UpgradeGateway(req *UpgradeGatewayRequest, opts ...scw.RequestOption) (*Gateway, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return nil, errors.New("field GatewayID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "/upgrade", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Gateway + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListGatewayNetworks: List the connections between Public Gateways and Private Networks (a connection = a GatewayNetwork). You can choose to filter by `gateway-id` to list all Private Networks attached to the specified Public Gateway, or by `private_network_id` to list all Public Gateways attached to the specified Private Network. Other query parameters are also available. The result is an array of GatewayNetwork objects, each giving details of the connection between a given Public Gateway and a given Private Network. +func (s *API) ListGatewayNetworks(req *ListGatewayNetworksRequest, opts ...scw.RequestOption) (*ListGatewayNetworksResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "status", req.Status) + parameter.AddToQuery(query, "gateway_ids", req.GatewayIDs) + parameter.AddToQuery(query, "private_network_ids", req.PrivateNetworkIDs) + parameter.AddToQuery(query, "masquerade_enabled", req.MasqueradeEnabled) + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateway-networks", + Query: query, + } + + var resp ListGatewayNetworksResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetGatewayNetwork: Get details of a given connection between a Public Gateway and a Private Network (this connection = a GatewayNetwork), specified by its `gateway_network_id`. The response object contains details of the connection including the IDs of the Public Gateway and Private Network, the dates the connection was created/updated and its configuration settings. +func (s *API) GetGatewayNetwork(req *GetGatewayNetworkRequest, opts ...scw.RequestOption) (*GatewayNetwork, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayNetworkID) == "" { + return nil, errors.New("field GatewayNetworkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateway-networks/" + fmt.Sprint(req.GatewayNetworkID) + "", + } + + var resp GatewayNetwork + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateGatewayNetwork: Attach a specific Public Gateway to a specific Private Network (create a GatewayNetwork). You can configure parameters for the connection including whether to enable masquerade (dynamic NAT), and more. +func (s *API) CreateGatewayNetwork(req *CreateGatewayNetworkRequest, opts ...scw.RequestOption) (*GatewayNetwork, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateway-networks", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp GatewayNetwork + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateGatewayNetwork: Update the configuration parameters of a connection between a given Public Gateway and Private Network (the connection = a GatewayNetwork). Updatable parameters include whether to enable traffic masquerade (dynamic NAT). +func (s *API) UpdateGatewayNetwork(req *UpdateGatewayNetworkRequest, opts ...scw.RequestOption) (*GatewayNetwork, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayNetworkID) == "" { + return nil, errors.New("field GatewayNetworkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateway-networks/" + fmt.Sprint(req.GatewayNetworkID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp GatewayNetwork + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteGatewayNetwork: Detach a given Public Gateway from a given Private Network, i.e. delete a GatewayNetwork specified by a gateway_network_id. +func (s *API) DeleteGatewayNetwork(req *DeleteGatewayNetworkRequest, opts ...scw.RequestOption) (*GatewayNetwork, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayNetworkID) == "" { + return nil, errors.New("field GatewayNetworkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateway-networks/" + fmt.Sprint(req.GatewayNetworkID) + "", + } + + var resp GatewayNetwork + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListPatRules: List PAT rules. You can filter by gateway ID to list all PAT rules for a particular gateway, or filter for PAT rules targeting a specific IP address or using a specific protocol. +func (s *API) ListPatRules(req *ListPatRulesRequest, opts ...scw.RequestOption) (*ListPatRulesResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "gateway_ids", req.GatewayIDs) + parameter.AddToQuery(query, "private_ips", req.PrivateIPs) + parameter.AddToQuery(query, "protocol", req.Protocol) + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/pat-rules", + Query: query, + } + + var resp ListPatRulesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetPatRule: Get a PAT rule, specified by its PAT rule ID. The response object gives full details of the PAT rule, including the Public Gateway it belongs to and the configuration settings in terms of public / private ports, private IP and protocol. +func (s *API) GetPatRule(req *GetPatRuleRequest, opts ...scw.RequestOption) (*PatRule, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.PatRuleID) == "" { + return nil, errors.New("field PatRuleID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/pat-rules/" + fmt.Sprint(req.PatRuleID) + "", + } + + var resp PatRule + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreatePatRule: Create a new PAT rule on a specified Public Gateway, defining the protocol to use, public port to listen on, and private port / IP address to map to. +func (s *API) CreatePatRule(req *CreatePatRuleRequest, opts ...scw.RequestOption) (*PatRule, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/pat-rules", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp PatRule + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdatePatRule: Update a PAT rule, specified by its PAT rule ID. Configuration settings including private/public port, private IP address and protocol can all be updated. +func (s *API) UpdatePatRule(req *UpdatePatRuleRequest, opts ...scw.RequestOption) (*PatRule, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.PatRuleID) == "" { + return nil, errors.New("field PatRuleID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/pat-rules/" + fmt.Sprint(req.PatRuleID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp PatRule + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// SetPatRules: Set a definitive list of PAT rules attached to a Public Gateway. Each rule is identified by its public port and protocol. This will sync the current PAT rule list on the gateway with the new list, creating, updating or deleting PAT rules accordingly. +func (s *API) SetPatRules(req *SetPatRulesRequest, opts ...scw.RequestOption) (*SetPatRulesResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PUT", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/pat-rules", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp SetPatRulesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeletePatRule: Delete a PAT rule, identified by its PAT rule ID. This action is irreversible. +func (s *API) DeletePatRule(req *DeletePatRuleRequest, opts ...scw.RequestOption) error { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.PatRuleID) == "" { + return errors.New("field PatRuleID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/pat-rules/" + fmt.Sprint(req.PatRuleID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} + +// ListGatewayTypes: List the different Public Gateway commercial offer types available at Scaleway. The response is an array of objects describing the name and technical details of each available gateway type. +func (s *API) ListGatewayTypes(req *ListGatewayTypesRequest, opts ...scw.RequestOption) (*ListGatewayTypesResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateway-types", + } + + var resp ListGatewayTypesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListIPs: List Public Gateway flexible IP addresses. A number of filter options are available for limiting results in the response. +func (s *API) ListIPs(req *ListIPsRequest, opts ...scw.RequestOption) (*ListIPsResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "tags", req.Tags) + parameter.AddToQuery(query, "reverse", req.Reverse) + parameter.AddToQuery(query, "is_free", req.IsFree) + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/ips", + Query: query, + } + + var resp ListIPsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetIP: Get details of a Public Gateway flexible IP address, identified by its IP ID. The response object contains information including which (if any) Public Gateway using this IP address, the reverse and various other metadata. +func (s *API) GetIP(req *GetIPRequest, opts ...scw.RequestOption) (*IP, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.IPID) == "" { + return nil, errors.New("field IPID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/ips/" + fmt.Sprint(req.IPID) + "", + } + + var resp IP + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateIP: Create (reserve) a new flexible IP address that can be used for a Public Gateway in a specified Scaleway Project. +func (s *API) CreateIP(req *CreateIPRequest, opts ...scw.RequestOption) (*IP, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/ips", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp IP + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateIP: Update details of an existing flexible IP address, including its tags, reverse and the Public Gateway it is assigned to. +func (s *API) UpdateIP(req *UpdateIPRequest, opts ...scw.RequestOption) (*IP, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.IPID) == "" { + return nil, errors.New("field IPID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/ips/" + fmt.Sprint(req.IPID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp IP + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteIP: Delete a flexible IP address from your account. This action is irreversible. +func (s *API) DeleteIP(req *DeleteIPRequest, opts ...scw.RequestOption) error { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.IPID) == "" { + return errors.New("field IPID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/ips/" + fmt.Sprint(req.IPID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} + +// RefreshSSHKeys: Refresh the SSH keys of a given Public Gateway, specified by its gateway ID. This adds any new SSH keys in the gateway's Scaleway Project to the gateway itself. +func (s *API) RefreshSSHKeys(req *RefreshSSHKeysRequest, opts ...scw.RequestOption) (*Gateway, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return nil, errors.New("field GatewayID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "/refresh-ssh-keys", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Gateway + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} From 73ca1f49e793a5d1c5e200296af2cbff3c01f7f8 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 19 Dec 2024 09:31:23 +0100 Subject: [PATCH 125/163] feat(interlink): add support for v1beta1 (#2364) --- api/interlink/v1beta1/interlink_sdk.go | 1621 ++++++++++++++++++++++++ 1 file changed, 1621 insertions(+) create mode 100644 api/interlink/v1beta1/interlink_sdk.go diff --git a/api/interlink/v1beta1/interlink_sdk.go b/api/interlink/v1beta1/interlink_sdk.go new file mode 100644 index 000000000..6f1a6a04a --- /dev/null +++ b/api/interlink/v1beta1/interlink_sdk.go @@ -0,0 +1,1621 @@ +// This file was automatically generated. DO NOT EDIT. +// If you have any remark or suggestion do not hesitate to open an issue. + +// Package interlink provides methods and message types of the interlink v1beta1 API. +package interlink + +import ( + "bytes" + "encoding/json" + "fmt" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/scaleway/scaleway-sdk-go/errors" + "github.com/scaleway/scaleway-sdk-go/marshaler" + "github.com/scaleway/scaleway-sdk-go/namegenerator" + "github.com/scaleway/scaleway-sdk-go/parameter" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +// always import dependencies +var ( + _ fmt.Stringer + _ json.Unmarshaler + _ url.URL + _ net.IP + _ http.Header + _ bytes.Reader + _ time.Time + _ = strings.Join + + _ scw.ScalewayRequest + _ marshaler.Duration + _ scw.File + _ = parameter.AddToQuery + _ = namegenerator.GetRandomName +) + +type BgpStatus string + +const ( + BgpStatusUnknownBgpStatus = BgpStatus("unknown_bgp_status") + BgpStatusUp = BgpStatus("up") + BgpStatusDown = BgpStatus("down") +) + +func (enum BgpStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_bgp_status" + } + return string(enum) +} + +func (enum BgpStatus) Values() []BgpStatus { + return []BgpStatus{ + "unknown_bgp_status", + "up", + "down", + } +} + +func (enum BgpStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *BgpStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = BgpStatus(BgpStatus(tmp).String()) + return nil +} + +type LinkStatus string + +const ( + LinkStatusUnknownLinkStatus = LinkStatus("unknown_link_status") + LinkStatusConfiguring = LinkStatus("configuring") + LinkStatusFailed = LinkStatus("failed") + LinkStatusRequested = LinkStatus("requested") + LinkStatusRefused = LinkStatus("refused") + LinkStatusExpired = LinkStatus("expired") + LinkStatusProvisioning = LinkStatus("provisioning") + LinkStatusActive = LinkStatus("active") + LinkStatusLimitedConnectivity = LinkStatus("limited_connectivity") + LinkStatusAllDown = LinkStatus("all_down") + LinkStatusDeprovisioning = LinkStatus("deprovisioning") + LinkStatusDeleted = LinkStatus("deleted") + LinkStatusLocked = LinkStatus("locked") +) + +func (enum LinkStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_link_status" + } + return string(enum) +} + +func (enum LinkStatus) Values() []LinkStatus { + return []LinkStatus{ + "unknown_link_status", + "configuring", + "failed", + "requested", + "refused", + "expired", + "provisioning", + "active", + "limited_connectivity", + "all_down", + "deprovisioning", + "deleted", + "locked", + } +} + +func (enum LinkStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *LinkStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = LinkStatus(LinkStatus(tmp).String()) + return nil +} + +type ListLinksRequestOrderBy string + +const ( + ListLinksRequestOrderByCreatedAtAsc = ListLinksRequestOrderBy("created_at_asc") + ListLinksRequestOrderByCreatedAtDesc = ListLinksRequestOrderBy("created_at_desc") + ListLinksRequestOrderByNameAsc = ListLinksRequestOrderBy("name_asc") + ListLinksRequestOrderByNameDesc = ListLinksRequestOrderBy("name_desc") + ListLinksRequestOrderByStatusAsc = ListLinksRequestOrderBy("status_asc") + ListLinksRequestOrderByStatusDesc = ListLinksRequestOrderBy("status_desc") +) + +func (enum ListLinksRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListLinksRequestOrderBy) Values() []ListLinksRequestOrderBy { + return []ListLinksRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "name_asc", + "name_desc", + "status_asc", + "status_desc", + } +} + +func (enum ListLinksRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListLinksRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListLinksRequestOrderBy(ListLinksRequestOrderBy(tmp).String()) + return nil +} + +type ListPartnersRequestOrderBy string + +const ( + ListPartnersRequestOrderByNameAsc = ListPartnersRequestOrderBy("name_asc") + ListPartnersRequestOrderByNameDesc = ListPartnersRequestOrderBy("name_desc") +) + +func (enum ListPartnersRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "name_asc" + } + return string(enum) +} + +func (enum ListPartnersRequestOrderBy) Values() []ListPartnersRequestOrderBy { + return []ListPartnersRequestOrderBy{ + "name_asc", + "name_desc", + } +} + +func (enum ListPartnersRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListPartnersRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListPartnersRequestOrderBy(ListPartnersRequestOrderBy(tmp).String()) + return nil +} + +type ListPopsRequestOrderBy string + +const ( + ListPopsRequestOrderByNameAsc = ListPopsRequestOrderBy("name_asc") + ListPopsRequestOrderByNameDesc = ListPopsRequestOrderBy("name_desc") +) + +func (enum ListPopsRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "name_asc" + } + return string(enum) +} + +func (enum ListPopsRequestOrderBy) Values() []ListPopsRequestOrderBy { + return []ListPopsRequestOrderBy{ + "name_asc", + "name_desc", + } +} + +func (enum ListPopsRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListPopsRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListPopsRequestOrderBy(ListPopsRequestOrderBy(tmp).String()) + return nil +} + +type ListRoutingPoliciesRequestOrderBy string + +const ( + ListRoutingPoliciesRequestOrderByCreatedAtAsc = ListRoutingPoliciesRequestOrderBy("created_at_asc") + ListRoutingPoliciesRequestOrderByCreatedAtDesc = ListRoutingPoliciesRequestOrderBy("created_at_desc") + ListRoutingPoliciesRequestOrderByNameAsc = ListRoutingPoliciesRequestOrderBy("name_asc") + ListRoutingPoliciesRequestOrderByNameDesc = ListRoutingPoliciesRequestOrderBy("name_desc") +) + +func (enum ListRoutingPoliciesRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListRoutingPoliciesRequestOrderBy) Values() []ListRoutingPoliciesRequestOrderBy { + return []ListRoutingPoliciesRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "name_asc", + "name_desc", + } +} + +func (enum ListRoutingPoliciesRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListRoutingPoliciesRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListRoutingPoliciesRequestOrderBy(ListRoutingPoliciesRequestOrderBy(tmp).String()) + return nil +} + +// Link: link. +type Link struct { + // ID: unique identifier of the link. + ID string `json:"id"` + + // ProjectID: project ID. + ProjectID string `json:"project_id"` + + // OrganizationID: organization ID. + OrganizationID string `json:"organization_id"` + + // Name: name of the link. + Name string `json:"name"` + + // Tags: list of tags associated with the link. + Tags []string `json:"tags"` + + // PopID: ID of the PoP where the link's corresponding port is located. + PopID string `json:"pop_id"` + + // PartnerID: ID of the partner facilitating this link. + PartnerID *string `json:"partner_id"` + + // BandwidthMbps: rate limited bandwidth of the link. + BandwidthMbps uint64 `json:"bandwidth_mbps"` + + // Status: status of the link. + // Default value: unknown_link_status + Status LinkStatus `json:"status"` + + // BgpV4Status: status of the link's BGP IPv4 session. + // Default value: unknown_bgp_status + BgpV4Status BgpStatus `json:"bgp_v4_status"` + + // BgpV6Status: status of the link's BGP IPv6 session. + // Default value: unknown_bgp_status + BgpV6Status BgpStatus `json:"bgp_v6_status"` + + // VpcID: ID of the Scaleway VPC attached to the link. + VpcID *string `json:"vpc_id"` + + // RoutingPolicyID: ID of the routing policy attached to the link. + RoutingPolicyID *string `json:"routing_policy_id"` + + // EnableRoutePropagation: defines whether route propagation is enabled or not. To enable or disable route propagation, use the dedicated endpoint. + EnableRoutePropagation bool `json:"enable_route_propagation"` + + // CreatedAt: creation date of the link. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last modification date of the link. + UpdatedAt *time.Time `json:"updated_at"` + + // PairingKey: used to identify a link from a user or partner's point of view. + PairingKey string `json:"pairing_key"` + + // Region: region of the link. + Region scw.Region `json:"region"` +} + +// Partner: partner. +type Partner struct { + // ID: unique identifier of the partner. + ID string `json:"id"` + + // Name: name of the partner. + Name string `json:"name"` + + // ContactEmail: contact email address of partner. + ContactEmail string `json:"contact_email"` + + // LogoURL: image URL of the partner's logo. + LogoURL string `json:"logo_url"` + + // PortalURL: URL of the partner's portal. + PortalURL string `json:"portal_url"` + + // CreatedAt: creation date of the partner. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last modification date of the partner. + UpdatedAt *time.Time `json:"updated_at"` +} + +// Pop: pop. +type Pop struct { + // ID: unique identifier of the PoP. + ID string `json:"id"` + + // Name: name of the PoP. It is the common reference of Hosting DC (ex: TH2). + Name string `json:"name"` + + // HostingProviderName: name of the PoP's hosting provider, e.g. Telehouse for TH2 or OpCore for DC3. + HostingProviderName string `json:"hosting_provider_name"` + + // Address: physical address of the PoP. + Address string `json:"address"` + + // City: city where PoP is located. + City string `json:"city"` + + // LogoURL: image URL of the PoP's logo. + LogoURL string `json:"logo_url"` + + // Region: region of the PoP. + Region scw.Region `json:"region"` +} + +// RoutingPolicy: routing policy. +type RoutingPolicy struct { + // ID: unique identifier of the routing policy. + ID string `json:"id"` + + // ProjectID: project ID. + ProjectID string `json:"project_id"` + + // OrganizationID: organization ID. + OrganizationID string `json:"organization_id"` + + // Name: name of the routing policy. + Name string `json:"name"` + + // Tags: list of tags associated with the routing policy. + Tags []string `json:"tags"` + + // PrefixFilterIn: IP prefixes to accept from the peer (ranges of route announcements to accept). + PrefixFilterIn []scw.IPNet `json:"prefix_filter_in"` + + // PrefixFilterOut: IP prefix filters to advertise to the peer (ranges of routes to advertise). + PrefixFilterOut []scw.IPNet `json:"prefix_filter_out"` + + // CreatedAt: creation date of the routing policy. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: last modification date of the routing policy. + UpdatedAt *time.Time `json:"updated_at"` + + // Region: region of the routing policy. + Region scw.Region `json:"region"` +} + +// AttachRoutingPolicyRequest: attach routing policy request. +type AttachRoutingPolicyRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link to attach a routing policy to. + LinkID string `json:"-"` + + // RoutingPolicyID: ID of the routing policy to be attached. + RoutingPolicyID string `json:"routing_policy_id"` +} + +// AttachVpcRequest: attach vpc request. +type AttachVpcRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link to attach VPC to. + LinkID string `json:"-"` + + // VpcID: ID of the VPC to attach. + VpcID string `json:"vpc_id"` +} + +// CreateLinkRequest: create link request. +type CreateLinkRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ProjectID: ID of the Project to create the link in. + ProjectID string `json:"project_id"` + + // Name: name of the link. + Name string `json:"name"` + + // Tags: list of tags to apply to the link. + Tags []string `json:"tags"` + + // PopID: poP (location) where the link will be created. + PopID string `json:"pop_id"` + + // BandwidthMbps: desired bandwidth for the link. Must be compatible with available link bandwidths and remaining bandwidth capacity of the port. + BandwidthMbps uint64 `json:"bandwidth_mbps"` + + // Dedicated: if true, a dedicated link (1 link per port, dedicated to one customer) will be crated. It is not necessary to specify a `port_id` or `partner_id`. A new port will created and assigned to the link. Note that Scaleway has not yet enabled the creation of dedicated links, this field is reserved for future use. + // Precisely one of Dedicated, PortID, PartnerID must be set. + Dedicated *bool `json:"dedicated,omitempty"` + + // PortID: if set, a shared link (N links per port, one of which is this customer's port) will be created. As the customer, specify the ID of the port you already have for this link. Note that shared links are not currently available. Note that Scaleway has not yet enabled the creation of shared links, this field is reserved for future use. + // Precisely one of Dedicated, PortID, PartnerID must be set. + PortID *string `json:"port_id,omitempty"` + + // PartnerID: if set, a hosted link (N links per port on a partner port) will be created. Specify the ID of the chosen partner, who already has a shareable port with available bandwidth. Note that this is currently the only type of link offered by Scaleway, and therefore this field must be set when creating a link. + // Precisely one of Dedicated, PortID, PartnerID must be set. + PartnerID *string `json:"partner_id,omitempty"` +} + +// CreateRoutingPolicyRequest: create routing policy request. +type CreateRoutingPolicyRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // ProjectID: ID of the Project to create the routing policy in. + ProjectID string `json:"project_id"` + + // Name: name of the routing policy. + Name string `json:"name"` + + // Tags: list of tags to apply to the routing policy. + Tags []string `json:"tags"` + + // PrefixFilterIn: IP prefixes to accept from the peer (ranges of route announcements to accept). + PrefixFilterIn []scw.IPNet `json:"prefix_filter_in"` + + // PrefixFilterOut: IP prefix filters to advertise to the peer (ranges of routes to advertise). + PrefixFilterOut []scw.IPNet `json:"prefix_filter_out"` +} + +// DeleteLinkRequest: delete link request. +type DeleteLinkRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link to delete. + LinkID string `json:"-"` +} + +// DeleteRoutingPolicyRequest: delete routing policy request. +type DeleteRoutingPolicyRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // RoutingPolicyID: ID of the routing policy to delete. + RoutingPolicyID string `json:"-"` +} + +// DetachRoutingPolicyRequest: detach routing policy request. +type DetachRoutingPolicyRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link to detach a routing policy from. + LinkID string `json:"-"` +} + +// DetachVpcRequest: detach vpc request. +type DetachVpcRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link to detach the VPC from. + LinkID string `json:"-"` +} + +// DisableRoutePropagationRequest: disable route propagation request. +type DisableRoutePropagationRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link on which to disable route propagation. + LinkID string `json:"-"` +} + +// EnableRoutePropagationRequest: enable route propagation request. +type EnableRoutePropagationRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link on which to enable route propagation. + LinkID string `json:"-"` +} + +// GetLinkRequest: get link request. +type GetLinkRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link to get. + LinkID string `json:"-"` +} + +// GetPartnerRequest: get partner request. +type GetPartnerRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // PartnerID: ID of partner to get. + PartnerID string `json:"-"` +} + +// GetPopRequest: get pop request. +type GetPopRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // PopID: ID of PoP to get. + PopID string `json:"-"` +} + +// GetRoutingPolicyRequest: get routing policy request. +type GetRoutingPolicyRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // RoutingPolicyID: ID of the routing policy to get. + RoutingPolicyID string `json:"-"` +} + +// ListLinksRequest: list links request. +type ListLinksRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // OrderBy: order in which to return results. + // Default value: created_at_asc + OrderBy ListLinksRequestOrderBy `json:"-"` + + // Page: page number to return. + Page *int32 `json:"-"` + + // PageSize: maximum number of links to return per page. + PageSize *uint32 `json:"-"` + + // ProjectID: project ID to filter for. + ProjectID *string `json:"-"` + + // OrganizationID: organization ID to filter for. + OrganizationID *string `json:"-"` + + // Name: link name to filter for. + Name *string `json:"-"` + + // Tags: tags to filter for. + Tags []string `json:"-"` + + // Status: link status to filter for. + // Default value: unknown_link_status + Status LinkStatus `json:"-"` + + // BgpV4Status: bGP IPv4 status to filter for. + // Default value: unknown_bgp_status + BgpV4Status BgpStatus `json:"-"` + + // BgpV6Status: bGP IPv6 status to filter for. + // Default value: unknown_bgp_status + BgpV6Status BgpStatus `json:"-"` + + // PopID: filter for links attached to this PoP (via ports). + PopID *string `json:"-"` + + // BandwidthMbps: filter for link bandwidth (in Mbps). + BandwidthMbps *uint64 `json:"-"` + + // PartnerID: filter for links hosted by this partner. + PartnerID *string `json:"-"` + + // VpcID: filter for links attached to this VPC. + VpcID *string `json:"-"` + + // RoutingPolicyID: filter for links using this routing policy. + RoutingPolicyID *string `json:"-"` + + // PairingKey: filter for the link with this pairing_key. + PairingKey *string `json:"-"` +} + +// ListLinksResponse: list links response. +type ListLinksResponse struct { + // Links: list of links on the current page. + Links []*Link `json:"links"` + + // TotalCount: total number of links. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListLinksResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListLinksResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListLinksResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Links = append(r.Links, results.Links...) + r.TotalCount += uint64(len(results.Links)) + return uint64(len(results.Links)), nil +} + +// ListPartnersRequest: list partners request. +type ListPartnersRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // OrderBy: order in which to return results. + // Default value: name_asc + OrderBy ListPartnersRequestOrderBy `json:"-"` + + // Page: page number to return. + Page *int32 `json:"-"` + + // PageSize: maximum number of partners to return per page. + PageSize *uint32 `json:"-"` + + // PopIDs: filter for partners present (offering a port) in one of these PoPs. + PopIDs []string `json:"-"` +} + +// ListPartnersResponse: list partners response. +type ListPartnersResponse struct { + // Partners: list of partners on current page. + Partners []*Partner `json:"partners"` + + // TotalCount: total number of partners returned. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListPartnersResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListPartnersResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListPartnersResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Partners = append(r.Partners, results.Partners...) + r.TotalCount += uint64(len(results.Partners)) + return uint64(len(results.Partners)), nil +} + +// ListPopsRequest: list pops request. +type ListPopsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // OrderBy: order in which to return results. + // Default value: name_asc + OrderBy ListPopsRequestOrderBy `json:"-"` + + // Page: page number to return. + Page *int32 `json:"-"` + + // PageSize: maximum number of PoPs to return per page. + PageSize *uint32 `json:"-"` + + // Name: poP name to filter for. + Name *string `json:"-"` + + // HostingProviderName: hosting provider name to filter for. + HostingProviderName *string `json:"-"` + + // PartnerID: filter for PoPs hosting an available shared port from this partner. + PartnerID *string `json:"-"` + + // LinkBandwidthMbps: filter for PoPs with a shared port allowing this bandwidth size. Note that we cannot guarantee that PoPs returned will have available capacity. + LinkBandwidthMbps *uint64 `json:"-"` +} + +// ListPopsResponse: list pops response. +type ListPopsResponse struct { + // Pops: list of PoPs on the current page. + Pops []*Pop `json:"pops"` + + // TotalCount: total number of PoPs. + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListPopsResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListPopsResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListPopsResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Pops = append(r.Pops, results.Pops...) + r.TotalCount += uint64(len(results.Pops)) + return uint64(len(results.Pops)), nil +} + +// ListRoutingPoliciesRequest: list routing policies request. +type ListRoutingPoliciesRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // OrderBy: order in which to return results. + // Default value: created_at_asc + OrderBy ListRoutingPoliciesRequestOrderBy `json:"-"` + + // Page: page number to return. + Page *int32 `json:"-"` + + // PageSize: maximum number of routing policies to return per page. + PageSize *uint32 `json:"-"` + + // ProjectID: project ID to filter for. + ProjectID *string `json:"-"` + + // OrganizationID: organization ID to filter for. + OrganizationID *string `json:"-"` + + // Name: routing policy name to filter for. + Name *string `json:"-"` + + // Tags: tags to filter for. + Tags []string `json:"-"` +} + +// ListRoutingPoliciesResponse: list routing policies response. +type ListRoutingPoliciesResponse struct { + RoutingPolicies []*RoutingPolicy `json:"routing_policies"` + + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListRoutingPoliciesResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListRoutingPoliciesResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListRoutingPoliciesResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.RoutingPolicies = append(r.RoutingPolicies, results.RoutingPolicies...) + r.TotalCount += uint64(len(results.RoutingPolicies)) + return uint64(len(results.RoutingPolicies)), nil +} + +// UpdateLinkRequest: update link request. +type UpdateLinkRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // LinkID: ID of the link to update. + LinkID string `json:"-"` + + // Name: name of the link. + Name *string `json:"name,omitempty"` + + // Tags: list of tags to apply to the link. + Tags *[]string `json:"tags,omitempty"` +} + +// UpdateRoutingPolicyRequest: update routing policy request. +type UpdateRoutingPolicyRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // RoutingPolicyID: ID of the routing policy to update. + RoutingPolicyID string `json:"-"` + + // Name: name of the routing policy. + Name *string `json:"name,omitempty"` + + // Tags: list of tags to apply to the routing policy. + Tags *[]string `json:"tags,omitempty"` + + // PrefixFilterIn: IP prefixes to accept from the peer (ranges of route announcements to accept). + PrefixFilterIn *[]string `json:"prefix_filter_in,omitempty"` + + // PrefixFilterOut: IP prefix filters for routes to advertise to the peer (ranges of routes to advertise). + PrefixFilterOut *[]string `json:"prefix_filter_out,omitempty"` +} + +// This API allows you to manage your Scaleway InterLink, to connect your on-premises infrastructure with your Scaleway VPC. +type API struct { + client *scw.Client +} + +// NewAPI returns a API object from a Scaleway client. +func NewAPI(client *scw.Client) *API { + return &API{ + client: client, + } +} +func (s *API) Regions() []scw.Region { + return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} +} + +// ListPartners: List all available partners. By default, the partners returned in the list are ordered by name in ascending order, though this can be modified via the `order_by` field. +func (s *API) ListPartners(req *ListPartnersRequest, opts ...scw.RequestOption) (*ListPartnersResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "pop_ids", req.PopIDs) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/partners", + Query: query, + } + + var resp ListPartnersResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetPartner: Get a partner for the given partner IP. The response object includes information such as the partner's name, email address and portal URL. +func (s *API) GetPartner(req *GetPartnerRequest, opts ...scw.RequestOption) (*Partner, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.PartnerID) == "" { + return nil, errors.New("field PartnerID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/partners/" + fmt.Sprint(req.PartnerID) + "", + } + + var resp Partner + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListPops: List all available PoPs (locations) for a given region. By default, the results are returned in ascending alphabetical order by name. +func (s *API) ListPops(req *ListPopsRequest, opts ...scw.RequestOption) (*ListPopsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "hosting_provider_name", req.HostingProviderName) + parameter.AddToQuery(query, "partner_id", req.PartnerID) + parameter.AddToQuery(query, "link_bandwidth_mbps", req.LinkBandwidthMbps) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/pops", + Query: query, + } + + var resp ListPopsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetPop: Get a PoP for the given PoP ID. The response object includes the PoP's name and information about its physical location. +func (s *API) GetPop(req *GetPopRequest, opts ...scw.RequestOption) (*Pop, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.PopID) == "" { + return nil, errors.New("field PopID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/pops/" + fmt.Sprint(req.PopID) + "", + } + + var resp Pop + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListLinks: List all your links (InterLink connections). A number of filters are available, including Project ID, name, tags and status. +func (s *API) ListLinks(req *ListLinksRequest, opts ...scw.RequestOption) (*ListLinksResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "tags", req.Tags) + parameter.AddToQuery(query, "status", req.Status) + parameter.AddToQuery(query, "bgp_v4_status", req.BgpV4Status) + parameter.AddToQuery(query, "bgp_v6_status", req.BgpV6Status) + parameter.AddToQuery(query, "pop_id", req.PopID) + parameter.AddToQuery(query, "bandwidth_mbps", req.BandwidthMbps) + parameter.AddToQuery(query, "partner_id", req.PartnerID) + parameter.AddToQuery(query, "vpc_id", req.VpcID) + parameter.AddToQuery(query, "routing_policy_id", req.RoutingPolicyID) + parameter.AddToQuery(query, "pairing_key", req.PairingKey) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links", + Query: query, + } + + var resp ListLinksResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetLink: Get a link (InterLink connection) for the given link ID. The response object includes information about the link's various configuration details. +func (s *API) GetLink(req *GetLinkRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "", + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateLink: Create a link (InterLink connection) in a given PoP, specifying its various configuration details. For the moment only hosted links (faciliated by partners) are available, though in the future dedicated and shared links will also be possible. +func (s *API) CreateLink(req *CreateLinkRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateLink: Update an existing link, specified by its link ID. Only its name and tags can be updated. +func (s *API) UpdateLink(req *UpdateLinkRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteLink: Delete an existing link, specified by its link ID. Note that as well as deleting the link here on the Scaleway side, it is also necessary to request deletion from the partner on their side. Only when this action has been carried out on both sides will the resource be completely deleted. +func (s *API) DeleteLink(req *DeleteLinkRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "", + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// AttachVpc: Attach a VPC to an existing link. This facilitates communication between the resources in your Scaleway VPC, and your on-premises infrastructure. +func (s *API) AttachVpc(req *AttachVpcRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "/attach-vpc", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DetachVpc: Detach a VPC from an existing link. +func (s *API) DetachVpc(req *DetachVpcRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "/detach-vpc", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// AttachRoutingPolicy: Attach a routing policy to an existing link. As all routes across the link are blocked by default, you must attach a routing policy to set IP prefix filters for allowed routes, facilitating traffic flow. +func (s *API) AttachRoutingPolicy(req *AttachRoutingPolicyRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "/attach-routing-policy", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DetachRoutingPolicy: Detach a routing policy from an existing link. Without a routing policy, all routes across the link are blocked by default. +func (s *API) DetachRoutingPolicy(req *DetachRoutingPolicyRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "/detach-routing-policy", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// EnableRoutePropagation: Enable all allowed prefixes (defined in a routing policy) to be announced in the BGP session. This allows traffic to flow between the attached VPC and the on-premises infrastructure along the announced routes. Note that by default, even when route propagation is enabled, all routes are blocked. It is essential to attach a routing policy to define the ranges of routes to announce. +func (s *API) EnableRoutePropagation(req *EnableRoutePropagationRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "/enable-route-propagation", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DisableRoutePropagation: Prevent any prefixes from being announced in the BGP session. Traffic will not be able to flow over the InterLink until route propagation is re-enabled. +func (s *API) DisableRoutePropagation(req *DisableRoutePropagationRequest, opts ...scw.RequestOption) (*Link, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.LinkID) == "" { + return nil, errors.New("field LinkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/links/" + fmt.Sprint(req.LinkID) + "/disable-route-propagation", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp Link + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListRoutingPolicies: List all routing policies in a given region. A routing policy can be attached to one or multiple links (InterLink connections). +func (s *API) ListRoutingPolicies(req *ListRoutingPoliciesRequest, opts ...scw.RequestOption) (*ListRoutingPoliciesResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "name", req.Name) + parameter.AddToQuery(query, "tags", req.Tags) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routing-policies", + Query: query, + } + + var resp ListRoutingPoliciesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// GetRoutingPolicy: Get a routing policy for the given routing policy ID. The response object gives information including the policy's name, tags and prefix filters. +func (s *API) GetRoutingPolicy(req *GetRoutingPolicyRequest, opts ...scw.RequestOption) (*RoutingPolicy, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.RoutingPolicyID) == "" { + return nil, errors.New("field RoutingPolicyID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routing-policies/" + fmt.Sprint(req.RoutingPolicyID) + "", + } + + var resp RoutingPolicy + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateRoutingPolicy: Create a routing policy. Routing policies allow you to set IP prefix filters to define the incoming route announcements to accept from the peer, and the outgoing routes to announce to the peer. +func (s *API) CreateRoutingPolicy(req *CreateRoutingPolicyRequest, opts ...scw.RequestOption) (*RoutingPolicy, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if req.ProjectID == "" { + defaultProjectID, _ := s.client.GetDefaultProjectID() + req.ProjectID = defaultProjectID + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routing-policies", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp RoutingPolicy + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// UpdateRoutingPolicy: Update an existing routing policy, specified by its routing policy ID. Its name, tags and incoming/outgoing prefix filters can be updated. +func (s *API) UpdateRoutingPolicy(req *UpdateRoutingPolicyRequest, opts ...scw.RequestOption) (*RoutingPolicy, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.RoutingPolicyID) == "" { + return nil, errors.New("field RoutingPolicyID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PATCH", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routing-policies/" + fmt.Sprint(req.RoutingPolicyID) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp RoutingPolicy + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteRoutingPolicy: Delete an existing routing policy, specified by its routing policy ID. +func (s *API) DeleteRoutingPolicy(req *DeleteRoutingPolicyRequest, opts ...scw.RequestOption) error { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.RoutingPolicyID) == "" { + return errors.New("field RoutingPolicyID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/interlink/v1beta1/regions/" + fmt.Sprint(req.Region) + "/routing-policies/" + fmt.Sprint(req.RoutingPolicyID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From ea866928d4f62cb314ad6cfc2fb9c01aa3bfa945 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 19 Dec 2024 09:32:29 +0100 Subject: [PATCH 126/163] feat(applesilicon): add support for `enable_vpc` (#2365) --- api/applesilicon/v1alpha1/applesilicon_sdk.go | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/api/applesilicon/v1alpha1/applesilicon_sdk.go b/api/applesilicon/v1alpha1/applesilicon_sdk.go index 0c737f3b9..c99b33e95 100644 --- a/api/applesilicon/v1alpha1/applesilicon_sdk.go +++ b/api/applesilicon/v1alpha1/applesilicon_sdk.go @@ -154,6 +154,47 @@ func (enum *ListServersRequestOrderBy) UnmarshalJSON(data []byte) error { return nil } +type ServerPrivateNetworkStatus string + +const ( + ServerPrivateNetworkStatusVpcUnknownStatus = ServerPrivateNetworkStatus("vpc_unknown_status") + ServerPrivateNetworkStatusVpcEnabled = ServerPrivateNetworkStatus("vpc_enabled") + ServerPrivateNetworkStatusVpcUpdating = ServerPrivateNetworkStatus("vpc_updating") + ServerPrivateNetworkStatusVpcDisabled = ServerPrivateNetworkStatus("vpc_disabled") +) + +func (enum ServerPrivateNetworkStatus) String() string { + if enum == "" { + // return default value if empty + return "vpc_unknown_status" + } + return string(enum) +} + +func (enum ServerPrivateNetworkStatus) Values() []ServerPrivateNetworkStatus { + return []ServerPrivateNetworkStatus{ + "vpc_unknown_status", + "vpc_enabled", + "vpc_updating", + "vpc_disabled", + } +} + +func (enum ServerPrivateNetworkStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ServerPrivateNetworkStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ServerPrivateNetworkStatus(ServerPrivateNetworkStatus(tmp).String()) + return nil +} + type ServerStatus string const ( @@ -415,6 +456,10 @@ type Server struct { // Delivered: set to true once the server has completed its provisioning steps and is ready to use. Some OS configurations might require a reinstallation of the server before delivery depending on the available stock. A reinstallation after the initial delivery will not change this flag and can be tracked using the server status. Delivered bool `json:"delivered"` + + // VpcStatus: activation status of optional Private Network feature support for this server. + // Default value: vpc_unknown_status + VpcStatus ServerPrivateNetworkStatus `json:"vpc_status"` } // ConnectivityDiagnostic: connectivity diagnostic. @@ -449,6 +494,9 @@ type CreateServerRequest struct { // OsID: create a server & install the given os_id, when no os_id provided the default OS for this server type is chosen. Requesting a non-default OS will induce an extended delivery time. OsID *string `json:"os_id,omitempty"` + + // EnableVpc: activate the Private Network feature for this server. This feature is configured through the Apple Silicon - Private Networks API. + EnableVpc bool `json:"enable_vpc"` } // DeleteServerRequest: delete server request. @@ -650,6 +698,9 @@ type UpdateServerRequest struct { // ScheduleDeletion: specify whether the server should be flagged for automatic deletion. ScheduleDeletion *bool `json:"schedule_deletion,omitempty"` + + // EnableVpc: activate or deactivate Private Network support for this server. + EnableVpc *bool `json:"enable_vpc,omitempty"` } // This API allows you to manage your Apple silicon machines. From 2c77d5f733bdbadcd9c79cb5eed551f85e912ba4 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 19 Dec 2024 09:33:10 +0100 Subject: [PATCH 127/163] feat(vpc_gw): add delete_ip field to gateway delete RPC (#2368) --- api/vpcgw/v2/vpcgw_sdk.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/vpcgw/v2/vpcgw_sdk.go b/api/vpcgw/v2/vpcgw_sdk.go index 6ec161c19..cfd64b179 100644 --- a/api/vpcgw/v2/vpcgw_sdk.go +++ b/api/vpcgw/v2/vpcgw_sdk.go @@ -643,6 +643,9 @@ type DeleteGatewayRequest struct { // GatewayID: ID of the gateway to delete. GatewayID string `json:"-"` + + // DeleteIP: defines whether the PGW's IP should be deleted. + DeleteIP bool `json:"delete_ip"` } // DeleteIPRequest: delete ip request. @@ -1247,6 +1250,9 @@ func (s *API) DeleteGateway(req *DeleteGatewayRequest, opts ...scw.RequestOption req.Zone = defaultZone } + query := url.Values{} + parameter.AddToQuery(query, "delete_ip", req.DeleteIP) + if fmt.Sprint(req.Zone) == "" { return nil, errors.New("field Zone cannot be empty in request") } @@ -1258,6 +1264,7 @@ func (s *API) DeleteGateway(req *DeleteGatewayRequest, opts ...scw.RequestOption scwReq := &scw.ScalewayRequest{ Method: "DELETE", Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "", + Query: query, } var resp Gateway From 952b366cd1cd19b254ef018a04751d9a79a96cf9 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 19 Dec 2024 09:34:00 +0100 Subject: [PATCH 128/163] docs(lb): update description for mysql healthcheck (#2363) --- api/lb/v1/lb_sdk.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/lb/v1/lb_sdk.go b/api/lb/v1/lb_sdk.go index 13d80670d..2058c7a24 100644 --- a/api/lb/v1/lb_sdk.go +++ b/api/lb/v1/lb_sdk.go @@ -1258,7 +1258,7 @@ type HealthCheck struct { // Precisely one of TCPConfig, MysqlConfig, PgsqlConfig, LdapConfig, RedisConfig, HTTPConfig, HTTPSConfig must be set. TCPConfig *HealthCheckTCPConfig `json:"tcp_config,omitempty"` - // MysqlConfig: object to configure a MySQL health check. The check requires MySQL >=3.22, for older versions, use a TCP health check. + // MysqlConfig: object to configure a MySQL health check. The check requires MySQL >=3.22 or <9.0. For older or newer versions, use a TCP health check. // Precisely one of TCPConfig, MysqlConfig, PgsqlConfig, LdapConfig, RedisConfig, HTTPConfig, HTTPSConfig must be set. MysqlConfig *HealthCheckMysqlConfig `json:"mysql_config,omitempty"` @@ -3236,7 +3236,7 @@ type UpdateHealthCheckRequest struct { // Precisely one of TCPConfig, MysqlConfig, PgsqlConfig, LdapConfig, RedisConfig, HTTPConfig, HTTPSConfig must be set. TCPConfig *HealthCheckTCPConfig `json:"tcp_config,omitempty"` - // MysqlConfig: object to configure a MySQL health check. The check requires MySQL >=3.22, for older versions, use a TCP health check. + // MysqlConfig: object to configure a MySQL health check. The check requires MySQL >=3.22 or <9.0. For older or newer versions, use a TCP health check. // Precisely one of TCPConfig, MysqlConfig, PgsqlConfig, LdapConfig, RedisConfig, HTTPConfig, HTTPSConfig must be set. MysqlConfig *HealthCheckMysqlConfig `json:"mysql_config,omitempty"` @@ -4435,7 +4435,7 @@ type ZonedAPIUpdateHealthCheckRequest struct { // Precisely one of TCPConfig, MysqlConfig, PgsqlConfig, LdapConfig, RedisConfig, HTTPConfig, HTTPSConfig must be set. TCPConfig *HealthCheckTCPConfig `json:"tcp_config,omitempty"` - // MysqlConfig: object to configure a MySQL health check. The check requires MySQL >=3.22, for older versions, use a TCP health check. + // MysqlConfig: object to configure a MySQL health check. The check requires MySQL >=3.22 or <9.0. For older or newer versions, use a TCP health check. // Precisely one of TCPConfig, MysqlConfig, PgsqlConfig, LdapConfig, RedisConfig, HTTPConfig, HTTPSConfig must be set. MysqlConfig *HealthCheckMysqlConfig `json:"mysql_config,omitempty"` From 4db71e9347e1b1ffac24c07286456c9018b4498f Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 19 Dec 2024 09:37:38 +0100 Subject: [PATCH 129/163] feat(interlink): add support for AvailableLinkBandwidthsMbps in Pop struct (#2367) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémy Léone --- api/interlink/v1beta1/interlink_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/interlink/v1beta1/interlink_sdk.go b/api/interlink/v1beta1/interlink_sdk.go index 6f1a6a04a..6be7eed0b 100644 --- a/api/interlink/v1beta1/interlink_sdk.go +++ b/api/interlink/v1beta1/interlink_sdk.go @@ -401,6 +401,9 @@ type Pop struct { // LogoURL: image URL of the PoP's logo. LogoURL string `json:"logo_url"` + // AvailableLinkBandwidthsMbps: available bandwidth in Mbits/s for future hosted_links from available ports in this PoP. + AvailableLinkBandwidthsMbps []uint64 `json:"available_link_bandwidths_mbps"` + // Region: region of the PoP. Region scw.Region `json:"region"` } From 35c11c799f4c89ab5fa495ff7d3886daacaecd90 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 19 Dec 2024 09:45:41 +0100 Subject: [PATCH 130/163] feat(webhosting): add support for `SyncDomainDNSRecords` (#2366) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémy Léone --- api/webhosting/v1/webhosting_sdk.go | 65 +++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index 5a53fd673..835d81c1e 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -758,6 +758,14 @@ type OfferOptionRequest struct { Quantity int64 `json:"quantity"` } +// SyncDomainDNSRecordsRequestRecord: sync domain dns records request record. +type SyncDomainDNSRecordsRequestRecord struct { + Name string `json:"name"` + + // Type: default value: unknown_type + Type DNSRecordType `json:"type"` +} + // DNSRecord: dns record. type DNSRecord struct { // Name: record name. @@ -989,6 +997,27 @@ type DNSAPIGetDomainDNSRecordsRequest struct { Domain string `json:"-"` } +// DNSAPISyncDomainDNSRecordsRequest: dnsapi sync domain dns records request. +type DNSAPISyncDomainDNSRecordsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // Domain: domain for which the DNS records will be synchronized. + Domain string `json:"-"` + + // UpdateWebRecords: whether or not to synchronize the web records. + UpdateWebRecords bool `json:"update_web_records"` + + // UpdateMailRecords: whether or not to synchronize the mail records. + UpdateMailRecords bool `json:"update_mail_records"` + + // UpdateAllRecords: whether or not to synchronize all types of records. This one has priority. + UpdateAllRecords bool `json:"update_all_records"` + + // CustomRecords: custom records to synchronize. + CustomRecords []*SyncDomainDNSRecordsRequestRecord `json:"custom_records"` +} + // DNSRecords: dns records. type DNSRecords struct { // Records: list of DNS records. @@ -2354,6 +2383,42 @@ func (s *DnsAPI) CheckUserOwnsDomain(req *DNSAPICheckUserOwnsDomainRequest, opts return &resp, nil } +// SyncDomainDNSRecords: "Synchronize your DNS records on the Elements Console and on cPanel.". +func (s *DnsAPI) SyncDomainDNSRecords(req *DNSAPISyncDomainDNSRecordsRequest, opts ...scw.RequestOption) (*DNSRecords, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.Domain) == "" { + return nil, errors.New("field Domain cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/webhosting/v1/regions/" + fmt.Sprint(req.Region) + "/domains/" + fmt.Sprint(req.Domain) + "/sync-domain-dns-records", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp DNSRecords + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // This API allows you to manage your offer for your Web Hosting services. type OfferAPI struct { client *scw.Client From bb67c06803d1697e6aa9d30b01c37bea2e034c48 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 24 Dec 2024 11:13:55 +0100 Subject: [PATCH 131/163] docs(edge_services): update description for billing endpoint (#2370) --- api/edge_services/v1alpha1/edge_services_sdk.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/edge_services/v1alpha1/edge_services_sdk.go b/api/edge_services/v1alpha1/edge_services_sdk.go index 122b1ddca..0647fa171 100644 --- a/api/edge_services/v1alpha1/edge_services_sdk.go +++ b/api/edge_services/v1alpha1/edge_services_sdk.go @@ -1225,16 +1225,16 @@ type GetBillingResponse struct { // PipelineNumber: total number of pipelines currently configured. PipelineNumber uint32 `json:"pipeline_number"` - // ExtraPipelinesCost: cost to date (this month) of pipelines not included in the subscription plan. + // ExtraPipelinesCost: cost to date (this month) of pipelines not included in the subscription plans. ExtraPipelinesCost *scw.Money `json:"extra_pipelines_cost"` - // CurrentPlanCacheUsage: total amount of data egressed from the cache in gigabytes from the beginning of the month, included in the active subscription plan. + // CurrentPlanCacheUsage: total amount of data egressed from the cache in gigabytes from the beginning of the month, for the active subscription plan. CurrentPlanCacheUsage uint64 `json:"current_plan_cache_usage"` - // ExtraCacheUsage: total amount of extra data egressed from cache in gigabytes from the beginning of the month, not included in the active subscription plan. + // ExtraCacheUsage: total amount of extra data egressed from cache in gigabytes from the beginning of the month, not included in the subscription plans. ExtraCacheUsage uint64 `json:"extra_cache_usage"` - // ExtraCacheCost: cost to date (this month) of the data egressed from the cache that is not included in the active subscription plan. + // ExtraCacheCost: cost to date (this month) of the data egressed from the cache that is not included in the subscription plans. ExtraCacheCost *scw.Money `json:"extra_cache_cost"` // TotalCost: total cost to date (this month) of all Edge Services resources including active subscription plan, previously active plans, extra pipelines and extra egress cache data. From 4e50a300c08efc5c195b3d8ec581cba86fc1d8d0 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 24 Dec 2024 11:14:39 +0100 Subject: [PATCH 132/163] feat(k8s): remove unused field in NodeMetadata (#2371) --- api/k8s/v1/k8s_sdk.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 2e576006c..145122866 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -1952,12 +1952,6 @@ type NodeMetadata struct { NodeTaints []*NodeMetadataCoreV1Taint `json:"node_taints"` - PrivateNetworkMode string `json:"private_network_mode"` - - KapsuleIfaceMac string `json:"kapsule_iface_mac"` - - FullIsolation bool `json:"full_isolation"` - HasGpu bool `json:"has_gpu"` ExternalIP string `json:"external_ip"` From 7e27013acdb8468cab61d5cc1a8e65d5685a4163 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 24 Dec 2024 11:16:57 +0100 Subject: [PATCH 133/163] doc(edge_services): change wording of billing comments (#2372) From c8755a4000f1c87c8153c638000b51063b7b17be Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 24 Dec 2024 11:17:00 +0100 Subject: [PATCH 134/163] fix(mongodb): update product documentation (#2375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémy Léone --- api/mongodb/v1alpha1/mongodb_sdk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 6c011eee9..5b462edaa 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -1127,7 +1127,7 @@ func NewAPI(client *scw.Client) *API { } } func (s *API) Regions() []scw.Region { - return []scw.Region{scw.RegionFrPar, scw.RegionNlAms, scw.RegionPlWaw} + return []scw.Region{scw.RegionFrPar} } // ListNodeTypes: List available node types. From 105bb4e4019f2889ff2499105350df28adb45a3d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 24 Dec 2024 11:17:29 +0100 Subject: [PATCH 135/163] fix(k8s): align fields names with ones used in compute user-data (#2373) --- api/k8s/v1/k8s_sdk.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 145122866..47631053c 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -1543,9 +1543,9 @@ type ExternalNode struct { // ExternalNodeAuth: external node auth. type ExternalNodeAuth struct { - NodeToken string `json:"node_token"` + NodeSecretKey string `json:"node_secret_key"` - APIURL string `json:"api_url"` + MetadataURL string `json:"metadata_url"` } // GetClusterKubeConfigRequest: get cluster kube config request. From 37a05773a1983ee9a781c79b434b5c1904435881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 24 Dec 2024 16:35:03 +0100 Subject: [PATCH 136/163] feat: add support for sweepers (#2374) --- api/account/v3/sweepers/sweepers.go | 39 +++ .../v1alpha1/sweepers/sweepers.go | 40 ++++ api/baremetal/v1/sweepers/sweepers.go | 40 ++++ api/block/v1alpha1/sweepers/sweepers.go | 71 ++++++ api/cockpit/v1/sweepers/sweepers.go | 131 ++++++++++ api/container/v1beta1/sweepers/sweepers.go | 100 ++++++++ .../v1alpha1/sweepers/sweepers.go | 1 + api/flexibleip/v1alpha1/sweepers/sweepers.go | 42 ++++ api/function/v1beta1/sweepers/sweepers.go | 130 ++++++++++ api/iam/v1alpha1/sweepers/sweepers.go | 206 ++++++++++++++++ api/inference/v1beta1/sweepers/sweepers.go | 44 ++++ api/instance/v1/sweepers/sweepers.go | 226 ++++++++++++++++++ api/iot/v1/sweepers/sweepers.go | 43 ++++ api/ipam/v1/sweepers/sweepers.go | 43 ++++ api/jobs/v1alpha1/sweepers/sweepers.go | 44 ++++ api/k8s/v1/sweepers/sweepers.go | 60 +++++ api/lb/v1/sweepers/sweepers.go | 80 +++++++ api/mnq/v1beta1/sweepers/sweepers.go | 219 +++++++++++++++++ api/mongodb/v1alpha1/sweepers/sweepers.go | 43 ++++ api/rdb/v1/sweepers/sweepers.go | 43 ++++ api/redis/v1/sweepers/sweepers.go | 43 ++++ api/registry/v1/sweepers/sweepers.go | 42 ++++ api/secret/v1beta1/sweepers/sweepers.go | 42 ++++ .../v1alpha1/sweepers/sweepers.go | 44 ++++ api/tem/v1alpha1/sweepers/sweepers.go | 35 +++ api/vpc/v2/sweepers/sweepers.go | 109 +++++++++ api/vpcgw/v1/sweepers/sweepers.go | 122 ++++++++++ api/webhosting/v1alpha1/sweepers/sweepers.go | 39 +++ internal/testhelpers/test_resources.go | 14 ++ 29 files changed, 2135 insertions(+) create mode 100644 api/account/v3/sweepers/sweepers.go create mode 100644 api/applesilicon/v1alpha1/sweepers/sweepers.go create mode 100644 api/baremetal/v1/sweepers/sweepers.go create mode 100644 api/block/v1alpha1/sweepers/sweepers.go create mode 100644 api/cockpit/v1/sweepers/sweepers.go create mode 100644 api/container/v1beta1/sweepers/sweepers.go create mode 100644 api/edge_services/v1alpha1/sweepers/sweepers.go create mode 100644 api/flexibleip/v1alpha1/sweepers/sweepers.go create mode 100644 api/function/v1beta1/sweepers/sweepers.go create mode 100644 api/iam/v1alpha1/sweepers/sweepers.go create mode 100644 api/inference/v1beta1/sweepers/sweepers.go create mode 100644 api/instance/v1/sweepers/sweepers.go create mode 100644 api/iot/v1/sweepers/sweepers.go create mode 100644 api/ipam/v1/sweepers/sweepers.go create mode 100644 api/jobs/v1alpha1/sweepers/sweepers.go create mode 100644 api/k8s/v1/sweepers/sweepers.go create mode 100644 api/lb/v1/sweepers/sweepers.go create mode 100644 api/mnq/v1beta1/sweepers/sweepers.go create mode 100644 api/mongodb/v1alpha1/sweepers/sweepers.go create mode 100644 api/rdb/v1/sweepers/sweepers.go create mode 100644 api/redis/v1/sweepers/sweepers.go create mode 100644 api/registry/v1/sweepers/sweepers.go create mode 100644 api/secret/v1beta1/sweepers/sweepers.go create mode 100644 api/serverless_sqldb/v1alpha1/sweepers/sweepers.go create mode 100644 api/tem/v1alpha1/sweepers/sweepers.go create mode 100644 api/vpc/v2/sweepers/sweepers.go create mode 100644 api/vpcgw/v1/sweepers/sweepers.go create mode 100644 api/webhosting/v1alpha1/sweepers/sweepers.go create mode 100644 internal/testhelpers/test_resources.go diff --git a/api/account/v3/sweepers/sweepers.go b/api/account/v3/sweepers/sweepers.go new file mode 100644 index 000000000..65ef64e33 --- /dev/null +++ b/api/account/v3/sweepers/sweepers.go @@ -0,0 +1,39 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/account/v3" + "github.com/scaleway/scaleway-sdk-go/internal/testhelpers" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepProjects(scwClient *scw.Client) error { + accountAPI := account.NewProjectAPI(scwClient) + + req := &account.ProjectAPIListProjectsRequest{} + listProjects, err := accountAPI.ListProjects(req, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + for _, project := range listProjects.Projects { + // Do not delete default project + if project.ID == req.OrganizationID || !testhelpers.IsTestResource(project.Name) { + continue + } + err = accountAPI.DeleteProject(&account.ProjectAPIDeleteProjectRequest{ + ProjectID: project.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete project: %w", err) + } + } + return nil +} + +func SweepAll(scwClient *scw.Client) error { + if err := SweepProjects(scwClient); err != nil { + return err + } + return nil +} diff --git a/api/applesilicon/v1alpha1/sweepers/sweepers.go b/api/applesilicon/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..02894bf23 --- /dev/null +++ b/api/applesilicon/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,40 @@ +package sweepers + +import ( + "fmt" + + applesilicon "github.com/scaleway/scaleway-sdk-go/api/applesilicon/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepServer(scwClient *scw.Client, zone scw.Zone) error { + asAPI := applesilicon.NewAPI(scwClient) + + listServers, err := asAPI.ListServers(&applesilicon.ListServersRequest{Zone: zone}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing apple silicon servers in (%s) in sweeper: %s", zone, err) + } + + for _, server := range listServers.Servers { + errDelete := asAPI.DeleteServer(&applesilicon.DeleteServerRequest{ + ServerID: server.ID, + Zone: zone, + }) + if errDelete != nil { + return fmt.Errorf("error deleting apple silicon server in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&applesilicon.API{}).Zones() { + err := SweepServer(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/baremetal/v1/sweepers/sweepers.go b/api/baremetal/v1/sweepers/sweepers.go new file mode 100644 index 000000000..aa6cd0acd --- /dev/null +++ b/api/baremetal/v1/sweepers/sweepers.go @@ -0,0 +1,40 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/baremetal/v1" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepServers(scwClient *scw.Client, zone scw.Zone) error { + baremetalAPI := baremetal.NewAPI(scwClient) + + listServers, err := baremetalAPI.ListServers(&baremetal.ListServersRequest{Zone: zone}, scw.WithAllPages()) + if err != nil { + return err + } + + for _, server := range listServers.Servers { + _, err := baremetalAPI.DeleteServer(&baremetal.DeleteServerRequest{ + Zone: zone, + ServerID: server.ID, + }) + if err != nil { + return fmt.Errorf("error deleting server in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&baremetal.API{}).Zones() { + err := SweepServers(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/block/v1alpha1/sweepers/sweepers.go b/api/block/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..6df1c8da6 --- /dev/null +++ b/api/block/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,71 @@ +package sweepers + +import ( + "fmt" + + block "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error { + blockAPI := block.NewAPI(scwClient) + + listVolumes, err := blockAPI.ListVolumes( + &block.ListVolumesRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing volume in (%s) in sweeper: %s", zone, err) + } + + for _, volume := range listVolumes.Volumes { + err := blockAPI.DeleteVolume(&block.DeleteVolumeRequest{ + VolumeID: volume.ID, + Zone: zone, + }) + if err != nil { + return fmt.Errorf("error deleting volume in sweeper: %s", err) + } + } + + return nil +} + +func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error { + blockAPI := block.NewAPI(scwClient) + + listSnapshots, err := blockAPI.ListSnapshots( + &block.ListSnapshotsRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing snapshot in (%s) in sweeper: %s", zone, err) + } + + for _, snapshot := range listSnapshots.Snapshots { + err := blockAPI.DeleteSnapshot(&block.DeleteSnapshotRequest{ + SnapshotID: snapshot.ID, + Zone: zone, + }) + if err != nil { + return fmt.Errorf("error deleting snapshot in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&block.API{}).Zones() { + err := SweepVolumes(scwClient, zone) + if err != nil { + return err + } + err = SweepSnapshots(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/cockpit/v1/sweepers/sweepers.go b/api/cockpit/v1/sweepers/sweepers.go new file mode 100644 index 000000000..4a401332d --- /dev/null +++ b/api/cockpit/v1/sweepers/sweepers.go @@ -0,0 +1,131 @@ +package sweepers + +import ( + "fmt" + "strings" + + accountSDK "github.com/scaleway/scaleway-sdk-go/api/account/v3" + "github.com/scaleway/scaleway-sdk-go/api/cockpit/v1" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepToken(scwClient *scw.Client) error { + accountAPI := accountSDK.NewProjectAPI(scwClient) + cockpitAPI := cockpit.NewRegionalAPI(scwClient) + + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + listTokens, err := cockpitAPI.ListTokens(&cockpit.RegionalAPIListTokensRequest{ + ProjectID: project.ID, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list tokens: %w", err) + } + + for _, token := range listTokens.Tokens { + err = cockpitAPI.DeleteToken(&cockpit.RegionalAPIDeleteTokenRequest{ + TokenID: token.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete token: %w", err) + } + } + } + + return nil +} + +func SweepGrafanaUser(scwClient *scw.Client) error { + accountAPI := accountSDK.NewProjectAPI(scwClient) + cockpitAPI := cockpit.NewGlobalAPI(scwClient) + + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + listGrafanaUsers, err := cockpitAPI.ListGrafanaUsers(&cockpit.GlobalAPIListGrafanaUsersRequest{ + ProjectID: project.ID, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list grafana users: %w", err) + } + + for _, grafanaUser := range listGrafanaUsers.GrafanaUsers { + err = cockpitAPI.DeleteGrafanaUser(&cockpit.GlobalAPIDeleteGrafanaUserRequest{ + ProjectID: project.ID, + GrafanaUserID: grafanaUser.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete grafana user: %w", err) + } + } + } + + return nil +} + +func SweepSource(scwClient *scw.Client, region scw.Region) error { + accountAPI := accountSDK.NewProjectAPI(scwClient) + cockpitAPI := cockpit.NewRegionalAPI(scwClient) + + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + listDatasources, err := cockpitAPI.ListDataSources(&cockpit.RegionalAPIListDataSourcesRequest{ + ProjectID: project.ID, + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list sources: %w", err) + } + + for _, datsource := range listDatasources.DataSources { + err = cockpitAPI.DeleteDataSource(&cockpit.RegionalAPIDeleteDataSourceRequest{ + DataSourceID: datsource.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("failed to delete cockpit source: %w", err) + } + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + if err := SweepToken(scwClient); err != nil { + return err + } + if err := SweepGrafanaUser(scwClient); err != nil { + return err + } + for _, region := range (&cockpit.RegionalAPI{}).Regions() { + if err := SweepSource(scwClient, region); err != nil { + return err + } + } + + return nil +} diff --git a/api/container/v1beta1/sweepers/sweepers.go b/api/container/v1beta1/sweepers/sweepers.go new file mode 100644 index 000000000..136e1b900 --- /dev/null +++ b/api/container/v1beta1/sweepers/sweepers.go @@ -0,0 +1,100 @@ +package sweepers + +import ( + "fmt" + + container "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepTrigger(scwClient *scw.Client, region scw.Region) error { + containerAPI := container.NewAPI(scwClient) + + logger.Warningf("sweeper: destroying the container triggers in (%s)", region) + listTriggers, err := containerAPI.ListTriggers( + &container.ListTriggersRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing trigger in (%s) in sweeper: %s", region, err) + } + + for _, trigger := range listTriggers.Triggers { + _, err := containerAPI.DeleteTrigger(&container.DeleteTriggerRequest{ + TriggerID: trigger.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting trigger in sweeper: %s", err) + } + } + + return nil +} + +func SweepContainer(scwClient *scw.Client, region scw.Region) error { + containerAPI := container.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the container in (%s)", region) + listNamespaces, err := containerAPI.ListContainers( + &container.ListContainersRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing containers in (%s) in sweeper: %s", region, err) + } + + for _, cont := range listNamespaces.Containers { + _, err := containerAPI.DeleteContainer(&container.DeleteContainerRequest{ + ContainerID: cont.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting container in sweeper: %s", err) + } + } + + return nil +} + +func SweepNamespace(scwClient *scw.Client, region scw.Region) error { + containerAPI := container.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the container namespaces in (%s)", region) + listNamespaces, err := containerAPI.ListNamespaces( + &container.ListNamespacesRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing namespaces in (%s) in sweeper: %s", region, err) + } + + for _, ns := range listNamespaces.Namespaces { + _, err := containerAPI.DeleteNamespace(&container.DeleteNamespaceRequest{ + NamespaceID: ns.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting namespace in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&container.API{}).Regions() { + err := SweepTrigger(scwClient, region) + if err != nil { + return err + } + err = SweepContainer(scwClient, region) + if err != nil { + return err + } + err = SweepNamespace(scwClient, region) + if err != nil { + return err + } + } + return nil +} diff --git a/api/edge_services/v1alpha1/sweepers/sweepers.go b/api/edge_services/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..30c229f57 --- /dev/null +++ b/api/edge_services/v1alpha1/sweepers/sweepers.go @@ -0,0 +1 @@ +package sweepers diff --git a/api/flexibleip/v1alpha1/sweepers/sweepers.go b/api/flexibleip/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..54f972526 --- /dev/null +++ b/api/flexibleip/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,42 @@ +package sweepers + +import ( + "fmt" + + flexibleip "github.com/scaleway/scaleway-sdk-go/api/flexibleip/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepFlexibleIP(scwClient *scw.Client, zone scw.Zone) error { + fipAPI := flexibleip.NewAPI(scwClient) + + listIPs, err := fipAPI.ListFlexibleIPs(&flexibleip.ListFlexibleIPsRequest{Zone: zone}, scw.WithAllPages()) + if err != nil { + logger.Warningf("error listing ips in (%s) in sweeper: %s", zone, err) + return nil + } + + for _, ip := range listIPs.FlexibleIPs { + err := fipAPI.DeleteFlexibleIP(&flexibleip.DeleteFlexibleIPRequest{ + FipID: ip.ID, + Zone: zone, + }) + if err != nil { + return fmt.Errorf("error deleting ip in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&flexibleip.API{}).Zones() { + err := SweepFlexibleIP(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/function/v1beta1/sweepers/sweepers.go b/api/function/v1beta1/sweepers/sweepers.go new file mode 100644 index 000000000..5ccf1e70b --- /dev/null +++ b/api/function/v1beta1/sweepers/sweepers.go @@ -0,0 +1,130 @@ +package sweepers + +import ( + "fmt" + + functionSDK "github.com/scaleway/scaleway-sdk-go/api/function/v1beta1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepTriggers(scwClient *scw.Client, region scw.Region) error { + functionAPI := functionSDK.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the function triggers in (%s)", region) + listTriggers, err := functionAPI.ListTriggers( + &functionSDK.ListTriggersRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing trigger in (%s) in sweeper: %s", region, err) + } + + for _, trigger := range listTriggers.Triggers { + _, err := functionAPI.DeleteTrigger(&functionSDK.DeleteTriggerRequest{ + TriggerID: trigger.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting trigger in sweeper: %s", err) + } + } + + return nil +} + +func SweepNamespaces(scwClient *scw.Client, region scw.Region) error { + functionAPI := functionSDK.NewAPI(scwClient) + logger.Debugf("sweeper: destroying the function namespaces in (%s)", region) + listNamespaces, err := functionAPI.ListNamespaces( + &functionSDK.ListNamespacesRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing namespaces in (%s) in sweeper: %s", region, err) + } + + for _, ns := range listNamespaces.Namespaces { + _, err := functionAPI.DeleteNamespace(&functionSDK.DeleteNamespaceRequest{ + NamespaceID: ns.ID, + Region: region, + }) + if err != nil { + logger.Debugf("sweeper: error (%s)", err) + + return fmt.Errorf("error deleting namespace in sweeper: %s", err) + } + } + + return nil +} + +func SweepFunctions(scwClient *scw.Client, region scw.Region) error { + functionAPI := functionSDK.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the function in (%s)", region) + listFunctions, err := functionAPI.ListFunctions( + &functionSDK.ListFunctionsRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing functions in (%s) in sweeper: %s", region, err) + } + + for _, f := range listFunctions.Functions { + _, err := functionAPI.DeleteFunction(&functionSDK.DeleteFunctionRequest{ + FunctionID: f.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting functions in sweeper: %s", err) + } + } + + return nil +} + +func SweepCrons(scwClient *scw.Client, region scw.Region) error { + functionAPI := functionSDK.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the function cron in (%s)", region) + listCron, err := functionAPI.ListCrons( + &functionSDK.ListCronsRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing cron in (%s) in sweeper: %s", region, err) + } + + for _, cron := range listCron.Crons { + _, err := functionAPI.DeleteCron(&functionSDK.DeleteCronRequest{ + CronID: cron.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting cron in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&functionSDK.API{}).Regions() { + err := SweepTriggers(scwClient, region) + if err != nil { + return err + } + err = SweepNamespaces(scwClient, region) + if err != nil { + return err + } + err = SweepFunctions(scwClient, region) + if err != nil { + return err + } + err = SweepCrons(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/iam/v1alpha1/sweepers/sweepers.go b/api/iam/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..b240e5df6 --- /dev/null +++ b/api/iam/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,206 @@ +package sweepers + +import ( + "errors" + "fmt" + + iam "github.com/scaleway/scaleway-sdk-go/api/iam/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/internal/testhelpers" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepUser(scwClient *scw.Client) error { + api := iam.NewAPI(scwClient) + + orgID, exists := scwClient.GetDefaultOrganizationID() + if !exists { + return errors.New("missing organizationID") + } + + listUsers, err := api.ListUsers(&iam.ListUsersRequest{ + OrganizationID: &orgID, + }) + if err != nil { + return fmt.Errorf("failed to list users: %w", err) + } + for _, user := range listUsers.Users { + if !testhelpers.IsTestResource(user.Email) { + continue + } + err = api.DeleteUser(&iam.DeleteUserRequest{ + UserID: user.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete user: %w", err) + } + } + + return nil +} + +func SweepSSHKey(scwClient *scw.Client) error { + iamAPI := iam.NewAPI(scwClient) + + logger.Warningf("sweeper: destroying the SSH keys") + + listSSHKeys, err := iamAPI.ListSSHKeys(&iam.ListSSHKeysRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing SSH keys in sweeper: %s", err) + } + + for _, sshKey := range listSSHKeys.SSHKeys { + if !testhelpers.IsTestResource(sshKey.Name) { + continue + } + err := iamAPI.DeleteSSHKey(&iam.DeleteSSHKeyRequest{ + SSHKeyID: sshKey.ID, + }) + if err != nil { + return fmt.Errorf("error deleting SSH key in sweeper: %s", err) + } + } + + return nil +} + +func SweepPolicy(scwClient *scw.Client) error { + api := iam.NewAPI(scwClient) + + orgID, exists := scwClient.GetDefaultOrganizationID() + if !exists { + return errors.New("missing organizationID") + } + + listPols, err := api.ListPolicies(&iam.ListPoliciesRequest{ + OrganizationID: orgID, + }) + if err != nil { + return fmt.Errorf("failed to list policies: %w", err) + } + for _, pol := range listPols.Policies { + if !testhelpers.IsTestResource(pol.Name) { + continue + } + err = api.DeletePolicy(&iam.DeletePolicyRequest{ + PolicyID: pol.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete policy: %w", err) + } + } + + return nil +} + +func SweepGroup(scwClient *scw.Client) error { + api := iam.NewAPI(scwClient) + + orgID, exists := scwClient.GetDefaultOrganizationID() + if !exists { + return errors.New("missing organizationID") + } + + listApps, err := api.ListGroups(&iam.ListGroupsRequest{ + OrganizationID: orgID, + }) + if err != nil { + return fmt.Errorf("failed to list groups: %w", err) + } + for _, group := range listApps.Groups { + if !testhelpers.IsTestResource(group.Name) { + continue + } + err = api.DeleteGroup(&iam.DeleteGroupRequest{ + GroupID: group.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete group: %w", err) + } + } + return nil +} + +func SweepApplication(scwClient *scw.Client) error { + api := iam.NewAPI(scwClient) + + orgID, exists := scwClient.GetDefaultOrganizationID() + if !exists { + return errors.New("missing organizationID") + } + + listApps, err := api.ListApplications(&iam.ListApplicationsRequest{ + OrganizationID: orgID, + }) + if err != nil { + return fmt.Errorf("failed to list applications: %w", err) + } + for _, app := range listApps.Applications { + if !testhelpers.IsTestResource(app.Name) { + continue + } + + err = api.DeleteApplication(&iam.DeleteApplicationRequest{ + ApplicationID: app.ID, + }) + if err != nil { + return fmt.Errorf("failed to delete application: %w", err) + } + } + + return nil +} + +func SweepAPIKey(scwClient *scw.Client) error { + api := iam.NewAPI(scwClient) + + logger.Debugf("sweeper: destroying the api keys") + + orgID, exists := scwClient.GetDefaultOrganizationID() + if !exists { + return errors.New("missing organizationID") + } + + listAPIKeys, err := api.ListAPIKeys(&iam.ListAPIKeysRequest{ + OrganizationID: &orgID, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list api keys: %w", err) + } + for _, key := range listAPIKeys.APIKeys { + if !testhelpers.IsTestResource(key.Description) { + continue + } + err = api.DeleteAPIKey(&iam.DeleteAPIKeyRequest{ + AccessKey: key.AccessKey, + }) + if err != nil { + return fmt.Errorf("failed to delete api key: %w", err) + } + } + + return nil +} + +func SweepAll(scwClient *scw.Client) error { + if err := SweepUser(scwClient); err != nil { + return err + } + if err := SweepSSHKey(scwClient); err != nil { + return err + } + if err := SweepPolicy(scwClient); err != nil { + return err + } + if err := SweepGroup(scwClient); err != nil { + return err + } + if err := SweepApplication(scwClient); err != nil { + return err + } + if err := SweepAPIKey(scwClient); err != nil { + return err + } + + return nil +} diff --git a/api/inference/v1beta1/sweepers/sweepers.go b/api/inference/v1beta1/sweepers/sweepers.go new file mode 100644 index 000000000..100ee2775 --- /dev/null +++ b/api/inference/v1beta1/sweepers/sweepers.go @@ -0,0 +1,44 @@ +package sweepers + +import ( + "fmt" + + inference "github.com/scaleway/scaleway-sdk-go/api/inference/v1beta1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepDeployment(scwClient *scw.Client, region scw.Region) error { + inferenceAPI := inference.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the inference deployments in (%s)", region) + listDeployments, err := inferenceAPI.ListDeployments( + &inference.ListDeploymentsRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing deployment in (%s) in sweeper: %s", region, err) + } + + for _, deployment := range listDeployments.Deployments { + _, err := inferenceAPI.DeleteDeployment(&inference.DeleteDeploymentRequest{ + DeploymentID: deployment.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting deployment in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, locality := range (&inference.API{}).Regions() { + err := SweepDeployment(scwClient, locality) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/instance/v1/sweepers/sweepers.go b/api/instance/v1/sweepers/sweepers.go new file mode 100644 index 000000000..68e32f93d --- /dev/null +++ b/api/instance/v1/sweepers/sweepers.go @@ -0,0 +1,226 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/instance/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepVolumes(scwClient *scw.Client, zone scw.Zone) error { + instanceAPI := instance.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the volumes in (%s)", zone) + + listVolumesResponse, err := instanceAPI.ListVolumes(&instance.ListVolumesRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing volumes in sweeper: %s", err) + } + + for _, volume := range listVolumesResponse.Volumes { + if volume.Server == nil { + err := instanceAPI.DeleteVolume(&instance.DeleteVolumeRequest{ + Zone: zone, + VolumeID: volume.ID, + }) + if err != nil { + return fmt.Errorf("error deleting volume in sweeper: %s", err) + } + } + } + return nil +} + +func SweepSnapshots(scwClient *scw.Client, zone scw.Zone) error { + api := instance.NewAPI(scwClient) + logger.Warningf("sweeper: destroying instance snapshots in (%+v)", zone) + + listSnapshotsResponse, err := api.ListSnapshots(&instance.ListSnapshotsRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing instance snapshots in sweeper: %w", err) + } + + for _, snapshot := range listSnapshotsResponse.Snapshots { + err := api.DeleteSnapshot(&instance.DeleteSnapshotRequest{ + Zone: zone, + SnapshotID: snapshot.ID, + }) + if err != nil { + return fmt.Errorf("error deleting instance snapshot in sweeper: %w", err) + } + } + + return nil +} + +func SweepServers(scwClient *scw.Client, zone scw.Zone) error { + instanceAPI := instance.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the instance server in (%s)", zone) + listServers, err := instanceAPI.ListServers(&instance.ListServersRequest{Zone: zone}, scw.WithAllPages()) + if err != nil { + logger.Warningf("error listing servers in (%s) in sweeper: %s", zone, err) + return nil + } + + for _, srv := range listServers.Servers { + if srv.State == instance.ServerStateStopped || srv.State == instance.ServerStateStoppedInPlace { + err := instanceAPI.DeleteServer(&instance.DeleteServerRequest{ + Zone: zone, + ServerID: srv.ID, + }) + if err != nil { + return fmt.Errorf("error deleting server in sweeper: %s", err) + } + } else if srv.State == instance.ServerStateRunning { + _, err := instanceAPI.ServerAction(&instance.ServerActionRequest{ + Zone: zone, + ServerID: srv.ID, + Action: instance.ServerActionTerminate, + }) + if err != nil { + return fmt.Errorf("error terminating server in sweeper: %s", err) + } + } + } + + return nil +} + +func SweepSecurityGroups(scwClient *scw.Client, zone scw.Zone) error { + instanceAPI := instance.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the security groups in (%s)", zone) + + listResp, err := instanceAPI.ListSecurityGroups(&instance.ListSecurityGroupsRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + logger.Warningf("error listing security groups in sweeper: %s", err) + return nil + } + + for _, securityGroup := range listResp.SecurityGroups { + // Can't delete default security group. + if securityGroup.ProjectDefault { + continue + } + err = instanceAPI.DeleteSecurityGroup(&instance.DeleteSecurityGroupRequest{ + Zone: zone, + SecurityGroupID: securityGroup.ID, + }) + if err != nil { + return fmt.Errorf("error deleting security groups in sweeper: %s", err) + } + } + + return nil +} + +func SweepPlacementGroup(scwClient *scw.Client, zone scw.Zone) error { + instanceAPI := instance.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the instance placement group in (%s)", zone) + listPlacementGroups, err := instanceAPI.ListPlacementGroups(&instance.ListPlacementGroupsRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + logger.Warningf("error listing placement groups in (%s) in sweeper: %s", zone, err) + return nil + } + + for _, pg := range listPlacementGroups.PlacementGroups { + err := instanceAPI.DeletePlacementGroup(&instance.DeletePlacementGroupRequest{ + Zone: zone, + PlacementGroupID: pg.ID, + }) + if err != nil { + return fmt.Errorf("error deleting placement group in sweeper: %s", err) + } + } + + return nil +} + +func SweepIP(scwClient *scw.Client, zone scw.Zone) error { + instanceAPI := instance.NewAPI(scwClient) + + listIPs, err := instanceAPI.ListIPs(&instance.ListIPsRequest{Zone: zone}, scw.WithAllPages()) + if err != nil { + logger.Warningf("error listing ips in (%s) in sweeper: %s", zone, err) + return nil + } + + for _, ip := range listIPs.IPs { + err := instanceAPI.DeleteIP(&instance.DeleteIPRequest{ + IP: ip.ID, + Zone: zone, + }) + if err != nil { + return fmt.Errorf("error deleting ip in sweeper: %s", err) + } + } + + return nil +} + +func SweepImages(scwClient *scw.Client, zone scw.Zone) error { + api := instance.NewAPI(scwClient) + logger.Debugf("sweeper: destroying instance images in (%+v)", zone) + + listImagesResponse, err := api.ListImages(&instance.ListImagesRequest{ + Zone: zone, + Public: scw.BoolPtr(false), + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing instance images in sweeper: %w", err) + } + + for _, image := range listImagesResponse.Images { + err := api.DeleteImage(&instance.DeleteImageRequest{ + Zone: zone, + ImageID: image.ID, + }) + if err != nil { + return fmt.Errorf("error deleting instance image in sweeper: %w", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&instance.API{}).Zones() { + err := SweepVolumes(scwClient, zone) + if err != nil { + return err + } + err = SweepSnapshots(scwClient, zone) + if err != nil { + return err + } + err = SweepServers(scwClient, zone) + if err != nil { + return err + } + err = SweepSecurityGroups(scwClient, zone) + if err != nil { + return err + } + err = SweepPlacementGroup(scwClient, zone) + if err != nil { + return err + } + err = SweepIP(scwClient, zone) + if err != nil { + return err + } + err = SweepImages(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/iot/v1/sweepers/sweepers.go b/api/iot/v1/sweepers/sweepers.go new file mode 100644 index 000000000..20a360b03 --- /dev/null +++ b/api/iot/v1/sweepers/sweepers.go @@ -0,0 +1,43 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/iot/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepHub(scwClient *scw.Client, region scw.Region) error { + iotAPI := iot.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the iot hub in (%s)", region) + listHubs, err := iotAPI.ListHubs(&iot.ListHubsRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing hubs in (%s) in sweeper: %s", region, err) + } + + deleteDevices := true + for _, hub := range listHubs.Hubs { + err := iotAPI.DeleteHub(&iot.DeleteHubRequest{ + HubID: hub.ID, + Region: hub.Region, + DeleteDevices: &deleteDevices, + }) + if err != nil { + return fmt.Errorf("error deleting hub in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&iot.API{}).Regions() { + err := SweepHub(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/ipam/v1/sweepers/sweepers.go b/api/ipam/v1/sweepers/sweepers.go new file mode 100644 index 000000000..f396db4b2 --- /dev/null +++ b/api/ipam/v1/sweepers/sweepers.go @@ -0,0 +1,43 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/ipam/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepIP(scwClient *scw.Client, region scw.Region) error { + ipamAPI := ipam.NewAPI(scwClient) + + logger.Warningf("sweeper: deleting the IPs in (%s)", region) + + listIPs, err := ipamAPI.ListIPs(&ipam.ListIPsRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing ips in (%s) in sweeper: %s", region, err) + } + + for _, v := range listIPs.IPs { + err := ipamAPI.ReleaseIP(&ipam.ReleaseIPRequest{ + IPID: v.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error releasing IP in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&ipam.API{}).Regions() { + err := SweepIP(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/jobs/v1alpha1/sweepers/sweepers.go b/api/jobs/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..34a734daf --- /dev/null +++ b/api/jobs/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,44 @@ +package sweepers + +import ( + "fmt" + + jobs "github.com/scaleway/scaleway-sdk-go/api/jobs/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepJobDefinition(scwClient *scw.Client, region scw.Region) error { + jobsAPI := jobs.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the jobs definitions in (%s)", region) + listJobDefinitions, err := jobsAPI.ListJobDefinitions( + &jobs.ListJobDefinitionsRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing definition in (%s) in sweeper: %s", region, err) + } + + for _, definition := range listJobDefinitions.JobDefinitions { + err := jobsAPI.DeleteJobDefinition(&jobs.DeleteJobDefinitionRequest{ + JobDefinitionID: definition.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting definition in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&jobs.API{}).Regions() { + err := SweepJobDefinition(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/k8s/v1/sweepers/sweepers.go b/api/k8s/v1/sweepers/sweepers.go new file mode 100644 index 000000000..69fcdca92 --- /dev/null +++ b/api/k8s/v1/sweepers/sweepers.go @@ -0,0 +1,60 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/k8s/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepCluster(scwClient *scw.Client, region scw.Region) error { + k8sAPI := k8s.NewAPI(scwClient) + + logger.Warningf("sweeper: destroying the k8s cluster in (%s)", region) + listClusters, err := k8sAPI.ListClusters(&k8s.ListClustersRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing clusters in (%s) in sweeper: %s", region, err) + } + + for _, cluster := range listClusters.Clusters { + // remove pools + listPools, err := k8sAPI.ListPools(&k8s.ListPoolsRequest{ + Region: region, + ClusterID: cluster.ID, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing pool in (%s) in sweeper: %s", region, err) + } + + for _, pool := range listPools.Pools { + _, err := k8sAPI.DeletePool(&k8s.DeletePoolRequest{ + Region: region, + PoolID: pool.ID, + }) + if err != nil { + return fmt.Errorf("error deleting pool in sweeper: %s", err) + } + } + _, err = k8sAPI.DeleteCluster(&k8s.DeleteClusterRequest{ + Region: region, + ClusterID: cluster.ID, + WithAdditionalResources: true, + }) + if err != nil { + return fmt.Errorf("error deleting cluster in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&k8s.API{}).Regions() { + err := SweepCluster(scwClient, region) + if err != nil { + return err + } + } + return nil +} diff --git a/api/lb/v1/sweepers/sweepers.go b/api/lb/v1/sweepers/sweepers.go new file mode 100644 index 000000000..1070782ca --- /dev/null +++ b/api/lb/v1/sweepers/sweepers.go @@ -0,0 +1,80 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/lb/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepLB(scwClient *scw.Client, zone scw.Zone) error { + lbAPI := lb.NewZonedAPI(scwClient) + + logger.Warningf("sweeper: destroying the lbs in (%s)", zone) + listLBs, err := lbAPI.ListLBs(&lb.ZonedAPIListLBsRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing lbs in (%s) in sweeper: %s", zone, err) + } + + for _, l := range listLBs.LBs { + _, err := lbAPI.WaitForLbInstances(&lb.ZonedAPIWaitForLBInstancesRequest{ + Zone: zone, + LBID: l.ID, + }) + if err != nil { + return fmt.Errorf("error waiting for lb in sweeper: %s", err) + } + err = lbAPI.DeleteLB(&lb.ZonedAPIDeleteLBRequest{ + LBID: l.ID, + ReleaseIP: true, + Zone: zone, + }) + if err != nil { + return fmt.Errorf("error deleting lb in sweeper: %s", err) + } + } + + return nil +} + +func SweepIP(scwClient *scw.Client, zone scw.Zone) error { + lbAPI := lb.NewZonedAPI(scwClient) + + logger.Warningf("sweeper: destroying the lb ips in zone (%s)", zone) + listIPs, err := lbAPI.ListIPs(&lb.ZonedAPIListIPsRequest{Zone: zone}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing lb ips in (%s) in sweeper: %s", zone, err) + } + + for _, ip := range listIPs.IPs { + if ip.LBID == nil { + err := lbAPI.ReleaseIP(&lb.ZonedAPIReleaseIPRequest{ + Zone: zone, + IPID: ip.ID, + }) + if err != nil { + return fmt.Errorf("error deleting lb ip in sweeper: %s", err) + } + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&lb.ZonedAPI{}).Zones() { + err := SweepLB(scwClient, zone) + if err != nil { + return err + } + err = SweepIP(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/mnq/v1beta1/sweepers/sweepers.go b/api/mnq/v1beta1/sweepers/sweepers.go new file mode 100644 index 000000000..1934456d5 --- /dev/null +++ b/api/mnq/v1beta1/sweepers/sweepers.go @@ -0,0 +1,219 @@ +package sweepers + +import ( + "fmt" + "strings" + + accountSDK "github.com/scaleway/scaleway-sdk-go/api/account/v3" + mnq "github.com/scaleway/scaleway-sdk-go/api/mnq/v1beta1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepSQSCredentials(scwClient *scw.Client, region scw.Region) error { + mnqAPI := mnq.NewSqsAPI(scwClient) + projectID, _ := scwClient.GetDefaultProjectID() + logger.Warningf("sweeper: destroying the mnq sqs credentials in (%s)", region) + sqsInfo, err := mnqAPI.GetSqsInfo(&mnq.SqsAPIGetSqsInfoRequest{Region: region}) + if err != nil { + return fmt.Errorf("error getting sns info in sweeper: %s", err) + } + if sqsInfo.Status == mnq.SqsInfoStatusDisabled { + logger.Infof("sqs is disabled, skipping") + return nil + } + listSqsCredentials, err := mnqAPI.ListSqsCredentials( + &mnq.SqsAPIListSqsCredentialsRequest{ + Region: region, + ProjectID: scw.StringPtr(projectID), + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing sqs credentials in (%s) in sweeper: %s", region, err) + } + + for _, credentials := range listSqsCredentials.SqsCredentials { + err := mnqAPI.DeleteSqsCredentials(&mnq.SqsAPIDeleteSqsCredentialsRequest{ + SqsCredentialsID: credentials.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting sqs credentials in sweeper: %s", err) + } + } + + return nil +} + +func SweepSQS(scwClient *scw.Client, region scw.Region) error { + accountAPI := accountSDK.NewProjectAPI(scwClient) + mnqAPI := mnq.NewSqsAPI(scwClient) + + logger.Warningf("sweeper: destroying the mnq sqss in (%s)", region) + + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + _, err := mnqAPI.DeactivateSqs(&mnq.SqsAPIDeactivateSqsRequest{ + Region: region, + ProjectID: project.ID, + }) + if err != nil { + return err + } + } + + return nil +} + +func SweepSNSCredentials(scwClient *scw.Client, region scw.Region) error { + mnqAPI := mnq.NewSnsAPI(scwClient) + projectID, _ := scwClient.GetDefaultProjectID() + logger.Warningf("sweeper: destroying the mnq sns credentials in (%s)", region) + snsInfo, err := mnqAPI.GetSnsInfo(&mnq.SnsAPIGetSnsInfoRequest{Region: region}) + if err != nil { + return fmt.Errorf("error getting sns info in sweeper: %s", err) + } + if snsInfo.Status == mnq.SnsInfoStatusDisabled { + logger.Infof("sns is disabled, skipping") + return nil + } + listSnsCredentials, err := mnqAPI.ListSnsCredentials( + &mnq.SnsAPIListSnsCredentialsRequest{ + Region: region, + ProjectID: scw.StringPtr(projectID), + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing sns credentials in (%s) in sweeper: %s", region, err) + } + + for _, credentials := range listSnsCredentials.SnsCredentials { + err := mnqAPI.DeleteSnsCredentials(&mnq.SnsAPIDeleteSnsCredentialsRequest{ + SnsCredentialsID: credentials.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting sns credentials in sweeper: %s", err) + } + } + + return nil +} + +func SweepSNS(scwClient *scw.Client, region scw.Region) error { + accountAPI := accountSDK.NewProjectAPI(scwClient) + mnqAPI := mnq.NewSnsAPI(scwClient) + + logger.Warningf("sweeper: destroying the mnq sns in (%s)", region) + + listProjects, err := accountAPI.ListProjects(&accountSDK.ProjectAPIListProjectsRequest{}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("failed to list projects: %w", err) + } + for _, project := range listProjects.Projects { + if !strings.HasPrefix(project.Name, "tf_tests") { + continue + } + + _, err := mnqAPI.DeactivateSns(&mnq.SnsAPIDeactivateSnsRequest{ + Region: region, + ProjectID: project.ID, + }) + if err != nil { + logger.Debugf("sweeper: error (%s)", err) + return err + } + } + + return nil +} + +func SweepNatsAccount(scwClient *scw.Client, region scw.Region) error { + mnqAPI := mnq.NewNatsAPI(scwClient) + logger.Warningf("sweeper: destroying the mnq nats accounts in (%s)", region) + listNatsAccounts, err := mnqAPI.ListNatsAccounts( + &mnq.NatsAPIListNatsAccountsRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing nats account in (%s) in sweeper: %s", region, err) + } + + for _, account := range listNatsAccounts.NatsAccounts { + err := mnqAPI.DeleteNatsAccount(&mnq.NatsAPIDeleteNatsAccountRequest{ + NatsAccountID: account.ID, + Region: region, + }) + if err != nil { + logger.Warningf("sweeper: error (%s)", err) + + return fmt.Errorf("error deleting nats account in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllSNS(scwClient *scw.Client) error { + for _, region := range (&mnq.SnsAPI{}).Regions() { + err := SweepSNSCredentials(scwClient, region) + if err != nil { + return err + } + + err = SweepSNS(scwClient, region) + if err != nil { + return err + } + } + + return nil +} + +func SweepAllSQS(scwClient *scw.Client) error { + for _, region := range (&mnq.SqsAPI{}).Regions() { + err := SweepSQSCredentials(scwClient, region) + if err != nil { + return err + } + err = SweepSQS(scwClient, region) + if err != nil { + return err + } + } + + return nil +} + +func SweepAllNats(scwClient *scw.Client) error { + for _, region := range (&mnq.NatsAPI{}).Regions() { + err := SweepNatsAccount(scwClient, region) + if err != nil { + return err + } + } + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + err := SweepAllSNS(scwClient) + if err != nil { + return err + } + + err = SweepAllSQS(scwClient) + if err != nil { + return err + } + + err = SweepAllNats(scwClient) + if err != nil { + return err + } + return nil +} diff --git a/api/mongodb/v1alpha1/sweepers/sweepers.go b/api/mongodb/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..60935306c --- /dev/null +++ b/api/mongodb/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,43 @@ +package sweepers + +import ( + "fmt" + + mongodb "github.com/scaleway/scaleway-sdk-go/api/mongodb/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepInstances(scwClient *scw.Client, region scw.Region) error { + mongodbAPI := mongodb.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the mongodb instance in (%s)", region) + listInstance, err := mongodbAPI.ListInstances(&mongodb.ListInstancesRequest{ + Region: region, + }) + if err != nil { + return fmt.Errorf("error listing mongodb instance in (%s) in sweeper: %w", region, err) + } + + for _, instance := range listInstance.Instances { + _, err := mongodbAPI.DeleteInstance(&mongodb.DeleteInstanceRequest{ + Region: region, + InstanceID: instance.ID, + }) + if err != nil { + return fmt.Errorf("error deleting mongodb instance in sweeper: %w", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&mongodb.API{}).Regions() { + err := SweepInstances(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/rdb/v1/sweepers/sweepers.go b/api/rdb/v1/sweepers/sweepers.go new file mode 100644 index 000000000..be54a9852 --- /dev/null +++ b/api/rdb/v1/sweepers/sweepers.go @@ -0,0 +1,43 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/rdb/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepInstance(scwClient *scw.Client, region scw.Region) error { + rdbAPI := rdb.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the rdb instance in (%s)", region) + listInstances, err := rdbAPI.ListInstances(&rdb.ListInstancesRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing rdb instances in (%s) in sweeper: %s", region, err) + } + + for _, instance := range listInstances.Instances { + _, err := rdbAPI.DeleteInstance(&rdb.DeleteInstanceRequest{ + Region: region, + InstanceID: instance.ID, + }) + if err != nil { + return fmt.Errorf("error deleting rdb instance in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&rdb.API{}).Regions() { + err := SweepInstance(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/redis/v1/sweepers/sweepers.go b/api/redis/v1/sweepers/sweepers.go new file mode 100644 index 000000000..a910ec1b2 --- /dev/null +++ b/api/redis/v1/sweepers/sweepers.go @@ -0,0 +1,43 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/redis/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepCluster(scwClient *scw.Client, zone scw.Zone) error { + redisAPI := redis.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the redis cluster in (%s)", zone) + listClusters, err := redisAPI.ListClusters(&redis.ListClustersRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing redis clusters in (%s) in sweeper: %w", zone, err) + } + + for _, cluster := range listClusters.Clusters { + _, err := redisAPI.DeleteCluster(&redis.DeleteClusterRequest{ + Zone: zone, + ClusterID: cluster.ID, + }) + if err != nil { + return fmt.Errorf("error deleting redis cluster in sweeper: %w", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&redis.API{}).Zones() { + err := SweepCluster(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/registry/v1/sweepers/sweepers.go b/api/registry/v1/sweepers/sweepers.go new file mode 100644 index 000000000..9e0b33e1f --- /dev/null +++ b/api/registry/v1/sweepers/sweepers.go @@ -0,0 +1,42 @@ +package sweepers + +import ( + "fmt" + + "github.com/scaleway/scaleway-sdk-go/api/registry/v1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepNamespace(scwClient *scw.Client, region scw.Region) error { + registryAPI := registry.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the registry namespaces in (%s)", region) + listNamespaces, err := registryAPI.ListNamespaces( + ®istry.ListNamespacesRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing namespaces in (%s) in sweeper: %s", region, err) + } + + for _, ns := range listNamespaces.Namespaces { + _, err := registryAPI.DeleteNamespace(®istry.DeleteNamespaceRequest{ + NamespaceID: ns.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting namespace in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (®istry.API{}).Regions() { + err := SweepNamespace(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/secret/v1beta1/sweepers/sweepers.go b/api/secret/v1beta1/sweepers/sweepers.go new file mode 100644 index 000000000..b28863213 --- /dev/null +++ b/api/secret/v1beta1/sweepers/sweepers.go @@ -0,0 +1,42 @@ +package sweepers + +import ( + "fmt" + + secretSDK "github.com/scaleway/scaleway-sdk-go/api/secret/v1beta1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepSecret(scwClient *scw.Client, region scw.Region) error { + secretAPI := secretSDK.NewAPI(scwClient) + + logger.Warningf("sweeper: deleting the secrets in (%s)", region) + + listSecrets, err := secretAPI.ListSecrets(&secretSDK.ListSecretsRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing secrets in (%s) in sweeper: %s", region, err) + } + + for _, se := range listSecrets.Secrets { + err := secretAPI.DeleteSecret(&secretSDK.DeleteSecretRequest{ + SecretID: se.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting secret in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&secretSDK.API{}).Regions() { + err := SweepSecret(scwClient, region) + if err != nil { + return err + } + } + return nil +} diff --git a/api/serverless_sqldb/v1alpha1/sweepers/sweepers.go b/api/serverless_sqldb/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..500df957a --- /dev/null +++ b/api/serverless_sqldb/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,44 @@ +package sweepers + +import ( + "fmt" + + sdbSDK "github.com/scaleway/scaleway-sdk-go/api/serverless_sqldb/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepDatabase(scwClient *scw.Client, region scw.Region) error { + sdbAPI := sdbSDK.NewAPI(scwClient) + logger.Warningf("sweeper: destroying the serverless sql database in (%s)", region) + listServerlessSQLDBDatabases, err := sdbAPI.ListDatabases( + &sdbSDK.ListDatabasesRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing database in (%s) in sweeper: %s", region, err) + } + + for _, database := range listServerlessSQLDBDatabases.Databases { + _, err := sdbAPI.DeleteDatabase(&sdbSDK.DeleteDatabaseRequest{ + DatabaseID: database.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting database in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&sdbSDK.API{}).Regions() { + err := SweepDatabase(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/tem/v1alpha1/sweepers/sweepers.go b/api/tem/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..a21e31c29 --- /dev/null +++ b/api/tem/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,35 @@ +package sweepers + +import ( + "fmt" + + temSDK "github.com/scaleway/scaleway-sdk-go/api/tem/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepDomain(scwClient *scw.Client, region scw.Region, skippedDomain string) error { + temAPI := temSDK.NewAPI(scwClient) + logger.Warningf("sweeper: revoking the tem domains in (%s)", region) + + listDomains, err := temAPI.ListDomains(&temSDK.ListDomainsRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing domains in (%s) in sweeper: %s", region, err) + } + + for _, ns := range listDomains.Domains { + if ns.Name == skippedDomain { + logger.Debugf("sweeper: skipping deletion of domain %s", ns.Name) + continue + } + _, err := temAPI.RevokeDomain(&temSDK.RevokeDomainRequest{ + DomainID: ns.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error revoking domain in sweeper: %s", err) + } + } + + return nil +} diff --git a/api/vpc/v2/sweepers/sweepers.go b/api/vpc/v2/sweepers/sweepers.go new file mode 100644 index 000000000..04f0ccda4 --- /dev/null +++ b/api/vpc/v2/sweepers/sweepers.go @@ -0,0 +1,109 @@ +package sweepers + +import ( + "fmt" + + vpcSDK "github.com/scaleway/scaleway-sdk-go/api/vpc/v2" + "github.com/scaleway/scaleway-sdk-go/logger" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepVPC(scwClient *scw.Client, region scw.Region) error { + vpcAPI := vpcSDK.NewAPI(scwClient) + + listVPCs, err := vpcAPI.ListVPCs(&vpcSDK.ListVPCsRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing secrets in (%s) in sweeper: %s", region, err) + } + + for _, v := range listVPCs.Vpcs { + if v.IsDefault { + continue + } + err := vpcAPI.DeleteVPC(&vpcSDK.DeleteVPCRequest{ + VpcID: v.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting VPC in sweeper: %s", err) + } + } + + return nil +} + +func SweepPrivateNetwork(scwClient *scw.Client, region scw.Region) error { + vpcAPI := vpcSDK.NewAPI(scwClient) + + logger.Debugf("sweeper: destroying the private network in (%s)", region) + + listPNResponse, err := vpcAPI.ListPrivateNetworks(&vpcSDK.ListPrivateNetworksRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing private network in sweeper: %s", err) + } + + for _, pn := range listPNResponse.PrivateNetworks { + err := vpcAPI.DeletePrivateNetwork(&vpcSDK.DeletePrivateNetworkRequest{ + Region: region, + PrivateNetworkID: pn.ID, + }) + if err != nil { + return fmt.Errorf("error deleting private network in sweeper: %s", err) + } + } + + return nil +} + +func SweepRoute(scwClient *scw.Client, region scw.Region) error { + vpcAPI := vpcSDK.NewAPI(scwClient) + vpcRouteAPI := vpcSDK.NewRoutesWithNexthopAPI(scwClient) + + logger.Warningf("sweeper: destroying the route in (%s)", region) + + listRoutesResponse, err := vpcRouteAPI.ListRoutesWithNexthop(&vpcSDK.RoutesWithNexthopAPIListRoutesWithNexthopRequest{ + Region: region, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing route in sweeper: %s", err) + } + + for _, routeWithNexthop := range listRoutesResponse.Routes { + if routeWithNexthop.Route != nil { + err := vpcAPI.DeleteRoute(&vpcSDK.DeleteRouteRequest{ + Region: region, + RouteID: routeWithNexthop.Route.ID, + }) + if err != nil { + return fmt.Errorf("error deleting route in sweeper: %s", err) + } + } else { + return fmt.Errorf("route is nil in RouteWithNexthop: %v", routeWithNexthop) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&vpcSDK.API{}).Regions() { + err := SweepVPC(scwClient, region) + if err != nil { + return err + } + + err = SweepPrivateNetwork(scwClient, region) + if err != nil { + return err + } + + err = SweepRoute(scwClient, region) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/vpcgw/v1/sweepers/sweepers.go b/api/vpcgw/v1/sweepers/sweepers.go new file mode 100644 index 000000000..9bcb5eda4 --- /dev/null +++ b/api/vpcgw/v1/sweepers/sweepers.go @@ -0,0 +1,122 @@ +package sweepers + +import ( + "fmt" + + vpcgwSDK "github.com/scaleway/scaleway-sdk-go/api/vpcgw/v1" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepVPCPublicGateway(scwClient *scw.Client, zone scw.Zone) error { + api := vpcgwSDK.NewAPI(scwClient) + + listGatewayResponse, err := api.ListGateways(&vpcgwSDK.ListGatewaysRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing public gateway in sweeper: %w", err) + } + + for _, gateway := range listGatewayResponse.Gateways { + err := api.DeleteGateway(&vpcgwSDK.DeleteGatewayRequest{ + Zone: zone, + GatewayID: gateway.ID, + }) + if err != nil { + return fmt.Errorf("error deleting public gateway in sweeper: %w", err) + } + } + return nil +} + +func SweepGatewayNetworks(scwClient *scw.Client, zone scw.Zone) error { + api := vpcgwSDK.NewAPI(scwClient) + + listPNResponse, err := api.ListGatewayNetworks(&vpcgwSDK.ListGatewayNetworksRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing gateway network in sweeper: %s", err) + } + + for _, gn := range listPNResponse.GatewayNetworks { + err := api.DeleteGatewayNetwork(&vpcgwSDK.DeleteGatewayNetworkRequest{ + GatewayNetworkID: gn.GatewayID, + Zone: zone, + // Cleanup the dhcp resource related. DON'T CALL THE SWEEPER DHCP + CleanupDHCP: true, + }) + if err != nil { + return fmt.Errorf("error deleting gateway network in sweeper: %s", err) + } + } + return nil +} + +func SweepVPCPublicGatewayIP(scwClient *scw.Client, zone scw.Zone) error { + api := vpcgwSDK.NewAPI(scwClient) + + listIPResponse, err := api.ListIPs(&vpcgwSDK.ListIPsRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing public gateway ip in sweeper: %s", err) + } + + for _, ip := range listIPResponse.IPs { + err := api.DeleteIP(&vpcgwSDK.DeleteIPRequest{ + Zone: zone, + IPID: ip.ID, + }) + if err != nil { + return fmt.Errorf("error deleting public gateway ip in sweeper: %s", err) + } + } + return nil +} + +func SweepVPCPublicGatewayDHCP(scwClient *scw.Client, zone scw.Zone) error { + api := vpcgwSDK.NewAPI(scwClient) + + listDHCPsResponse, err := api.ListDHCPs(&vpcgwSDK.ListDHCPsRequest{ + Zone: zone, + }, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing public gateway dhcps in sweeper: %w", err) + } + + for _, dhcp := range listDHCPsResponse.Dhcps { + err := api.DeleteDHCP(&vpcgwSDK.DeleteDHCPRequest{ + Zone: zone, + DHCPID: dhcp.ID, + }) + if err != nil { + return fmt.Errorf("error deleting public gateway dhcp in sweeper: %w", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, zone := range (&vpcgwSDK.API{}).Zones() { + err := SweepVPCPublicGateway(scwClient, zone) + if err != nil { + return err + } + err = SweepGatewayNetworks(scwClient, zone) + if err != nil { + return err + } + err = SweepVPCPublicGatewayIP(scwClient, zone) + if err != nil { + return err + } + err = SweepVPCPublicGatewayDHCP(scwClient, zone) + if err != nil { + return err + } + } + + return nil +} diff --git a/api/webhosting/v1alpha1/sweepers/sweepers.go b/api/webhosting/v1alpha1/sweepers/sweepers.go new file mode 100644 index 000000000..09f4440fa --- /dev/null +++ b/api/webhosting/v1alpha1/sweepers/sweepers.go @@ -0,0 +1,39 @@ +package sweepers + +import ( + "fmt" + + webhostingSDK "github.com/scaleway/scaleway-sdk-go/api/webhosting/v1alpha1" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func SweepWebHosting(scwClient *scw.Client, region scw.Region) error { + webHostingAPI := webhostingSDK.NewAPI(scwClient) + + listHostings, err := webHostingAPI.ListHostings(&webhostingSDK.ListHostingsRequest{Region: region}, scw.WithAllPages()) + if err != nil { + return fmt.Errorf("error listing hostings in (%s) in sweeper: %s", region, err) + } + + for _, hosting := range listHostings.Hostings { + _, err := webHostingAPI.DeleteHosting(&webhostingSDK.DeleteHostingRequest{ + HostingID: hosting.ID, + Region: region, + }) + if err != nil { + return fmt.Errorf("error deleting hosting in sweeper: %s", err) + } + } + + return nil +} + +func SweepAllLocalities(scwClient *scw.Client) error { + for _, region := range (&webhostingSDK.API{}).Regions() { + err := SweepWebHosting(scwClient, region) + if err != nil { + return err + } + } + return nil +} diff --git a/internal/testhelpers/test_resources.go b/internal/testhelpers/test_resources.go new file mode 100644 index 000000000..7a1ed76b4 --- /dev/null +++ b/internal/testhelpers/test_resources.go @@ -0,0 +1,14 @@ +package testhelpers + +import "strings" + +// IsTestResource returns true if given resource identifier is from terraform test +// identifier should be resource name but some resource don't have names +// return true if identifier match regex "tf[-_]test" +// common used prefixes are "tf_tests", "tf_test", "tf-tests", "tf-test" +func IsTestResource(identifier string) bool { + return len(identifier) >= len("tf_test") && + strings.HasPrefix(identifier, "tf") && + (identifier[2] == '_' || identifier[2] == '-') && + identifier[3:7] == "test" +} From 6140d56d1e5cb9580f5436abdfc3330fb892639d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 26 Dec 2024 11:10:18 +0100 Subject: [PATCH 137/163] feat(webhosting): add public v1 offer name and quota warning (#2376) --- api/webhosting/v1/webhosting_sdk.go | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index 835d81c1e..379124ce4 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -562,14 +562,16 @@ func (enum *NameserverStatus) UnmarshalJSON(data []byte) error { type OfferOptionName string const ( - OfferOptionNameUnknownName = OfferOptionName("unknown_name") - OfferOptionNameDomainCount = OfferOptionName("domain_count") - OfferOptionNameEmailCount = OfferOptionName("email_count") - OfferOptionNameStorageGb = OfferOptionName("storage_gb") - OfferOptionNameVcpuCount = OfferOptionName("vcpu_count") - OfferOptionNameRAMGb = OfferOptionName("ram_gb") - OfferOptionNameBackup = OfferOptionName("backup") - OfferOptionNameDedicatedIP = OfferOptionName("dedicated_ip") + OfferOptionNameUnknownName = OfferOptionName("unknown_name") + OfferOptionNameDomainCount = OfferOptionName("domain_count") + OfferOptionNameEmailCount = OfferOptionName("email_count") + OfferOptionNameStorageGb = OfferOptionName("storage_gb") + OfferOptionNameVcpuCount = OfferOptionName("vcpu_count") + OfferOptionNameRAMGb = OfferOptionName("ram_gb") + OfferOptionNameBackup = OfferOptionName("backup") + OfferOptionNameDedicatedIP = OfferOptionName("dedicated_ip") + OfferOptionNameEmailStorageGb = OfferOptionName("email_storage_gb") + OfferOptionNameDatabaseCount = OfferOptionName("database_count") ) func (enum OfferOptionName) String() string { @@ -590,6 +592,8 @@ func (enum OfferOptionName) Values() []OfferOptionName { "ram_gb", "backup", "dedicated_ip", + "email_storage_gb", + "database_count", } } @@ -613,6 +617,7 @@ type OfferOptionWarning string const ( OfferOptionWarningUnknownWarning = OfferOptionWarning("unknown_warning") OfferOptionWarningQuotaExceededWarning = OfferOptionWarning("quota_exceeded_warning") + OfferOptionWarningUsageLowWarning = OfferOptionWarning("usage_low_warning") ) func (enum OfferOptionWarning) String() string { @@ -627,6 +632,7 @@ func (enum OfferOptionWarning) Values() []OfferOptionWarning { return []OfferOptionWarning{ "unknown_warning", "quota_exceeded_warning", + "usage_low_warning", } } @@ -819,6 +825,9 @@ type Offer struct { // ID: offer ID. ID string `json:"id"` + // Name: offer name. + Name string `json:"name"` + // BillingOperationPath: unique identifier used for billing. BillingOperationPath string `json:"billing_operation_path"` @@ -836,6 +845,10 @@ type Offer struct { // EndOfLife: indicates if the offer has reached its end of life. EndOfLife bool `json:"end_of_life"` + + // QuotaWarning: defines a warning if the maximum value for an option in the offer is exceeded. + // Default value: unknown_warning + QuotaWarning OfferOptionWarning `json:"quota_warning"` } // Platform: platform. From b79a14109b317399cb16c23e7bfc44512db7cd57 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 31 Dec 2024 09:36:09 +0100 Subject: [PATCH 138/163] feat(mongodb): add deleteUser route (#2380) --- api/mongodb/v1alpha1/mongodb_sdk.go | 50 +++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/api/mongodb/v1alpha1/mongodb_sdk.go b/api/mongodb/v1alpha1/mongodb_sdk.go index 5b462edaa..88e7ffed3 100644 --- a/api/mongodb/v1alpha1/mongodb_sdk.go +++ b/api/mongodb/v1alpha1/mongodb_sdk.go @@ -772,6 +772,18 @@ type DeleteSnapshotRequest struct { SnapshotID string `json:"-"` } +// DeleteUserRequest: delete user request. +type DeleteUserRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // InstanceID: UUID of the Database Instance the user belongs to. + InstanceID string `json:"-"` + + // Name: name of the database user. + Name string `json:"-"` +} + // GetInstanceCertificateRequest: get instance certificate request. type GetInstanceCertificateRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1785,6 +1797,44 @@ func (s *API) UpdateUser(req *UpdateUserRequest, opts ...scw.RequestOption) (*Us return &resp, nil } +// DeleteUser: Delete an existing user on a Database Instance. +func (s *API) DeleteUser(req *DeleteUserRequest, opts ...scw.RequestOption) error { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.InstanceID) == "" { + return errors.New("field InstanceID cannot be empty in request") + } + + if fmt.Sprint(req.Name) == "" { + return errors.New("field Name cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/mongodb/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/instances/" + fmt.Sprint(req.InstanceID) + "/users/" + fmt.Sprint(req.Name) + "", + } + + err = scwReq.SetBody(req) + if err != nil { + return err + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} + // DeleteEndpoint: Delete the endpoint of a Database Instance. You must specify the `endpoint_id` parameter of the endpoint you want to delete. Note that you might need to update any environment configurations that point to the deleted endpoint. func (s *API) DeleteEndpoint(req *DeleteEndpointRequest, opts ...scw.RequestOption) error { var err error From c8037cc98c1be951b32e8ef959ef6a94d0bf4ae8 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 31 Dec 2024 09:36:37 +0100 Subject: [PATCH 139/163] docs(k8s): improve documentation (#2377) --- api/k8s/v1/k8s_sdk.go | 61 +++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index 47631053c..afd203d46 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -747,7 +747,7 @@ type ClusterAutoscalerConfig struct { // ScaleDownDisabled: disable the cluster autoscaler. ScaleDownDisabled bool `json:"scale_down_disabled"` - // ScaleDownDelayAfterAdd: how long after scale up that scale down evaluation resumes. + // ScaleDownDelayAfterAdd: how long after scale up the scale down evaluation resumes. ScaleDownDelayAfterAdd string `json:"scale_down_delay_after_add"` // Estimator: type of resource estimator to be used in scale up. @@ -840,17 +840,17 @@ type Pool struct { // MaxSize: defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool. MaxSize uint32 `json:"max_size"` - // ContainerRuntime: customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + // ContainerRuntime: customization of the container runtime is available for each pool. // Default value: unknown_runtime ContainerRuntime Runtime `json:"container_runtime"` // Autohealing: defines whether the autohealing feature is enabled for the pool. Autohealing bool `json:"autohealing"` - // Tags: tags associated with the pool. + // Tags: tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). Tags []string `json:"tags"` - // PlacementGroupID: placement group ID in which all the nodes of the pool will be created. + // PlacementGroupID: placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. PlacementGroupID *string `json:"placement_group_id"` // KubeletArgs: kubelet arguments to be used by this pool. Note that this feature is experimental. @@ -862,7 +862,10 @@ type Pool struct { // Zone: zone in which the pool's nodes will be spawned. Zone scw.Zone `json:"zone"` - // RootVolumeType: defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + // RootVolumeType: * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types + // * `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits + // * `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits + // * `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. // Default value: default_volume_type RootVolumeType PoolVolumeType `json:"root_volume_type"` @@ -921,7 +924,7 @@ type CreateClusterRequestAutoscalerConfig struct { // ScaleDownDisabled: disable the cluster autoscaler. ScaleDownDisabled *bool `json:"scale_down_disabled"` - // ScaleDownDelayAfterAdd: how long after scale up that scale down evaluation resumes. + // ScaleDownDelayAfterAdd: how long after scale up the scale down evaluation resumes. ScaleDownDelayAfterAdd *string `json:"scale_down_delay_after_add"` // Estimator: type of resource estimator to be used in scale up. @@ -983,7 +986,7 @@ type CreateClusterRequestPoolConfig struct { // NodeType: node type is the type of Scaleway Instance wanted for the pool. Nodes with insufficient memory are not eligible (DEV1-S, PLAY2-PICO, STARDUST). 'external' is a special node type used to provision instances from other cloud providers in a Kosmos Cluster. NodeType string `json:"node_type"` - // PlacementGroupID: placement group ID in which all the nodes of the pool will be created. + // PlacementGroupID: placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. PlacementGroupID *string `json:"placement_group_id"` // Autoscaling: defines whether the autoscaling feature is enabled for the pool. @@ -998,14 +1001,14 @@ type CreateClusterRequestPoolConfig struct { // MaxSize: defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool. MaxSize *uint32 `json:"max_size"` - // ContainerRuntime: customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + // ContainerRuntime: customization of the container runtime is available for each pool. // Default value: unknown_runtime ContainerRuntime Runtime `json:"container_runtime"` // Autohealing: defines whether the autohealing feature is enabled for the pool. Autohealing bool `json:"autohealing"` - // Tags: tags associated with the pool. + // Tags: tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). Tags []string `json:"tags"` // KubeletArgs: kubelet arguments to be used by this pool. Note that this feature is experimental. @@ -1017,7 +1020,10 @@ type CreateClusterRequestPoolConfig struct { // Zone: zone in which the pool's nodes will be spawned. Zone scw.Zone `json:"zone"` - // RootVolumeType: defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + // RootVolumeType: * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types + // * `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits + // * `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits + // * `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. // Default value: default_volume_type RootVolumeType PoolVolumeType `json:"root_volume_type"` @@ -1158,7 +1164,7 @@ type Cluster struct { // AutoscalerConfig: autoscaler config for the cluster. AutoscalerConfig *ClusterAutoscalerConfig `json:"autoscaler_config"` - // AutoUpgrade: auto upgrade configuration of the cluster. + // AutoUpgrade: auto upgrade Kubernetes version of the cluster. AutoUpgrade *ClusterAutoUpgrade `json:"auto_upgrade"` // UpgradeAvailable: defines whether a new Kubernetes version is available. @@ -1255,7 +1261,7 @@ type UpdateClusterRequestAutoscalerConfig struct { // ScaleDownDisabled: disable the cluster autoscaler. ScaleDownDisabled *bool `json:"scale_down_disabled"` - // ScaleDownDelayAfterAdd: how long after scale up that scale down evaluation resumes. + // ScaleDownDelayAfterAdd: how long after scale up the scale down evaluation resumes. ScaleDownDelayAfterAdd *string `json:"scale_down_delay_after_add"` // Estimator: type of resource estimator to be used in scale up. @@ -1356,7 +1362,7 @@ type CreateClusterRequest struct { // Precisely one of ProjectID, OrganizationID must be set. ProjectID *string `json:"project_id,omitempty"` - // Type: type of the cluster (possible values are kapsule, multicloud, kapsule-dedicated-8, kapsule-dedicated-16). + // Type: type of the cluster. See [list available cluster types](#list-available-cluster-types-for-a-cluster) for a list of valid types. Type string `json:"type"` // Name: cluster name. @@ -1422,7 +1428,7 @@ type CreatePoolRequest struct { // NodeType: node type is the type of Scaleway Instance wanted for the pool. Nodes with insufficient memory are not eligible (DEV1-S, PLAY2-PICO, STARDUST). 'external' is a special node type used to provision instances from other cloud providers in a Kosmos Cluster. NodeType string `json:"node_type"` - // PlacementGroupID: placement group ID in which all the nodes of the pool will be created. + // PlacementGroupID: placement group ID in which all the nodes of the pool will be created, placement groups are limited to 20 instances. PlacementGroupID *string `json:"placement_group_id,omitempty"` // Autoscaling: defines whether the autoscaling feature is enabled for the pool. @@ -1437,14 +1443,14 @@ type CreatePoolRequest struct { // MaxSize: defines the maximum size of the pool. Note that this field is only used when autoscaling is enabled on the pool. MaxSize *uint32 `json:"max_size,omitempty"` - // ContainerRuntime: customization of the container runtime is available for each pool. Note that `docker` has been deprecated since version 1.20 and will be removed by version 1.24. + // ContainerRuntime: customization of the container runtime is available for each pool. // Default value: unknown_runtime ContainerRuntime Runtime `json:"container_runtime"` // Autohealing: defines whether the autohealing feature is enabled for the pool. Autohealing bool `json:"autohealing"` - // Tags: tags associated with the pool. + // Tags: tags associated with the pool, see [managing tags](https://www.scaleway.com/en/docs/containers/kubernetes/api-cli/managing-tags). Tags []string `json:"tags"` // KubeletArgs: kubelet arguments to be used by this pool. Note that this feature is experimental. @@ -1456,7 +1462,10 @@ type CreatePoolRequest struct { // Zone: zone in which the pool's nodes will be spawned. Zone scw.Zone `json:"zone"` - // RootVolumeType: defines the system volume disk type. Two different types of volume (`volume_type`) are provided: `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. `b_ssd` is a remote block storage which means your system is stored on a centralized and resilient cluster. + // RootVolumeType: * `l_ssd` is a local block storage which means your system is stored locally on your node's hypervisor. This type is not available for all node types + // * `sbs-5k` is a remote block storage which means your system is stored on a centralized and resilient cluster with 5k IOPS limits + // * `sbs-15k` is a faster remote block storage which means your system is stored on a centralized and resilient cluster with 15k IOPS limits + // * `b_ssd` is the legacy remote block storage which means your system is stored on a centralized and resilient cluster. Consider using `sbs-5k` or `sbs-15k` instead. // Default value: default_volume_type RootVolumeType PoolVolumeType `json:"root_volume_type"` @@ -2036,7 +2045,7 @@ type UpdateClusterRequest struct { // AutoscalerConfig: new autoscaler config for the cluster. AutoscalerConfig *UpdateClusterRequestAutoscalerConfig `json:"autoscaler_config,omitempty"` - // AutoUpgrade: new auto upgrade configuration for the cluster. Note that all fields need to be set. + // AutoUpgrade: new auto upgrade configuration for the cluster. Note that all fields needs to be set. AutoUpgrade *UpdateClusterRequestAutoUpgrade `json:"auto_upgrade,omitempty"` // FeatureGates: list of feature gates to enable. @@ -2284,7 +2293,7 @@ func (s *API) UpdateCluster(req *UpdateClusterRequest, opts ...scw.RequestOption return &resp, nil } -// DeleteCluster: Delete a specific Kubernetes cluster and all its associated pools and nodes. Note that this method will not delete any Load Balancer or Block Volume that are associated with the cluster. +// DeleteCluster: Delete a specific Kubernetes cluster and all its associated pools and nodes, and possibly its associated Load Balancers or Block Volumes. func (s *API) DeleteCluster(req *DeleteClusterRequest, opts ...scw.RequestOption) (*Cluster, error) { var err error @@ -2355,7 +2364,7 @@ func (s *API) UpgradeCluster(req *UpgradeClusterRequest, opts ...scw.RequestOpti return &resp, nil } -// SetClusterType: Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#path-clusters-list-available-cluster-types-for-a-cluster). +// SetClusterType: Change the type of a specific Kubernetes cluster. To see the possible values you can enter for the `type` field, [list available cluster types](#list-available-cluster-types-for-a-cluster). func (s *API) SetClusterType(req *SetClusterTypeRequest, opts ...scw.RequestOption) (*Cluster, error) { var err error @@ -2489,7 +2498,7 @@ func (s *API) getClusterKubeConfig(req *GetClusterKubeConfigRequest, opts ...scw return &resp, nil } -// ResetClusterAdminToken: Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download kubeconfig again to keep interacting with the cluster. +// ResetClusterAdminToken: Reset the admin token for a specific Kubernetes cluster. This will revoke the old admin token (which will not be usable afterwards) and create a new one. Note that you will need to download the kubeconfig again to keep interacting with the cluster. func (s *API) ResetClusterAdminToken(req *ResetClusterAdminTokenRequest, opts ...scw.RequestOption) error { var err error @@ -2524,6 +2533,7 @@ func (s *API) ResetClusterAdminToken(req *ResetClusterAdminTokenRequest, opts .. } // MigrateClusterToSBSCSI: Enable the latest CSI compatible with Scaleway Block Storage (SBS) and migrate all existing PersistentVolumes/VolumeSnapshotContents to SBS. +// Make sure to have the necessary Quota before running this command. func (s *API) MigrateClusterToSBSCSI(req *MigrateClusterToSBSCSIRequest, opts ...scw.RequestOption) (*Cluster, error) { var err error @@ -2822,6 +2832,7 @@ func (s *API) GetPool(req *GetPoolRequest, opts ...scw.RequestOption) (*Pool, er } // UpgradePool: Upgrade the Kubernetes version of a specific pool. Note that it only works if the targeted version matches the cluster's version. +// This will drain and replace the nodes in that pool. func (s *API) UpgradePool(req *UpgradePoolRequest, opts ...scw.RequestOption) (*Pool, error) { var err error @@ -2857,7 +2868,7 @@ func (s *API) UpgradePool(req *UpgradePoolRequest, opts ...scw.RequestOption) (* return &resp, nil } -// UpdatePool: Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. +// UpdatePool: Update the attributes of a specific pool, such as its desired size, autoscaling settings, and tags. To upgrade a pool, you will need to use the dedicated endpoint. func (s *API) UpdatePool(req *UpdatePoolRequest, opts ...scw.RequestOption) (*Pool, error) { var err error @@ -3099,7 +3110,7 @@ func (s *API) GetNode(req *GetNodeRequest, opts ...scw.RequestOption) (*Node, er return &resp, nil } -// Deprecated: ReplaceNode: Replace a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. +// Deprecated: ReplaceNode: Replace a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. func (s *API) ReplaceNode(req *ReplaceNodeRequest, opts ...scw.RequestOption) (*Node, error) { var err error @@ -3135,7 +3146,7 @@ func (s *API) ReplaceNode(req *ReplaceNodeRequest, opts ...scw.RequestOption) (* return &resp, nil } -// RebootNode: Reboot a specific Node. The node will first be cordoned (scheduling will be disabled on it). The existing pods on the node will then be drained and rescheduled onto another schedulable node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. +// RebootNode: Reboot a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. func (s *API) RebootNode(req *RebootNodeRequest, opts ...scw.RequestOption) (*Node, error) { var err error @@ -3171,7 +3182,7 @@ func (s *API) RebootNode(req *RebootNodeRequest, opts ...scw.RequestOption) (*No return &resp, nil } -// DeleteNode: Delete a specific Node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster), disruption of your applications can be expected. +// DeleteNode: Delete a specific Node. The node will first be drained and pods will be rescheduled onto another node. Note that when there is not enough space to reschedule all the pods (such as in a one-node cluster, or with specific constraints), disruption of your applications may occur. func (s *API) DeleteNode(req *DeleteNodeRequest, opts ...scw.RequestOption) (*Node, error) { var err error From 1ab18bc1a2eaad660cb8ab5be191fc1b4c0585ca Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 31 Dec 2024 09:37:37 +0100 Subject: [PATCH 140/163] feat(applesilicon): add support for private networks (#2378) --- api/applesilicon/v1alpha1/applesilicon_sdk.go | 426 ++++++++++++++++++ 1 file changed, 426 insertions(+) diff --git a/api/applesilicon/v1alpha1/applesilicon_sdk.go b/api/applesilicon/v1alpha1/applesilicon_sdk.go index c99b33e95..e961052c3 100644 --- a/api/applesilicon/v1alpha1/applesilicon_sdk.go +++ b/api/applesilicon/v1alpha1/applesilicon_sdk.go @@ -117,6 +117,47 @@ func (enum *ConnectivityDiagnosticDiagnosticStatus) UnmarshalJSON(data []byte) e return nil } +type ListServerPrivateNetworksRequestOrderBy string + +const ( + ListServerPrivateNetworksRequestOrderByCreatedAtAsc = ListServerPrivateNetworksRequestOrderBy("created_at_asc") + ListServerPrivateNetworksRequestOrderByCreatedAtDesc = ListServerPrivateNetworksRequestOrderBy("created_at_desc") + ListServerPrivateNetworksRequestOrderByUpdatedAtAsc = ListServerPrivateNetworksRequestOrderBy("updated_at_asc") + ListServerPrivateNetworksRequestOrderByUpdatedAtDesc = ListServerPrivateNetworksRequestOrderBy("updated_at_desc") +) + +func (enum ListServerPrivateNetworksRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_asc" + } + return string(enum) +} + +func (enum ListServerPrivateNetworksRequestOrderBy) Values() []ListServerPrivateNetworksRequestOrderBy { + return []ListServerPrivateNetworksRequestOrderBy{ + "created_at_asc", + "created_at_desc", + "updated_at_asc", + "updated_at_desc", + } +} + +func (enum ListServerPrivateNetworksRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListServerPrivateNetworksRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListServerPrivateNetworksRequestOrderBy(ListServerPrivateNetworksRequestOrderBy(tmp).String()) + return nil +} + type ListServersRequestOrderBy string const ( @@ -154,6 +195,51 @@ func (enum *ListServersRequestOrderBy) UnmarshalJSON(data []byte) error { return nil } +type ServerPrivateNetworkServerStatus string + +const ( + ServerPrivateNetworkServerStatusUnknownStatus = ServerPrivateNetworkServerStatus("unknown_status") + ServerPrivateNetworkServerStatusAttaching = ServerPrivateNetworkServerStatus("attaching") + ServerPrivateNetworkServerStatusAttached = ServerPrivateNetworkServerStatus("attached") + ServerPrivateNetworkServerStatusError = ServerPrivateNetworkServerStatus("error") + ServerPrivateNetworkServerStatusDetaching = ServerPrivateNetworkServerStatus("detaching") + ServerPrivateNetworkServerStatusLocked = ServerPrivateNetworkServerStatus("locked") +) + +func (enum ServerPrivateNetworkServerStatus) String() string { + if enum == "" { + // return default value if empty + return "unknown_status" + } + return string(enum) +} + +func (enum ServerPrivateNetworkServerStatus) Values() []ServerPrivateNetworkServerStatus { + return []ServerPrivateNetworkServerStatus{ + "unknown_status", + "attaching", + "attached", + "error", + "detaching", + "locked", + } +} + +func (enum ServerPrivateNetworkServerStatus) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ServerPrivateNetworkServerStatus) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ServerPrivateNetworkServerStatus(ServerPrivateNetworkServerStatus(tmp).String()) + return nil +} + type ServerPrivateNetworkStatus string const ( @@ -369,6 +455,37 @@ type ConnectivityDiagnosticServerHealth struct { IsVncPortUp bool `json:"is_vnc_port_up"` } +// ServerPrivateNetwork: server private network. +type ServerPrivateNetwork struct { + // ID: ID of the Server-to-Private Network mapping. + ID string `json:"id"` + + // ProjectID: private Network Project ID. + ProjectID string `json:"project_id"` + + // ServerID: apple silicon server ID. + ServerID string `json:"server_id"` + + // PrivateNetworkID: private Network ID. + PrivateNetworkID string `json:"private_network_id"` + + // Vlan: ID of the VLAN associated with the Private Network. + Vlan *uint32 `json:"vlan"` + + // Status: configuration status of the Private Network. + // Default value: unknown_status + Status ServerPrivateNetworkServerStatus `json:"status"` + + // CreatedAt: private Network creation date. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: date the Private Network was last modified. + UpdatedAt *time.Time `json:"updated_at"` + + // IpamIPIDs: iPAM IP IDs of the server, if it has any. + IpamIPIDs []string `json:"ipam_ip_ids"` +} + // ServerType: server type. type ServerType struct { // CPU: CPU description. @@ -589,6 +706,32 @@ func (r *ListOSResponse) UnsafeAppend(res interface{}) (uint32, error) { return uint32(len(results.Os)), nil } +// ListServerPrivateNetworksResponse: list server private networks response. +type ListServerPrivateNetworksResponse struct { + ServerPrivateNetworks []*ServerPrivateNetwork `json:"server_private_networks"` + + TotalCount uint64 `json:"total_count"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListServerPrivateNetworksResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListServerPrivateNetworksResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListServerPrivateNetworksResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.ServerPrivateNetworks = append(r.ServerPrivateNetworks, results.ServerPrivateNetworks...) + r.TotalCount += uint64(len(results.ServerPrivateNetworks)) + return uint64(len(results.ServerPrivateNetworks)), nil +} + // ListServerTypesRequest: list server types request. type ListServerTypesRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -651,6 +794,86 @@ func (r *ListServersResponse) UnsafeAppend(res interface{}) (uint32, error) { return uint32(len(results.Servers)), nil } +// PrivateNetworkAPIAddServerPrivateNetworkRequest: private network api add server private network request. +type PrivateNetworkAPIAddServerPrivateNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ServerID: ID of the server. + ServerID string `json:"-"` + + // PrivateNetworkID: ID of the Private Network. + PrivateNetworkID string `json:"private_network_id"` + + // IpamIPIDs: iPAM IDs of IPs to attach to the server. + IpamIPIDs []string `json:"ipam_ip_ids"` +} + +// PrivateNetworkAPIDeleteServerPrivateNetworkRequest: private network api delete server private network request. +type PrivateNetworkAPIDeleteServerPrivateNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ServerID: ID of the server. + ServerID string `json:"-"` + + // PrivateNetworkID: ID of the Private Network. + PrivateNetworkID string `json:"-"` +} + +// PrivateNetworkAPIGetServerPrivateNetworkRequest: private network api get server private network request. +type PrivateNetworkAPIGetServerPrivateNetworkRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + ServerID string `json:"-"` + + PrivateNetworkID string `json:"-"` +} + +// PrivateNetworkAPIListServerPrivateNetworksRequest: private network api list server private networks request. +type PrivateNetworkAPIListServerPrivateNetworksRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // OrderBy: sort order for the returned Private Networks. + // Default value: created_at_asc + OrderBy ListServerPrivateNetworksRequestOrderBy `json:"-"` + + // Page: page number for the returned Private Networks. + Page *int32 `json:"-"` + + // PageSize: maximum number of Private Networks per page. + PageSize *uint32 `json:"-"` + + // ServerID: filter Private Networks by server ID. + ServerID *string `json:"-"` + + // PrivateNetworkID: filter Private Networks by Private Network ID. + PrivateNetworkID *string `json:"-"` + + // OrganizationID: filter Private Networks by Organization ID. + OrganizationID *string `json:"-"` + + // ProjectID: filter Private Networks by Project ID. + ProjectID *string `json:"-"` + + // IpamIPIDs: filter Private Networks by IPAM IP IDs. + IpamIPIDs []string `json:"-"` +} + +// PrivateNetworkAPISetServerPrivateNetworksRequest: private network api set server private networks request. +type PrivateNetworkAPISetServerPrivateNetworksRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // ServerID: ID of the server. + ServerID string `json:"-"` + + // PerPrivateNetworkIpamIPIDs: object where the keys are the IDs of Private Networks and the values are arrays of IPAM IDs representing the IPs to assign to this Apple silicon server on the Private Network. If the array supplied for a Private Network is empty, the next available IP from the Private Network's CIDR block will automatically be used for attachment. + PerPrivateNetworkIpamIPIDs map[string]*[]string `json:"per_private_network_ipam_ip_ids"` +} + // RebootServerRequest: reboot server request. type RebootServerRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -672,6 +895,11 @@ type ReinstallServerRequest struct { OsID *string `json:"os_id,omitempty"` } +// SetServerPrivateNetworksResponse: set server private networks response. +type SetServerPrivateNetworksResponse struct { + ServerPrivateNetworks []*ServerPrivateNetwork `json:"server_private_networks"` +} + // StartConnectivityDiagnosticRequest: start connectivity diagnostic request. type StartConnectivityDiagnosticRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -1157,3 +1385,201 @@ func (s *API) GetConnectivityDiagnostic(req *GetConnectivityDiagnosticRequest, o } return &resp, nil } + +// Apple silicon - Private Networks API. +type PrivateNetworkAPI struct { + client *scw.Client +} + +// NewPrivateNetworkAPI returns a PrivateNetworkAPI object from a Scaleway client. +func NewPrivateNetworkAPI(client *scw.Client) *PrivateNetworkAPI { + return &PrivateNetworkAPI{ + client: client, + } +} +func (s *PrivateNetworkAPI) Zones() []scw.Zone { + return []scw.Zone{scw.ZoneFrPar1, scw.ZoneFrPar3} +} + +// GetServerPrivateNetwork: +func (s *PrivateNetworkAPI) GetServerPrivateNetwork(req *PrivateNetworkAPIGetServerPrivateNetworkRequest, opts ...scw.RequestOption) (*ServerPrivateNetwork, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.ServerID) == "" { + return nil, errors.New("field ServerID cannot be empty in request") + } + + if fmt.Sprint(req.PrivateNetworkID) == "" { + return nil, errors.New("field PrivateNetworkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/private-networks/" + fmt.Sprint(req.PrivateNetworkID) + "", + } + + var resp ServerPrivateNetwork + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// AddServerPrivateNetwork: Add an Apple silicon server to a Private Network. +func (s *PrivateNetworkAPI) AddServerPrivateNetwork(req *PrivateNetworkAPIAddServerPrivateNetworkRequest, opts ...scw.RequestOption) (*ServerPrivateNetwork, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.ServerID) == "" { + return nil, errors.New("field ServerID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/private-networks", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp ServerPrivateNetwork + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// SetServerPrivateNetworks: Configure multiple Private Networks on an Apple silicon server. +func (s *PrivateNetworkAPI) SetServerPrivateNetworks(req *PrivateNetworkAPISetServerPrivateNetworksRequest, opts ...scw.RequestOption) (*SetServerPrivateNetworksResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.ServerID) == "" { + return nil, errors.New("field ServerID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PUT", + Path: "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/private-networks", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp SetServerPrivateNetworksResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListServerPrivateNetworks: List the Private Networks of an Apple silicon server. +func (s *PrivateNetworkAPI) ListServerPrivateNetworks(req *PrivateNetworkAPIListServerPrivateNetworksRequest, opts ...scw.RequestOption) (*ListServerPrivateNetworksResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "server_id", req.ServerID) + parameter.AddToQuery(query, "private_network_id", req.PrivateNetworkID) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "project_id", req.ProjectID) + parameter.AddToQuery(query, "ipam_ip_ids", req.IpamIPIDs) + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/server-private-networks", + Query: query, + } + + var resp ListServerPrivateNetworksResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteServerPrivateNetwork: Delete a Private Network. +func (s *PrivateNetworkAPI) DeleteServerPrivateNetwork(req *PrivateNetworkAPIDeleteServerPrivateNetworkRequest, opts ...scw.RequestOption) error { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.ServerID) == "" { + return errors.New("field ServerID cannot be empty in request") + } + + if fmt.Sprint(req.PrivateNetworkID) == "" { + return errors.New("field PrivateNetworkID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/apple-silicon/v1alpha1/zones/" + fmt.Sprint(req.Zone) + "/servers/" + fmt.Sprint(req.ServerID) + "/private-networks/" + fmt.Sprint(req.PrivateNetworkID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From befb9b9f9dd4c57304ec6ce1973cd526353d0286 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 31 Dec 2024 09:39:13 +0100 Subject: [PATCH 141/163] feat(k8s): add support for listing options for ListNodes (#2379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémy Léone --- api/k8s/v1/k8s_sdk.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/api/k8s/v1/k8s_sdk.go b/api/k8s/v1/k8s_sdk.go index afd203d46..01d80a706 100644 --- a/api/k8s/v1/k8s_sdk.go +++ b/api/k8s/v1/k8s_sdk.go @@ -369,6 +369,14 @@ type ListNodesRequestOrderBy string const ( ListNodesRequestOrderByCreatedAtAsc = ListNodesRequestOrderBy("created_at_asc") ListNodesRequestOrderByCreatedAtDesc = ListNodesRequestOrderBy("created_at_desc") + ListNodesRequestOrderByUpdatedAtAsc = ListNodesRequestOrderBy("updated_at_asc") + ListNodesRequestOrderByUpdatedAtDesc = ListNodesRequestOrderBy("updated_at_desc") + ListNodesRequestOrderByNameAsc = ListNodesRequestOrderBy("name_asc") + ListNodesRequestOrderByNameDesc = ListNodesRequestOrderBy("name_desc") + ListNodesRequestOrderByStatusAsc = ListNodesRequestOrderBy("status_asc") + ListNodesRequestOrderByStatusDesc = ListNodesRequestOrderBy("status_desc") + ListNodesRequestOrderByVersionAsc = ListNodesRequestOrderBy("version_asc") + ListNodesRequestOrderByVersionDesc = ListNodesRequestOrderBy("version_desc") ) func (enum ListNodesRequestOrderBy) String() string { @@ -383,6 +391,14 @@ func (enum ListNodesRequestOrderBy) Values() []ListNodesRequestOrderBy { return []ListNodesRequestOrderBy{ "created_at_asc", "created_at_desc", + "updated_at_asc", + "updated_at_desc", + "name_asc", + "name_desc", + "status_asc", + "status_desc", + "version_asc", + "version_desc", } } From 1be16fad27b240562c101251279ff68b4fbdd303 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 8 Jan 2025 10:31:24 +0100 Subject: [PATCH 142/163] feat(webhosting): add option support (#2381) --- api/webhosting/v1/webhosting_sdk.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index 379124ce4..a11596ac4 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -572,6 +572,7 @@ const ( OfferOptionNameDedicatedIP = OfferOptionName("dedicated_ip") OfferOptionNameEmailStorageGb = OfferOptionName("email_storage_gb") OfferOptionNameDatabaseCount = OfferOptionName("database_count") + OfferOptionNameSupport = OfferOptionName("support") ) func (enum OfferOptionName) String() string { @@ -594,6 +595,7 @@ func (enum OfferOptionName) Values() []OfferOptionName { "dedicated_ip", "email_storage_gb", "database_count", + "support", } } From 24fe89df09707817a34ec4716631485ccc7fc0e4 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 10 Jan 2025 14:51:12 +0100 Subject: [PATCH 143/163] fix(containers): update doc descriptions with correct wording (#2382) --- api/container/v1beta1/container_sdk.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/container/v1beta1/container_sdk.go b/api/container/v1beta1/container_sdk.go index fbfd0ebc1..d722ff5d9 100644 --- a/api/container/v1beta1/container_sdk.go +++ b/api/container/v1beta1/container_sdk.go @@ -2468,7 +2468,7 @@ func (s *API) DeleteCron(req *DeleteCronRequest, opts ...scw.RequestOption) (*Cr return &resp, nil } -// ListDomains: List all domain name bindings in a specified region. +// ListDomains: List all custom domains in a specified region. func (s *API) ListDomains(req *ListDomainsRequest, opts ...scw.RequestOption) (*ListDomainsResponse, error) { var err error @@ -2507,7 +2507,7 @@ func (s *API) ListDomains(req *ListDomainsRequest, opts ...scw.RequestOption) (* return &resp, nil } -// GetDomain: Get a domain name binding for the container with the specified ID. +// GetDomain: Get a custom domain for the container with the specified ID. func (s *API) GetDomain(req *GetDomainRequest, opts ...scw.RequestOption) (*Domain, error) { var err error @@ -2538,7 +2538,7 @@ func (s *API) GetDomain(req *GetDomainRequest, opts ...scw.RequestOption) (*Doma return &resp, nil } -// CreateDomain: Create a domain name binding for the container with the specified ID. +// CreateDomain: Create a custom domain for the container with the specified ID. func (s *API) CreateDomain(req *CreateDomainRequest, opts ...scw.RequestOption) (*Domain, error) { var err error @@ -2570,7 +2570,7 @@ func (s *API) CreateDomain(req *CreateDomainRequest, opts ...scw.RequestOption) return &resp, nil } -// DeleteDomain: Delete the domain name binding with the specific ID. +// DeleteDomain: Delete the custom domain with the specific ID. func (s *API) DeleteDomain(req *DeleteDomainRequest, opts ...scw.RequestOption) (*Domain, error) { var err error From ef7be5a7df5d719e3c95fa6c030e699c1c2d9bb1 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 10 Jan 2025 15:34:11 +0100 Subject: [PATCH 144/163] feat(vpcgw): add support BastionAllowedIPs (#2383) Co-authored-by: Laure-di <62625835+Laure-di@users.noreply.github.com> --- api/vpcgw/v2/vpcgw_sdk.go | 156 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/api/vpcgw/v2/vpcgw_sdk.go b/api/vpcgw/v2/vpcgw_sdk.go index cfd64b179..496a8ac0d 100644 --- a/api/vpcgw/v2/vpcgw_sdk.go +++ b/api/vpcgw/v2/vpcgw_sdk.go @@ -491,6 +491,9 @@ type Gateway struct { // IsLegacy: defines whether the gateway uses non-IPAM IP configurations. IsLegacy bool `json:"is_legacy"` + // BastionAllowedIPs: ranges of IP addresses allowed to connect to the gateway's SSH bastion. + BastionAllowedIPs []scw.IPNet `json:"bastion_allowed_ips"` + // Zone: zone of the gateway. Zone scw.Zone `json:"zone"` } @@ -542,6 +545,24 @@ type SetPatRulesRequestRule struct { Protocol PatRuleProtocol `json:"protocol"` } +// AddBastionAllowedIPsRequest: add bastion allowed i ps request. +type AddBastionAllowedIPsRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway to add the allowed IP range to. + GatewayID string `json:"-"` + + // IPRange: IP range allowed to connect to the SSH bastion. + IPRange scw.IPNet `json:"ip_range"` +} + +// AddBastionAllowedIPsResponse: add bastion allowed i ps response. +type AddBastionAllowedIPsResponse struct { + // IPRanges: ranges of IP addresses allowed to connect to the gateway's SSH bastion. + IPRanges []scw.IPNet `json:"ip_ranges"` +} + // CreateGatewayNetworkRequest: create gateway network request. type CreateGatewayNetworkRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -627,6 +648,18 @@ type CreatePatRuleRequest struct { Protocol PatRuleProtocol `json:"protocol"` } +// DeleteBastionAllowedIPsRequest: delete bastion allowed i ps request. +type DeleteBastionAllowedIPsRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway on which to delete the allowed IP range. + GatewayID string `json:"-"` + + // IPRange: IP range to delete from SSH bastion's list of allowed IPs. + IPRange scw.IPNet `json:"-"` +} + // DeleteGatewayNetworkRequest: delete gateway network request. type DeleteGatewayNetworkRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -960,6 +993,24 @@ type RefreshSSHKeysRequest struct { GatewayID string `json:"-"` } +// SetBastionAllowedIPsRequest: set bastion allowed i ps request. +type SetBastionAllowedIPsRequest struct { + // Zone: zone to target. If none is passed will use default zone from the config. + Zone scw.Zone `json:"-"` + + // GatewayID: ID of the gateway on which to set the allowed IP range. + GatewayID string `json:"-"` + + // IPRanges: new list of IP ranges (each range in CIDR notation) allowed to connect to the SSH bastion. + IPRanges []string `json:"ip_ranges"` +} + +// SetBastionAllowedIPsResponse: set bastion allowed i ps response. +type SetBastionAllowedIPsResponse struct { + // IPRanges: ranges of IP addresses allowed to connect to the gateway's SSH bastion. + IPRanges []scw.IPNet `json:"ip_ranges"` +} + // SetPatRulesRequest: set pat rules request. type SetPatRulesRequest struct { // Zone: zone to target. If none is passed will use default zone from the config. @@ -1923,3 +1974,108 @@ func (s *API) RefreshSSHKeys(req *RefreshSSHKeysRequest, opts ...scw.RequestOpti } return &resp, nil } + +// AddBastionAllowedIPs: Add an IP range (in CIDR notation) to be allowed to connect to the SSH bastion. +func (s *API) AddBastionAllowedIPs(req *AddBastionAllowedIPsRequest, opts ...scw.RequestOption) (*AddBastionAllowedIPsResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return nil, errors.New("field GatewayID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "/bastion-allowed-ips", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp AddBastionAllowedIPsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// SetBastionAllowedIPs: Set a definitive list of IP ranges (in CIDR notation) allowed to connect to the SSH bastion. +func (s *API) SetBastionAllowedIPs(req *SetBastionAllowedIPsRequest, opts ...scw.RequestOption) (*SetBastionAllowedIPsResponse, error) { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return nil, errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return nil, errors.New("field GatewayID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "PUT", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "/bastion-allowed-ips", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp SetBastionAllowedIPsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteBastionAllowedIPs: Delete an IP range (defined in CIDR notation) from SSH bastion, so that it is no longer allowed to connect. +func (s *API) DeleteBastionAllowedIPs(req *DeleteBastionAllowedIPsRequest, opts ...scw.RequestOption) error { + var err error + + if req.Zone == "" { + defaultZone, _ := s.client.GetDefaultZone() + req.Zone = defaultZone + } + + if fmt.Sprint(req.Zone) == "" { + return errors.New("field Zone cannot be empty in request") + } + + if fmt.Sprint(req.GatewayID) == "" { + return errors.New("field GatewayID cannot be empty in request") + } + + if fmt.Sprint(req.IPRange) == "" { + return errors.New("field IPRange cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/vpc-gw/v2/zones/" + fmt.Sprint(req.Zone) + "/gateways/" + fmt.Sprint(req.GatewayID) + "/bastion-allowed-ips/" + fmt.Sprint(req.IPRange) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From 44bd5547ea5b57d00523c5de3fbc66133a9d483d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Mon, 13 Jan 2025 18:51:14 +0100 Subject: [PATCH 145/163] feat(tem): generate blocklist sdk (#2384) --- api/tem/v1alpha1/tem_sdk.go | 312 ++++++++++++++++++++++++++++++++++++ 1 file changed, 312 insertions(+) diff --git a/api/tem/v1alpha1/tem_sdk.go b/api/tem/v1alpha1/tem_sdk.go index d8e0aaffa..f04b34cec 100644 --- a/api/tem/v1alpha1/tem_sdk.go +++ b/api/tem/v1alpha1/tem_sdk.go @@ -39,6 +39,48 @@ var ( _ = namegenerator.GetRandomName ) +type BlocklistType string + +const ( + // If unspecified, the type of blocklist is unknown by default. + BlocklistTypeUnknownType = BlocklistType("unknown_type") + // The recipient's mailbox is full and cannot receive any new email. + BlocklistTypeMailboxFull = BlocklistType("mailbox_full") + // The recipient's mailbox does not exist. + BlocklistTypeMailboxNotFound = BlocklistType("mailbox_not_found") +) + +func (enum BlocklistType) String() string { + if enum == "" { + // return default value if empty + return "unknown_type" + } + return string(enum) +} + +func (enum BlocklistType) Values() []BlocklistType { + return []BlocklistType{ + "unknown_type", + "mailbox_full", + "mailbox_not_found", + } +} + +func (enum BlocklistType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *BlocklistType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = BlocklistType(BlocklistType(tmp).String()) + return nil +} + type DomainLastStatusAutoconfigStateReason string const ( @@ -384,6 +426,51 @@ func (enum *EmailStatus) UnmarshalJSON(data []byte) error { return nil } +type ListBlocklistsRequestOrderBy string + +const ( + // Order by creation date (descending chronological order). + ListBlocklistsRequestOrderByCreatedAtDesc = ListBlocklistsRequestOrderBy("created_at_desc") + // Order by creation date (ascending chronological order). + ListBlocklistsRequestOrderByCreatedAtAsc = ListBlocklistsRequestOrderBy("created_at_asc") + // Order by blocklist ends date (descending chronological order). + ListBlocklistsRequestOrderByEndsAtDesc = ListBlocklistsRequestOrderBy("ends_at_desc") + // Order by blocklist ends date (ascending chronological order). + ListBlocklistsRequestOrderByEndsAtAsc = ListBlocklistsRequestOrderBy("ends_at_asc") +) + +func (enum ListBlocklistsRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "created_at_desc" + } + return string(enum) +} + +func (enum ListBlocklistsRequestOrderBy) Values() []ListBlocklistsRequestOrderBy { + return []ListBlocklistsRequestOrderBy{ + "created_at_desc", + "created_at_asc", + "ends_at_desc", + "ends_at_asc", + } +} + +func (enum ListBlocklistsRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListBlocklistsRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListBlocklistsRequestOrderBy(ListBlocklistsRequestOrderBy(tmp).String()) + return nil +} + type ListEmailsRequestOrderBy string const ( @@ -737,6 +824,37 @@ type DomainStatistics struct { CanceledCount uint32 `json:"canceled_count"` } +// Blocklist: blocklist. +type Blocklist struct { + // ID: ID of the blocklist. + ID string `json:"id"` + + // DomainID: domain ID linked to the blocklist. + DomainID string `json:"domain_id"` + + // CreatedAt: date and time of the blocklist creation. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: date and time of the blocklist's last update. + UpdatedAt *time.Time `json:"updated_at"` + + // EndsAt: date and time when the blocklist ends. Empty if the blocklist has no end. + EndsAt *time.Time `json:"ends_at"` + + // Email: email blocked by the blocklist. + Email string `json:"email"` + + // Type: type of block for this email. + // Default value: unknown_type + Type BlocklistType `json:"type"` + + // Reason: reason to block this email. + Reason string `json:"reason"` + + // Custom: true if this blocklist was created manually. False for an automatic Transactional Email blocklist. + Custom bool `json:"custom"` +} + // CreateEmailRequestAddress: create email request address. type CreateEmailRequestAddress struct { // Email: email address. @@ -1024,6 +1142,31 @@ type UpdateProjectSettingsRequestUpdatePeriodicReport struct { SendingDay *uint32 `json:"sending_day"` } +// BulkCreateBlocklistsRequest: bulk create blocklists request. +type BulkCreateBlocklistsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // DomainID: domain ID linked to the blocklist. + DomainID string `json:"domain_id"` + + // Emails: email blocked by the blocklist. + Emails []string `json:"emails"` + + // Type: type of blocklist. + // Default value: unknown_type + Type BlocklistType `json:"type"` + + // Reason: reason to block the email. + Reason *string `json:"reason,omitempty"` +} + +// BulkCreateBlocklistsResponse: bulk create blocklists response. +type BulkCreateBlocklistsResponse struct { + // Blocklists: list of blocklist created. + Blocklists []*Blocklist `json:"blocklists"` +} + // CancelEmailRequest: cancel email request. type CancelEmailRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1126,6 +1269,15 @@ type CreateWebhookRequest struct { SnsArn string `json:"sns_arn"` } +// DeleteBlocklistRequest: delete blocklist request. +type DeleteBlocklistRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // BlocklistID: ID of the blocklist to delete. + BlocklistID string `json:"-"` +} + // DeleteWebhookRequest: delete webhook request. type DeleteWebhookRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1222,6 +1374,63 @@ type GetWebhookRequest struct { WebhookID string `json:"-"` } +// ListBlocklistsRequest: list blocklists request. +type ListBlocklistsRequest struct { + // Region: region to target. If none is passed will use default region from the config. + Region scw.Region `json:"-"` + + // OrderBy: (Optional) List blocklist corresponding to specific criteria. + // Default value: created_at_desc + OrderBy ListBlocklistsRequestOrderBy `json:"-"` + + // Page: (Optional) Requested page number. Value must be greater or equal to 1. + Page *int32 `json:"-"` + + // PageSize: (Optional) Requested page size. Value must be between 1 and 100. + PageSize *uint32 `json:"-"` + + // DomainID: (Optional) Filter by a domain ID. + DomainID string `json:"-"` + + // Email: (Optional) Filter by an email address. + Email *string `json:"-"` + + // Type: (Optional) Filter by a blocklist type. + // Default value: unknown_type + Type *BlocklistType `json:"-"` + + // Custom: (Optional) Filter by custom blocklist (true) or automatic Transactional Email blocklist (false). + Custom *bool `json:"-"` +} + +// ListBlocklistsResponse: list blocklists response. +type ListBlocklistsResponse struct { + // TotalCount: number of blocklists matching the requested criteria. + TotalCount uint64 `json:"total_count"` + + // Blocklists: single page of blocklists matching the requested criteria. + Blocklists []*Blocklist `json:"blocklists"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListBlocklistsResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListBlocklistsResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListBlocklistsResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.Blocklists = append(r.Blocklists, results.Blocklists...) + r.TotalCount += uint64(len(results.Blocklists)) + return uint64(len(results.Blocklists)), nil +} + // ListDomainsRequest: list domains request. type ListDomainsRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -2298,3 +2507,106 @@ func (s *API) UpdateProjectSettings(req *UpdateProjectSettingsRequest, opts ...s } return &resp, nil } + +// ListBlocklists: Retrieve the list of blocklists. +func (s *API) ListBlocklists(req *ListBlocklistsRequest, opts ...scw.RequestOption) (*ListBlocklistsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + query := url.Values{} + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "domain_id", req.DomainID) + parameter.AddToQuery(query, "email", req.Email) + parameter.AddToQuery(query, "type", req.Type) + parameter.AddToQuery(query, "custom", req.Custom) + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/transactional-email/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/blocklists", + Query: query, + } + + var resp ListBlocklistsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// BulkCreateBlocklists: Create multiple blocklists in a specific Project or Organization using the `region` parameter. +func (s *API) BulkCreateBlocklists(req *BulkCreateBlocklistsRequest, opts ...scw.RequestOption) (*BulkCreateBlocklistsResponse, error) { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return nil, errors.New("field Region cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/transactional-email/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/blocklists", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp BulkCreateBlocklistsResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteBlocklist: You must specify the blocklist you want to delete by the `region` and `blocklist_id`. +func (s *API) DeleteBlocklist(req *DeleteBlocklistRequest, opts ...scw.RequestOption) error { + var err error + + if req.Region == "" { + defaultRegion, _ := s.client.GetDefaultRegion() + req.Region = defaultRegion + } + + if fmt.Sprint(req.Region) == "" { + return errors.New("field Region cannot be empty in request") + } + + if fmt.Sprint(req.BlocklistID) == "" { + return errors.New("field BlocklistID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/transactional-email/v1alpha1/regions/" + fmt.Sprint(req.Region) + "/blocklists/" + fmt.Sprint(req.BlocklistID) + "", + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} From adcf20ac0a4e03410416ee197a5723f331eb718c Mon Sep 17 00:00:00 2001 From: "Jonathan R." Date: Wed, 15 Jan 2025 11:15:41 +0100 Subject: [PATCH 146/163] feat: add waiters for snapshots (#2386) --- api/rdb/v1/rdb_utils.go | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/api/rdb/v1/rdb_utils.go b/api/rdb/v1/rdb_utils.go index 77c08c8f2..13092c8bd 100644 --- a/api/rdb/v1/rdb_utils.go +++ b/api/rdb/v1/rdb_utils.go @@ -222,3 +222,49 @@ func (s *API) FetchLatestEngineVersion(engineName string) (*EngineVersion, error } return latestEngineVersion, nil } + +// WaitForSnapshotRequest is used by WaitForSnapshot method. +type WaitForSnapshotRequest struct { + SnapshotID string + Region scw.Region + Timeout *time.Duration + RetryInterval *time.Duration +} + +func (s *API) WaitForSnapshot(req *WaitForSnapshotRequest, opts ...scw.RequestOption) (*Snapshot, error) { + timeout := defaultTimeout + if req.Timeout != nil { + timeout = *req.Timeout + } + retryInterval := defaultRetryInterval + if req.RetryInterval != nil { + retryInterval = *req.RetryInterval + } + + terminalStatus := map[SnapshotStatus]struct{}{ + SnapshotStatusReady: {}, + SnapshotStatusError: {}, + SnapshotStatusLocked: {}, + } + + snapshot, err := async.WaitSync(&async.WaitSyncConfig{ + Get: func() (interface{}, bool, error) { + res, err := s.GetSnapshot(&GetSnapshotRequest{ + SnapshotID: req.SnapshotID, + Region: req.Region, + }, opts...) + if err != nil { + return nil, false, err + } + _, isTerminal := terminalStatus[res.Status] + + return res, isTerminal, nil + }, + Timeout: timeout, + IntervalStrategy: async.LinearIntervalStrategy(retryInterval), + }) + if err != nil { + return nil, errors.Wrap(err, "waiting for snapshot failed") + } + return snapshot.(*Snapshot), nil +} From 07825390847cb10615250d9b8e745ebc0d0644d2 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Wed, 15 Jan 2025 15:24:35 +0100 Subject: [PATCH 147/163] feat(tem): add blocklisted flag (#2385) Co-authored-by: Jonathan R. --- api/tem/v1alpha1/tem_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/tem/v1alpha1/tem_sdk.go b/api/tem/v1alpha1/tem_sdk.go index f04b34cec..a80561354 100644 --- a/api/tem/v1alpha1/tem_sdk.go +++ b/api/tem/v1alpha1/tem_sdk.go @@ -292,6 +292,8 @@ const ( EmailFlagGreylisted = EmailFlag("greylisted") // Refers to an email with a `send-before` tag to indicate the maximum time limit for the email to be sent. EmailFlagSendBeforeExpiration = EmailFlag("send_before_expiration") + // Refers to an email blocked by a blocklist. + EmailFlagBlocklisted = EmailFlag("blocklisted") ) func (enum EmailFlag) String() string { @@ -312,6 +314,7 @@ func (enum EmailFlag) Values() []EmailFlag { "mailbox_not_found", "greylisted", "send_before_expiration", + "blocklisted", } } From 3e3531ab21631a50be80dfd3b44c7a5872fe24db Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 17 Jan 2025 10:35:30 +0100 Subject: [PATCH 148/163] feat(tem): enable cli for blocklist (#2387) From feaab91e68d6d8c950dd483c4c800e9ab6c5b4cf Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 17 Jan 2025 10:38:37 +0100 Subject: [PATCH 149/163] feat(iam): remove send_email in UpdateUserPassword (#2388) --- api/iam/v1alpha1/iam_sdk.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 0aace9398..4fdd03221 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -2319,9 +2319,6 @@ type UpdateUserPasswordRequest struct { // Password: the new password. Password string `json:"password"` - - // SendEmail: whether or not to send an email alerting the user their password has changed. - SendEmail bool `json:"send_email"` } // UpdateUserRequest: update user request. From 0b7cd141a6d9d00e0b7769a1dd4cde276436eadb Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 17 Jan 2025 10:39:03 +0100 Subject: [PATCH 150/163] feat(serverless_jobs): add state filter to list job runs (#2389) --- api/jobs/v1alpha1/jobs_sdk.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/jobs/v1alpha1/jobs_sdk.go b/api/jobs/v1alpha1/jobs_sdk.go index 560e0c4ff..4ab12cc78 100644 --- a/api/jobs/v1alpha1/jobs_sdk.go +++ b/api/jobs/v1alpha1/jobs_sdk.go @@ -522,6 +522,9 @@ type ListJobRunsRequest struct { ProjectID *string `json:"-"` OrganizationID *string `json:"-"` + + // State: default value: unknown_state + State JobRunState `json:"-"` } // ListJobRunsResponse: list job runs response. @@ -1145,6 +1148,7 @@ func (s *API) ListJobRuns(req *ListJobRunsRequest, opts ...scw.RequestOption) (* parameter.AddToQuery(query, "job_definition_id", req.JobDefinitionID) parameter.AddToQuery(query, "project_id", req.ProjectID) parameter.AddToQuery(query, "organization_id", req.OrganizationID) + parameter.AddToQuery(query, "state", req.State) if fmt.Sprint(req.Region) == "" { return nil, errors.New("field Region cannot be empty in request") From e9870c4185a3c3c1c562ba781bcb2daf74969481 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 17 Jan 2025 10:39:39 +0100 Subject: [PATCH 151/163] feat(account): add support for ContractAPI (#2390) --- api/account/v3/account_sdk.go | 400 ++++++++++++++++++++++++++++++++++ 1 file changed, 400 insertions(+) diff --git a/api/account/v3/account_sdk.go b/api/account/v3/account_sdk.go index 1437da3a7..b5c7c9d7e 100644 --- a/api/account/v3/account_sdk.go +++ b/api/account/v3/account_sdk.go @@ -14,6 +14,7 @@ import ( "strings" "time" + std "github.com/scaleway/scaleway-sdk-go/api/std" "github.com/scaleway/scaleway-sdk-go/errors" "github.com/scaleway/scaleway-sdk-go/marshaler" "github.com/scaleway/scaleway-sdk-go/namegenerator" @@ -39,6 +40,108 @@ var ( _ = namegenerator.GetRandomName ) +type ContractType string + +const ( + // Unknown type. + ContractTypeUnknownType = ContractType("unknown_type") + // A global contract. + ContractTypeGlobal = ContractType("global") + // Deprecated. A contract specific to the Kubernetes product. + ContractTypeK8s = ContractType("k8s") + // A contract specific to the Instance product. + ContractTypeInstance = ContractType("instance") + // A contract specific to Container products. + ContractTypeContainer = ContractType("container") + // A contract specific to Baremetal products. + ContractTypeBaremetal = ContractType("baremetal") +) + +func (enum ContractType) String() string { + if enum == "" { + // return default value if empty + return "unknown_type" + } + return string(enum) +} + +func (enum ContractType) Values() []ContractType { + return []ContractType{ + "unknown_type", + "global", + "k8s", + "instance", + "container", + "baremetal", + } +} + +func (enum ContractType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ContractType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ContractType(ContractType(tmp).String()) + return nil +} + +type ListContractSignaturesRequestOrderBy string + +const ( + // Signing date ascending. + ListContractSignaturesRequestOrderBySignedAtAsc = ListContractSignaturesRequestOrderBy("signed_at_asc") + // Signing date descending. + ListContractSignaturesRequestOrderBySignedAtDesc = ListContractSignaturesRequestOrderBy("signed_at_desc") + // Expiration date ascending. + ListContractSignaturesRequestOrderByExpiresAtAsc = ListContractSignaturesRequestOrderBy("expires_at_asc") + // Expiration date descending. + ListContractSignaturesRequestOrderByExpiresAtDesc = ListContractSignaturesRequestOrderBy("expires_at_desc") + // Name ascending. + ListContractSignaturesRequestOrderByNameAsc = ListContractSignaturesRequestOrderBy("name_asc") + // Name descending. + ListContractSignaturesRequestOrderByNameDesc = ListContractSignaturesRequestOrderBy("name_desc") +) + +func (enum ListContractSignaturesRequestOrderBy) String() string { + if enum == "" { + // return default value if empty + return "signed_at_asc" + } + return string(enum) +} + +func (enum ListContractSignaturesRequestOrderBy) Values() []ListContractSignaturesRequestOrderBy { + return []ListContractSignaturesRequestOrderBy{ + "signed_at_asc", + "signed_at_desc", + "expires_at_asc", + "expires_at_desc", + "name_asc", + "name_desc", + } +} + +func (enum ListContractSignaturesRequestOrderBy) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *ListContractSignaturesRequestOrderBy) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = ListContractSignaturesRequestOrderBy(ListContractSignaturesRequestOrderBy(tmp).String()) + return nil +} + type ListProjectsRequestOrderBy string const ( @@ -84,6 +187,49 @@ func (enum *ListProjectsRequestOrderBy) UnmarshalJSON(data []byte) error { return nil } +// Contract: contract. +type Contract struct { + // ID: ID of the contract. + ID string `json:"id"` + + // Type: the type of the contract. + // Default value: unknown_type + Type ContractType `json:"type"` + + // Name: the name of the contract. + Name string `json:"name"` + + // Version: the version of the contract. + Version uint32 `json:"version"` + + // CreatedAt: the creation date of the contract. + CreatedAt *time.Time `json:"created_at"` + + // UpdatedAt: the last modification date of the contract. + UpdatedAt *time.Time `json:"updated_at"` +} + +// ContractSignature: contract signature. +type ContractSignature struct { + // ID: ID of the contract signature. + ID string `json:"id"` + + // OrganizationID: the Organization ID which signed the contract. + OrganizationID string `json:"organization_id"` + + // CreatedAt: the creation date of the contract signature. + CreatedAt *time.Time `json:"created_at"` + + // SignedAt: the signing date of the contract signature. + SignedAt *time.Time `json:"signed_at"` + + // ExpiresAt: the expiration date of the contract signature. + ExpiresAt *time.Time `json:"expires_at"` + + // Contract: the contract signed. + Contract *Contract `json:"contract"` +} + // Project: project. type Project struct { // ID: ID of the Project. @@ -105,6 +251,104 @@ type Project struct { Description string `json:"description"` } +// CheckContractSignatureResponse: check contract signature response. +type CheckContractSignatureResponse struct { + // Created: whether a signature has been requested for this contract. + Created bool `json:"created"` + + // Validated: whether the signature for this contract has been validated. + Validated bool `json:"validated"` +} + +// ContractAPICheckContractSignatureRequest: contract api check contract signature request. +type ContractAPICheckContractSignatureRequest struct { + // OrganizationID: ID of the Organization to check the contract signature for. + OrganizationID string `json:"organization_id"` + + // ContractType: filter on contract type. + // Default value: unknown_type + ContractType ContractType `json:"contract_type"` + + // ContractName: filter on contract name. + ContractName string `json:"contract_name"` +} + +// ContractAPICreateContractSignatureRequest: contract api create contract signature request. +type ContractAPICreateContractSignatureRequest struct { + // ContractType: the type of the contract. + // Default value: unknown_type + ContractType ContractType `json:"contract_type"` + + // ContractName: the name of the contract. + ContractName string `json:"contract_name"` + + // Validated: whether the contract is validated at creation. + Validated bool `json:"validated"` + + // OrganizationID: ID of the Organization. + OrganizationID string `json:"organization_id"` +} + +// ContractAPIDownloadContractSignatureRequest: contract api download contract signature request. +type ContractAPIDownloadContractSignatureRequest struct { + // ContractSignatureID: the contract signature ID. + ContractSignatureID string `json:"-"` + + // Locale: the locale requested for the content of the contract. + // Default value: unknown_language_code + Locale std.LanguageCode `json:"-"` +} + +// ContractAPIListContractSignaturesRequest: contract api list contract signatures request. +type ContractAPIListContractSignaturesRequest struct { + // Page: the page number for the returned contracts. + Page *int32 `json:"-"` + + // PageSize: the maximum number of contracts per page. + PageSize *uint32 `json:"-"` + + // OrderBy: how the contracts are ordered in the response. + // Default value: signed_at_asc + OrderBy ListContractSignaturesRequestOrderBy `json:"-"` + + // OrganizationID: filter on Organization ID. + OrganizationID string `json:"-"` +} + +// ContractAPIValidateContractSignatureRequest: contract api validate contract signature request. +type ContractAPIValidateContractSignatureRequest struct { + // ContractSignatureID: the contract linked to your Organization you want to sign. + ContractSignatureID string `json:"-"` +} + +// ListContractSignaturesResponse: list contract signatures response. +type ListContractSignaturesResponse struct { + // TotalCount: the total number of contract signatures. + TotalCount uint64 `json:"total_count"` + + // ContractSignatures: the paginated returned contract signatures. + ContractSignatures []*ContractSignature `json:"contract_signatures"` +} + +// UnsafeGetTotalCount should not be used +// Internal usage only +func (r *ListContractSignaturesResponse) UnsafeGetTotalCount() uint64 { + return r.TotalCount +} + +// UnsafeAppend should not be used +// Internal usage only +func (r *ListContractSignaturesResponse) UnsafeAppend(res interface{}) (uint64, error) { + results, ok := res.(*ListContractSignaturesResponse) + if !ok { + return 0, errors.New("%T type cannot be appended to type %T", res, r) + } + + r.ContractSignatures = append(r.ContractSignatures, results.ContractSignatures...) + r.TotalCount += uint64(len(results.ContractSignatures)) + return uint64(len(results.ContractSignatures)), nil +} + // ListProjectsResponse: list projects response. type ListProjectsResponse struct { // TotalCount: total number of Projects. @@ -191,6 +435,162 @@ type ProjectAPIUpdateProjectRequest struct { Description *string `json:"description,omitempty"` } +// The Contract API allows you to manage contracts. +type ContractAPI struct { + client *scw.Client +} + +// NewContractAPI returns a ContractAPI object from a Scaleway client. +func NewContractAPI(client *scw.Client) *ContractAPI { + return &ContractAPI{ + client: client, + } +} + +// DownloadContractSignature: Download a contract content. +func (s *ContractAPI) DownloadContractSignature(req *ContractAPIDownloadContractSignatureRequest, opts ...scw.RequestOption) (*scw.File, error) { + var err error + + query := url.Values{} + parameter.AddToQuery(query, "locale", req.Locale) + + if fmt.Sprint(req.ContractSignatureID) == "" { + return nil, errors.New("field ContractSignatureID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/account/v3/contract-signatures/" + fmt.Sprint(req.ContractSignatureID) + "/download", + Query: query, + } + + var resp scw.File + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CreateContractSignature: Create a signature for your Organization for the latest version of the requested contract. +func (s *ContractAPI) CreateContractSignature(req *ContractAPICreateContractSignatureRequest, opts ...scw.RequestOption) (*ContractSignature, error) { + var err error + + if req.OrganizationID == "" { + defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() + req.OrganizationID = defaultOrganizationID + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/account/v3/contract-signatures", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp ContractSignature + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ValidateContractSignature: Sign a contract for your Organization. +func (s *ContractAPI) ValidateContractSignature(req *ContractAPIValidateContractSignatureRequest, opts ...scw.RequestOption) (*ContractSignature, error) { + var err error + + if fmt.Sprint(req.ContractSignatureID) == "" { + return nil, errors.New("field ContractSignatureID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/account/v3/contract-signatures/" + fmt.Sprint(req.ContractSignatureID) + "/validate", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp ContractSignature + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// CheckContractSignature: Check if a contract is signed for your Organization. +func (s *ContractAPI) CheckContractSignature(req *ContractAPICheckContractSignatureRequest, opts ...scw.RequestOption) (*CheckContractSignatureResponse, error) { + var err error + + if req.OrganizationID == "" { + defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() + req.OrganizationID = defaultOrganizationID + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/account/v3/contract-signatures/check", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp CheckContractSignatureResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ListContractSignatures: List contract signatures for an Organization. +func (s *ContractAPI) ListContractSignatures(req *ContractAPIListContractSignaturesRequest, opts ...scw.RequestOption) (*ListContractSignaturesResponse, error) { + var err error + + defaultPageSize, exist := s.client.GetDefaultPageSize() + if (req.PageSize == nil || *req.PageSize == 0) && exist { + req.PageSize = &defaultPageSize + } + + if req.OrganizationID == "" { + defaultOrganizationID, _ := s.client.GetDefaultOrganizationID() + req.OrganizationID = defaultOrganizationID + } + + query := url.Values{} + parameter.AddToQuery(query, "page", req.Page) + parameter.AddToQuery(query, "page_size", req.PageSize) + parameter.AddToQuery(query, "order_by", req.OrderBy) + parameter.AddToQuery(query, "organization_id", req.OrganizationID) + + scwReq := &scw.ScalewayRequest{ + Method: "GET", + Path: "/account/v3/contract-signatures", + Query: query, + } + + var resp ListContractSignaturesResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + // This API allows you to manage your Scaleway Projects. type ProjectAPI struct { client *scw.Client From 3e93945ac1c7acb3701a38d987cf1a801bf5e646 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 17 Jan 2025 10:40:14 +0100 Subject: [PATCH 152/163] feat(iam): add MFA OTP support for IAM members (#2391) --- api/iam/v1alpha1/iam_sdk.go | 111 ++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index 4fdd03221..b4a8e2991 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -1406,6 +1406,12 @@ type CreateSSHKeyRequest struct { ProjectID string `json:"project_id"` } +// CreateUserMFAOTPRequest: create user mfaotp request. +type CreateUserMFAOTPRequest struct { + // UserID: user ID of the MFA OTP. + UserID string `json:"-"` +} + // CreateUserRequest: create user request. type CreateUserRequest struct { // OrganizationID: ID of the Organization. @@ -1458,6 +1464,12 @@ type DeleteSSHKeyRequest struct { SSHKeyID string `json:"-"` } +// DeleteUserMFAOTPRequest: delete user mfaotp request. +type DeleteUserMFAOTPRequest struct { + // UserID: user ID of the MFA OTP. + UserID string `json:"-"` +} + // DeleteUserRequest: delete user request. type DeleteUserRequest struct { // UserID: ID of the user to delete. @@ -2157,6 +2169,11 @@ type LockUserRequest struct { UserID string `json:"-"` } +// MFAOTP: mfaotp. +type MFAOTP struct { + Secret string `json:"secret"` +} + // OrganizationSecuritySettings: organization security settings. type OrganizationSecuritySettings struct { // EnforcePasswordRenewal: defines whether password renewal is enforced during first login. @@ -2342,6 +2359,21 @@ type UpdateUserUsernameRequest struct { Username string `json:"username"` } +// ValidateUserMFAOTPRequest: validate user mfaotp request. +type ValidateUserMFAOTPRequest struct { + // UserID: user ID of the MFA OTP. + UserID string `json:"-"` + + // OneTimePassword: a password generated using the OTP. + OneTimePassword string `json:"one_time_password"` +} + +// ValidateUserMFAOTPResponse: validate user mfaotp response. +type ValidateUserMFAOTPResponse struct { + // RecoveryCodes: list of recovery codes usable for this OTP method. + RecoveryCodes []string `json:"recovery_codes"` +} + // This API allows you to manage Identity and Access Management (IAM) across your Scaleway Organizations, Projects and resources. type API struct { client *scw.Client @@ -2672,6 +2704,85 @@ func (s *API) UpdateUserPassword(req *UpdateUserPasswordRequest, opts ...scw.Req return &resp, nil } +// CreateUserMFAOTP: Create a MFA OTP. Private Beta feature. +func (s *API) CreateUserMFAOTP(req *CreateUserMFAOTPRequest, opts ...scw.RequestOption) (*MFAOTP, error) { + var err error + + if fmt.Sprint(req.UserID) == "" { + return nil, errors.New("field UserID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/iam/v1alpha1/users/" + fmt.Sprint(req.UserID) + "/mfa-otp", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp MFAOTP + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// ValidateUserMFAOTP: Validate a MFA OTP. Private Beta feature. +func (s *API) ValidateUserMFAOTP(req *ValidateUserMFAOTPRequest, opts ...scw.RequestOption) (*ValidateUserMFAOTPResponse, error) { + var err error + + if fmt.Sprint(req.UserID) == "" { + return nil, errors.New("field UserID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "POST", + Path: "/iam/v1alpha1/users/" + fmt.Sprint(req.UserID) + "/validate-mfa-otp", + } + + err = scwReq.SetBody(req) + if err != nil { + return nil, err + } + + var resp ValidateUserMFAOTPResponse + + err = s.client.Do(scwReq, &resp, opts...) + if err != nil { + return nil, err + } + return &resp, nil +} + +// DeleteUserMFAOTP: Delete a MFA OTP. Private Beta feature. +func (s *API) DeleteUserMFAOTP(req *DeleteUserMFAOTPRequest, opts ...scw.RequestOption) error { + var err error + + if fmt.Sprint(req.UserID) == "" { + return errors.New("field UserID cannot be empty in request") + } + + scwReq := &scw.ScalewayRequest{ + Method: "DELETE", + Path: "/iam/v1alpha1/users/" + fmt.Sprint(req.UserID) + "/mfa-otp", + } + + err = scwReq.SetBody(req) + if err != nil { + return err + } + + err = s.client.Do(scwReq, nil, opts...) + if err != nil { + return err + } + return nil +} + // LockUser: Lock a member. A locked member cannot log in or use API keys until the locked status is removed. Private Beta feature. func (s *API) LockUser(req *LockUserRequest, opts ...scw.RequestOption) (*User, error) { var err error From e360c98f921d92c89674642ce5b4362611c6f70d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Fri, 17 Jan 2025 14:31:39 +0100 Subject: [PATCH 153/163] chore: enable cleaning of SSH keys (#2392) --- api/iam/v1alpha1/sweepers/sweepers.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/iam/v1alpha1/sweepers/sweepers.go b/api/iam/v1alpha1/sweepers/sweepers.go index b240e5df6..239abafbe 100644 --- a/api/iam/v1alpha1/sweepers/sweepers.go +++ b/api/iam/v1alpha1/sweepers/sweepers.go @@ -50,9 +50,6 @@ func SweepSSHKey(scwClient *scw.Client) error { } for _, sshKey := range listSSHKeys.SSHKeys { - if !testhelpers.IsTestResource(sshKey.Name) { - continue - } err := iamAPI.DeleteSSHKey(&iam.DeleteSSHKeyRequest{ SSHKeyID: sshKey.ID, }) From 7fbef62c31d14d68f3a8991e10142412373e27e1 Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Tue, 28 Jan 2025 14:53:21 +0100 Subject: [PATCH 154/163] feat(apple-silicon): add waiter private network (#2396) --- .../v1alpha1/apple_silicon_utils.go | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/api/applesilicon/v1alpha1/apple_silicon_utils.go b/api/applesilicon/v1alpha1/apple_silicon_utils.go index eac297b49..4c317dbea 100644 --- a/api/applesilicon/v1alpha1/apple_silicon_utils.go +++ b/api/applesilicon/v1alpha1/apple_silicon_utils.go @@ -75,3 +75,47 @@ func (s *API) WaitForPossibleDeletion(req *WaitForServerRequest, opts ...scw.Req time.Sleep(time.Until(timeToDelete)) return server, nil } + +func (s *PrivateNetworkAPI) WaitForServerPrivateNetworks(req *WaitForServerRequest, opts ...scw.RequestOption) (*[]ServerPrivateNetwork, error) { + timeout := defaultTimeout + if req.Timeout != nil { + timeout = *req.Timeout + } + retryInterval := defaultRetryInterval + if req.RetryInterval != nil { + retryInterval = *req.RetryInterval + } + + terminalStatus := map[ServerPrivateNetworkServerStatus]struct{}{ + ServerPrivateNetworkServerStatusAttached: {}, + ServerPrivateNetworkServerStatusError: {}, + ServerPrivateNetworkServerStatusUnknownStatus: {}, + ServerPrivateNetworkServerStatusLocked: {}, + } + + serverPrivateNetworks, err := async.WaitSync(&async.WaitSyncConfig{ + Get: func() (interface{}, bool, error) { + res, err := s.ListServerPrivateNetworks(&PrivateNetworkAPIListServerPrivateNetworksRequest{ + Zone: req.Zone, + ServerID: &req.ServerID, + }, opts...) + if err != nil { + return nil, false, err + } + for _, serverPrivateNetwork := range res.ServerPrivateNetworks { + _, isTerminal := terminalStatus[serverPrivateNetwork.Status] + if !isTerminal { + return res.ServerPrivateNetworks, isTerminal, err + } + } + return res.ServerPrivateNetworks, true, err + }, + Timeout: timeout, + IntervalStrategy: async.LinearIntervalStrategy(retryInterval), + }) + if err != nil { + return nil, errors.Wrap(err, "waiting for server private network failed") + } + + return serverPrivateNetworks.(*[]ServerPrivateNetwork), nil +} From 57427ee6cacce4c05470599e74e46386fccaaa2d Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 28 Jan 2025 14:53:46 +0100 Subject: [PATCH 155/163] feat(webhosting): add public dns raw data (#2393) --- api/webhosting/v1/webhosting_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/webhosting/v1/webhosting_sdk.go b/api/webhosting/v1/webhosting_sdk.go index a11596ac4..800e4f1d7 100644 --- a/api/webhosting/v1/webhosting_sdk.go +++ b/api/webhosting/v1/webhosting_sdk.go @@ -795,6 +795,9 @@ type DNSRecord struct { // Status: record status. // Default value: unknown_status Status DNSRecordStatus `json:"status"` + + // RawData: record representation as it appears in the zone file or DNS management system. + RawData string `json:"raw_data"` } // Nameserver: nameserver. From ad2f1fb6c4b94de731890079fbee0edc65c8aa57 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Tue, 28 Jan 2025 14:55:13 +0100 Subject: [PATCH 156/163] docs(instance): add deprecation notice for `PolicyRespected` in `PlacementGroup` (#2394) --- api/instance/v1/instance_sdk.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index aecc228e8..0f7a0798d 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -1367,7 +1367,8 @@ type PlacementGroup struct { // Default value: max_availability PolicyType PlacementGroupPolicyType `json:"policy_type"` - // PolicyRespected: returns true if the policy is respected, false otherwise. + // PolicyRespected: in the server endpoints the value is always false as it is deprecated. + // In the placement group endpoints the value is correct. PolicyRespected bool `json:"policy_respected"` // Zone: zone in which the placement group is located. From 04caf045248498184ad879542def7e6ac01ab6ed Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:48:26 +0100 Subject: [PATCH 157/163] fix(apple-silicon): return right type (#2400) --- api/applesilicon/v1alpha1/apple_silicon_utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/applesilicon/v1alpha1/apple_silicon_utils.go b/api/applesilicon/v1alpha1/apple_silicon_utils.go index 4c317dbea..32566b973 100644 --- a/api/applesilicon/v1alpha1/apple_silicon_utils.go +++ b/api/applesilicon/v1alpha1/apple_silicon_utils.go @@ -76,7 +76,7 @@ func (s *API) WaitForPossibleDeletion(req *WaitForServerRequest, opts ...scw.Req return server, nil } -func (s *PrivateNetworkAPI) WaitForServerPrivateNetworks(req *WaitForServerRequest, opts ...scw.RequestOption) (*[]ServerPrivateNetwork, error) { +func (s *PrivateNetworkAPI) WaitForServerPrivateNetworks(req *WaitForServerRequest, opts ...scw.RequestOption) ([]*ServerPrivateNetwork, error) { timeout := defaultTimeout if req.Timeout != nil { timeout = *req.Timeout @@ -117,5 +117,5 @@ func (s *PrivateNetworkAPI) WaitForServerPrivateNetworks(req *WaitForServerReque return nil, errors.Wrap(err, "waiting for server private network failed") } - return serverPrivateNetworks.(*[]ServerPrivateNetwork), nil + return serverPrivateNetworks.([]*ServerPrivateNetwork), nil } From 90f78932d875cdf325112a4fff5f8f6203d1326e Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 30 Jan 2025 09:18:24 +0100 Subject: [PATCH 158/163] feat(interlink): add disapproved reason to link (#2397) --- api/interlink/v1beta1/interlink_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/interlink/v1beta1/interlink_sdk.go b/api/interlink/v1beta1/interlink_sdk.go index 6be7eed0b..6c4331c84 100644 --- a/api/interlink/v1beta1/interlink_sdk.go +++ b/api/interlink/v1beta1/interlink_sdk.go @@ -353,6 +353,9 @@ type Link struct { // PairingKey: used to identify a link from a user or partner's point of view. PairingKey string `json:"pairing_key"` + // DisapprovedReason: reason given by partner to explain why they did not approve the request for a hosted link. + DisapprovedReason *string `json:"disapproved_reason"` + // Region: region of the link. Region scw.Region `json:"region"` } From 422331c4eeb78402df956b0b4ac5ed93d0a296bf Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 30 Jan 2025 09:19:23 +0100 Subject: [PATCH 159/163] feat(iam): add support for QuotumLimit and LocalityType (#2401) --- api/iam/v1alpha1/iam_sdk.go | 73 ++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/api/iam/v1alpha1/iam_sdk.go b/api/iam/v1alpha1/iam_sdk.go index b4a8e2991..544fa19bc 100644 --- a/api/iam/v1alpha1/iam_sdk.go +++ b/api/iam/v1alpha1/iam_sdk.go @@ -609,6 +609,45 @@ func (enum *ListUsersRequestOrderBy) UnmarshalJSON(data []byte) error { return nil } +type LocalityType string + +const ( + LocalityTypeGlobal = LocalityType("global") + LocalityTypeRegion = LocalityType("region") + LocalityTypeZone = LocalityType("zone") +) + +func (enum LocalityType) String() string { + if enum == "" { + // return default value if empty + return "global" + } + return string(enum) +} + +func (enum LocalityType) Values() []LocalityType { + return []LocalityType{ + "global", + "region", + "zone", + } +} + +func (enum LocalityType) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, enum)), nil +} + +func (enum *LocalityType) UnmarshalJSON(data []byte) error { + tmp := "" + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + *enum = LocalityType(LocalityType(tmp).String()) + return nil +} + type LogAction string const ( @@ -836,6 +875,29 @@ func (enum *UserType) UnmarshalJSON(data []byte) error { return nil } +// QuotumLimit: quotum limit. +type QuotumLimit struct { + // Global: whether or not the limit is applied globally. + // Precisely one of Global, Region, Zone must be set. + Global *bool `json:"global,omitempty"` + + // Region: the region on which the limit is applied. + // Precisely one of Global, Region, Zone must be set. + Region *scw.Region `json:"region,omitempty"` + + // Zone: the zone on which the limit is applied. + // Precisely one of Global, Region, Zone must be set. + Zone *scw.Zone `json:"zone,omitempty"` + + // Limit: maximum locality limit. + // Precisely one of Limit, Unlimited must be set. + Limit *uint64 `json:"limit,omitempty"` + + // Unlimited: whether or not the quota per locality is unlimited. + // Precisely one of Limit, Unlimited must be set. + Unlimited *bool `json:"unlimited,omitempty"` +} + // JWT: jwt. type JWT struct { // Jti: jWT ID. @@ -1144,11 +1206,11 @@ type Quotum struct { // Name: name of the quota. Name string `json:"name"` - // Limit: maximum limit of the quota. + // Deprecated: Limit: maximum limit of the quota. // Precisely one of Limit, Unlimited must be set. Limit *uint64 `json:"limit,omitempty"` - // Unlimited: defines whether or not the quota is unlimited. + // Deprecated: Unlimited: defines whether or not the quota is unlimited. // Precisely one of Limit, Unlimited must be set. Unlimited *bool `json:"unlimited,omitempty"` @@ -1160,6 +1222,13 @@ type Quotum struct { // Description: details about the quota. Description string `json:"description"` + + // LocalityType: whether this quotum is applied on at the zone level, region level, or globally. + // Default value: global + LocalityType LocalityType `json:"locality_type"` + + // Limits: limits per locality. + Limits []*QuotumLimit `json:"limits"` } // Rule: rule. From c1ea07c1f447b083a51bd82238cf2e1f06ced980 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 30 Jan 2025 12:07:18 +0100 Subject: [PATCH 160/163] chore(vpc): drop MigrateZonalPrivateNetworks (#2402) --- api/vpc/v2/vpc_sdk.go | 57 ------------------------------------------- 1 file changed, 57 deletions(-) diff --git a/api/vpc/v2/vpc_sdk.go b/api/vpc/v2/vpc_sdk.go index c72337f57..43cf256e5 100644 --- a/api/vpc/v2/vpc_sdk.go +++ b/api/vpc/v2/vpc_sdk.go @@ -766,23 +766,6 @@ func (r *ListVPCsResponse) UnsafeAppend(res interface{}) (uint32, error) { return uint32(len(results.Vpcs)), nil } -// MigrateZonalPrivateNetworksRequest: migrate zonal private networks request. -type MigrateZonalPrivateNetworksRequest struct { - // Region: region to target. If none is passed will use default region from the config. - Region scw.Region `json:"-"` - - // OrganizationID: organization ID to target. The specified zoned Private Networks within this Organization will be migrated to regional. - // Precisely one of OrganizationID, ProjectID must be set. - OrganizationID *string `json:"organization_id,omitempty"` - - // ProjectID: project to target. The specified zoned Private Networks within this Project will be migrated to regional. - // Precisely one of OrganizationID, ProjectID must be set. - ProjectID *string `json:"project_id,omitempty"` - - // PrivateNetworkIDs: iDs of the Private Networks to migrate. - PrivateNetworkIDs []string `json:"private_network_ids"` -} - // RoutesWithNexthopAPIListRoutesWithNexthopRequest: routes with nexthop api list routes with nexthop request. type RoutesWithNexthopAPIListRoutesWithNexthopRequest struct { // Region: region to target. If none is passed will use default region from the config. @@ -1270,46 +1253,6 @@ func (s *API) DeletePrivateNetwork(req *DeletePrivateNetworkRequest, opts ...scw return nil } -// MigrateZonalPrivateNetworks: Transform multiple existing zoned Private Networks (scoped to a single Availability Zone) into regional Private Networks, scoped to an entire region. You can transform one or many Private Networks (specified by their Private Network IDs) within a single Scaleway Organization or Project, with the same call. -func (s *API) MigrateZonalPrivateNetworks(req *MigrateZonalPrivateNetworksRequest, opts ...scw.RequestOption) error { - var err error - - if req.Region == "" { - defaultRegion, _ := s.client.GetDefaultRegion() - req.Region = defaultRegion - } - - defaultOrganizationID, exist := s.client.GetDefaultOrganizationID() - if exist && req.OrganizationID == nil && req.ProjectID == nil { - req.OrganizationID = &defaultOrganizationID - } - - defaultProjectID, exist := s.client.GetDefaultProjectID() - if exist && req.OrganizationID == nil && req.ProjectID == nil { - req.ProjectID = &defaultProjectID - } - - if fmt.Sprint(req.Region) == "" { - return errors.New("field Region cannot be empty in request") - } - - scwReq := &scw.ScalewayRequest{ - Method: "POST", - Path: "/vpc/v2/regions/" + fmt.Sprint(req.Region) + "/private-networks/migrate-zonal", - } - - err = scwReq.SetBody(req) - if err != nil { - return err - } - - err = s.client.Do(scwReq, nil, opts...) - if err != nil { - return err - } - return nil -} - // EnableDHCP: Enable DHCP managed on an existing Private Network. Note that you will not be able to deactivate it afterwards. func (s *API) EnableDHCP(req *EnableDHCPRequest, opts ...scw.RequestOption) (*PrivateNetwork, error) { var err error From abf9c301d700676be6e4d306f676c59a1a7faad6 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Thu, 30 Jan 2025 12:11:04 +0100 Subject: [PATCH 161/163] feat(secret): add support for DeletedAt in SecretVersion (#2404) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rémy Léone --- api/secret/v1beta1/secret_sdk.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/secret/v1beta1/secret_sdk.go b/api/secret/v1beta1/secret_sdk.go index bceb3d605..d1a03db74 100644 --- a/api/secret/v1beta1/secret_sdk.go +++ b/api/secret/v1beta1/secret_sdk.go @@ -422,6 +422,9 @@ type SecretVersion struct { // UpdatedAt: last update of the version. UpdatedAt *time.Time `json:"updated_at"` + // DeletedAt: date and time of the version's deletion. + DeletedAt *time.Time `json:"deleted_at"` + // Description: description of the version. Description *string `json:"description"` From c830312bcd3becc1dddd3b5fa5033bc86d06dcb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jules=20Cast=C3=A9ran?= Date: Fri, 31 Jan 2025 10:21:56 +0100 Subject: [PATCH 162/163] fix(scw): read body with unknown content-length (#2406) --- scw/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scw/client.go b/scw/client.go index a39db9b48..d2e010820 100644 --- a/scw/client.go +++ b/scw/client.go @@ -230,7 +230,7 @@ func (c *Client) do(req *ScalewayRequest, res interface{}) (sdkErr error) { return sdkErr } - if res != nil && httpResponse.ContentLength > 0 { + if res != nil && httpResponse.ContentLength != 0 { contentType := httpResponse.Header.Get("Content-Type") if strings.HasPrefix(contentType, "application/json") { From a51ebdefdc36f04e7cf2151d3a4ae7dd60365644 Mon Sep 17 00:00:00 2001 From: Scaleway Bot Date: Fri, 31 Jan 2025 10:22:39 +0100 Subject: [PATCH 163/163] chore(instance): remove nat from documentation (#2405) --- api/instance/v1/instance_sdk.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/api/instance/v1/instance_sdk.go b/api/instance/v1/instance_sdk.go index 0f7a0798d..64c6f70ee 100644 --- a/api/instance/v1/instance_sdk.go +++ b/api/instance/v1/instance_sdk.go @@ -207,7 +207,6 @@ type IPType string const ( IPTypeUnknownIptype = IPType("unknown_iptype") - IPTypeNat = IPType("nat") IPTypeRoutedIPv4 = IPType("routed_ipv4") IPTypeRoutedIPv6 = IPType("routed_ipv6") ) @@ -223,7 +222,6 @@ func (enum IPType) String() string { func (enum IPType) Values() []IPType { return []IPType{ "unknown_iptype", - "nat", "routed_ipv4", "routed_ipv6", } @@ -2136,7 +2134,7 @@ type CreateIPRequest struct { // Server: UUID of the Instance you want to attach the IP to. Server *string `json:"server,omitempty"` - // Type: IP type to reserve (either 'routed_ipv4' or 'routed_ipv6', use of 'nat' is deprecated). + // Type: IP type to reserve (either 'routed_ipv4' or 'routed_ipv6'). // Default value: unknown_iptype Type IPType `json:"type,omitempty"` } @@ -2837,7 +2835,7 @@ type ListIPsRequest struct { // Page: a positive integer to choose the page to return. Page *int32 `json:"-"` - // Type: filter on the IP Mobility IP type (whose value should be either 'routed_ipv4', 'routed_ipv6' or 'nat'). + // Type: filter on the IP Mobility IP type (whose value should be either 'routed_ipv4' or 'routed_ipv6'). Type *string `json:"-"` } @@ -3587,7 +3585,7 @@ type UpdateIPRequest struct { // Reverse: reverse domain name. Reverse *NullableStringValue `json:"reverse,omitempty"` - // Type: convert a 'nat' IP to a 'routed_ipv4'. + // Type: should have no effect. // Default value: unknown_iptype Type IPType `json:"type,omitempty"`