Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0
with:
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
version: latest
version: v2.9.0
args: --timeout 10m

spelling:
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM golang:1.25-alpine3.21 AS builder
FROM golang:1.26-alpine3.23 AS builder

ENV BUILD_IN_DOCKER=true
ARG VERSION
Expand Down
3 changes: 1 addition & 2 deletions core/human/marshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -461,8 +461,7 @@ func computeMaxCols(grid [][]string) int {
func getDefaultFieldsOpt(t reflect.Type) []*MarshalFieldOpt {
results := []*MarshalFieldOpt(nil)
// Loop through all struct field
for fieldIdx := range t.NumField() {
field := t.Field(fieldIdx)
for field := range t.Fields() {
fieldType := field.Type

if field.Anonymous {
Expand Down
12 changes: 5 additions & 7 deletions core/reflect.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,21 @@ import (
// becomes struct{FieldName string `json:"field_name"`}
func newObjectWithForcedJSONTags(t reflect.Type) any {
structFieldsCopy := []reflect.StructField(nil)
for i := range t.NumField() {
fieldCopy := t.Field(i)
for fieldCopy := range t.Fields() {
if fieldCopy.Anonymous {
anonymousType := fieldCopy.Type
if anonymousType.Kind() == reflect.Ptr {
anonymousType = anonymousType.Elem()
}
for i := range anonymousType.NumField() {
fieldCopy := anonymousType.Field(i)
fieldCopy.Tag = reflect.StructTag(
for field := range anonymousType.Fields() {
field.Tag = reflect.StructTag(
`json:"` + strings.ReplaceAll(
strcase.ToBashArg(fieldCopy.Name),
strcase.ToBashArg(field.Name),
"-",
"_",
) + `"`,
)
structFieldsCopy = append(structFieldsCopy, fieldCopy)
structFieldsCopy = append(structFieldsCopy, field)
}
} else {
fieldCopy.Tag = reflect.StructTag(
Expand Down
2 changes: 1 addition & 1 deletion core/testing.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ func Test(config *TestConfig) func(t *testing.T) {
}

// We need to set up this variable to ensure that relative date parsing stay consistent
args.TestForceNow = scw.TimePtr(time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC))
args.TestForceNow = new(time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC))

// Because human marshal of date is relative (e.g 3 minutes ago) we must make sure it stay consistent for golden to works.
// Here we return a constant string. We may need to find a better place to put this.
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/scaleway/scaleway-cli/v2

go 1.25.5
go 1.26.0

require (
github.com/aws/aws-sdk-go-v2 v1.41.1
Expand Down
3 changes: 1 addition & 2 deletions internal/args/args.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,7 @@ func listArgTypeFields(base string, argType reflect.Type) []string {
case reflect.Struct:
fields := []string(nil)

for i := range argType.NumField() {
field := argType.Field(i)
for field := range argType.Fields() {
fieldBase := base

// If this is an embedded struct, skip adding its name to base
Expand Down
4 changes: 2 additions & 2 deletions internal/args/unmarshal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
)

func init() {
args.TestForceNow = scw.TimePtr(time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC))
args.TestForceNow = new(time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC))
}

func TestUnmarshalStruct(t *testing.T) {
Expand Down Expand Up @@ -205,7 +205,7 @@ func TestUnmarshalStruct(t *testing.T) {
},
expected: &Slice{
Strings: []string(nil),
SlicePtr: scw.StringsPtr([]string{}),
SlicePtr: new([]string{}),
StringsPtr: []*string(nil),
},
}))
Expand Down
2 changes: 1 addition & 1 deletion internal/editor/reflect_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func Test_valueMapperPointersWithPointers(t *testing.T) {
src := struct {
Arg1 *string
Arg2 *int32
}{scw.StringPtr("1"), scw.Int32Ptr(1)}
}{new("1"), scw.Int32Ptr(1)}
dest := struct {
Arg1 *string
Arg2 *int32
Expand Down
4 changes: 1 addition & 3 deletions internal/gofields/gofields.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,9 +178,7 @@ func listFields(t reflect.Type, parents []string, filter ListFieldFilter) []stri
return listFields(t.Elem(), append(parents, "<key>"), filter)
case reflect.Struct:
res := []string(nil)
for i := range t.NumField() {
field := t.Field(i)

for field := range t.Fields() {
if !isFieldPublic(field) {
continue
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func waitForServerFunc(action int) core.WaitFunc {
WaitForServer(&applesilicon.WaitForServerRequest{
Zone: respI.(*applesilicon.Server).Zone,
ServerID: respI.(*applesilicon.Server).ID,
Timeout: scw.TimeDurationPtr(serverActionTimeout),
Timeout: new(serverActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})

Expand Down
10 changes: 5 additions & 5 deletions internal/namespaces/baremetal/v1/custom_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func serverWaitCommand() *core.Command {
server, err := api.WaitForServer(&baremetal.WaitForServerRequest{
ServerID: args.ServerID,
Zone: args.Zone,
Timeout: scw.TimeDurationPtr(args.Timeout),
Timeout: new(args.Timeout),
RetryInterval: core.DefaultRetryInterval,
})
if err != nil {
Expand All @@ -79,7 +79,7 @@ func serverWaitCommand() *core.Command {
server, err = api.WaitForServerInstall(&baremetal.WaitForServerInstallRequest{
ServerID: args.ServerID,
Zone: args.Zone,
Timeout: scw.TimeDurationPtr(args.Timeout),
Timeout: new(args.Timeout),
RetryInterval: core.DefaultRetryInterval,
})
if err != nil {
Expand Down Expand Up @@ -125,7 +125,7 @@ func serverStartBuilder(c *core.Command) *core.Command {
return api.WaitForServer(&baremetal.WaitForServerRequest{
Zone: argsI.(*baremetal.StartServerRequest).Zone,
ServerID: respI.(*baremetal.Server).ID,
Timeout: scw.TimeDurationPtr(ServerActionTimeout),
Timeout: new(ServerActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand All @@ -141,7 +141,7 @@ func serverStopBuilder(c *core.Command) *core.Command {
return api.WaitForServer(&baremetal.WaitForServerRequest{
Zone: argsI.(*baremetal.StopServerRequest).Zone,
ServerID: respI.(*baremetal.Server).ID,
Timeout: scw.TimeDurationPtr(ServerActionTimeout),
Timeout: new(ServerActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand All @@ -159,7 +159,7 @@ func serverRebootBuilder(c *core.Command) *core.Command {
return api.WaitForServer(&baremetal.WaitForServerRequest{
Zone: argsI.(*baremetal.RebootServerRequest).Zone,
ServerID: respI.(*baremetal.Server).ID,
Timeout: scw.TimeDurationPtr(ServerActionTimeout),
Timeout: new(ServerActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/namespaces/baremetal/v1/custom_server_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ func serverCreateBuilder(c *core.Command) *core.Command {
return api.WaitForServer(&baremetal.WaitForServerRequest{
Zone: argsI.(*baremetalCreateServerRequestCustom).Zone,
ServerID: respI.(*baremetal.Server).ID,
Timeout: scw.TimeDurationPtr(ServerActionTimeout),
Timeout: new(ServerActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/namespaces/baremetal/v1/custom_server_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func serverDeleteBuilder(c *core.Command) *core.Command {
WaitForServer(&baremetal.WaitForServerRequest{
ServerID: argsI.(*baremetal.DeleteServerRequest).ServerID,
Zone: argsI.(*baremetal.DeleteServerRequest).Zone,
Timeout: scw.TimeDurationPtr(ServerActionTimeout),
Timeout: new(ServerActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func serverInstallBuilder(c *core.Command) *core.Command {
return api.WaitForServerInstall(&baremetal.WaitForServerInstallRequest{
Zone: argsI.(*baremetalInstallServerRequestCustom).Zone,
ServerID: respI.(*baremetal.Server).ID,
Timeout: scw.TimeDurationPtr(ServerActionTimeout),
Timeout: new(ServerActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand Down
2 changes: 1 addition & 1 deletion internal/namespaces/block/v1alpha1/custom_snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func snapshotWaitCommand() *core.Command {
WaitForSnapshot(&block.WaitForSnapshotRequest{
Zone: args.Zone,
SnapshotID: args.SnapshotID,
Timeout: scw.TimeDurationPtr(args.Timeout),
Timeout: new(args.Timeout),
RetryInterval: core.DefaultRetryInterval,

TerminalStatus: args.TerminalStatus,
Expand Down
2 changes: 1 addition & 1 deletion internal/namespaces/block/v1alpha1/custom_volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func volumeWaitCommand() *core.Command {
return block.NewAPI(core.ExtractClient(ctx)).WaitForVolume(&block.WaitForVolumeRequest{
Zone: args.Zone,
VolumeID: args.VolumeID,
Timeout: scw.TimeDurationPtr(args.Timeout),
Timeout: new(args.Timeout),
RetryInterval: core.DefaultRetryInterval,

TerminalStatus: args.TerminalStatus,
Expand Down
5 changes: 2 additions & 3 deletions internal/namespaces/config/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -887,13 +887,12 @@ func getProfileField(profile *scw.Profile, key string) (reflect.Value, error) {
func getProfileKeys() []string {
t := reflect.TypeOf(scw.Profile{})
keys := []string{}
for i := range t.NumField() {
field := t.Field(i)
for field := range t.Fields() {
switch field.Name {
case "APIURL":
keys = append(keys, "api-url")
default:
keys = append(keys, strcase.ToBashArg(t.Field(i).Name))
keys = append(keys, strcase.ToBashArg(field.Name))
}
}

Expand Down
80 changes: 40 additions & 40 deletions internal/namespaces/config/commands_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -417,35 +417,35 @@ func beforeFuncCreateConfigFile(c *scw.Config) core.BeforeFunc {
func beforeFuncCreateFullConfig() core.BeforeFunc {
return beforeFuncCreateConfigFile(&scw.Config{
Profile: scw.Profile{
AccessKey: scw.StringPtr("SCWXXXXXXXXXXXXXXXXX"),
SecretKey: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
APIURL: scw.StringPtr("https://mock-api-url.com"),
Insecure: scw.BoolPtr(true),
DefaultOrganizationID: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
DefaultRegion: scw.StringPtr("fr-par"),
DefaultZone: scw.StringPtr("fr-par-1"),
SendTelemetry: scw.BoolPtr(true),
AccessKey: new("SCWXXXXXXXXXXXXXXXXX"),
SecretKey: new("11111111-1111-1111-1111-111111111111"),
APIURL: new("https://mock-api-url.com"),
Insecure: new(true),
DefaultOrganizationID: new("11111111-1111-1111-1111-111111111111"),
DefaultRegion: new("fr-par"),
DefaultZone: new("fr-par-1"),
SendTelemetry: new(true),
},
Profiles: map[string]*scw.Profile{
"p1": {
AccessKey: scw.StringPtr("SCWP1XXXXXXXXXXXXXXX"),
SecretKey: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
APIURL: scw.StringPtr("https://p1-mock-api-url.com"),
Insecure: scw.BoolPtr(true),
DefaultOrganizationID: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
DefaultRegion: scw.StringPtr("fr-par"),
DefaultZone: scw.StringPtr("fr-par-1"),
SendTelemetry: scw.BoolPtr(true),
AccessKey: new("SCWP1XXXXXXXXXXXXXXX"),
SecretKey: new("11111111-1111-1111-1111-111111111111"),
APIURL: new("https://p1-mock-api-url.com"),
Insecure: new(true),
DefaultOrganizationID: new("11111111-1111-1111-1111-111111111111"),
DefaultRegion: new("fr-par"),
DefaultZone: new("fr-par-1"),
SendTelemetry: new(true),
},
"p2": {
AccessKey: scw.StringPtr("SCWP2XXXXXXXXXXXXXXX"),
SecretKey: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
APIURL: scw.StringPtr("https://p2-mock-api-url.com"),
Insecure: scw.BoolPtr(true),
DefaultOrganizationID: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
DefaultRegion: scw.StringPtr("fr-par"),
DefaultZone: scw.StringPtr("fr-par-1"),
SendTelemetry: scw.BoolPtr(true),
AccessKey: new("SCWP2XXXXXXXXXXXXXXX"),
SecretKey: new("11111111-1111-1111-1111-111111111111"),
APIURL: new("https://p2-mock-api-url.com"),
Insecure: new(true),
DefaultOrganizationID: new("11111111-1111-1111-1111-111111111111"),
DefaultRegion: new("fr-par"),
DefaultZone: new("fr-par-1"),
SendTelemetry: new(true),
},
},
})
Expand All @@ -454,25 +454,25 @@ func beforeFuncCreateFullConfig() core.BeforeFunc {
func beforeFuncCreateInvalidConfig() core.BeforeFunc {
return beforeFuncCreateConfigFile(&scw.Config{
Profile: scw.Profile{
AccessKey: scw.StringPtr("invalidAccessKey"),
SecretKey: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
APIURL: scw.StringPtr("https://mock-api-url.com"),
Insecure: scw.BoolPtr(true),
DefaultOrganizationID: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
DefaultRegion: scw.StringPtr("fr-par"),
DefaultZone: scw.StringPtr("fr-par-1"),
SendTelemetry: scw.BoolPtr(true),
AccessKey: new("invalidAccessKey"),
SecretKey: new("11111111-1111-1111-1111-111111111111"),
APIURL: new("https://mock-api-url.com"),
Insecure: new(true),
DefaultOrganizationID: new("11111111-1111-1111-1111-111111111111"),
DefaultRegion: new("fr-par"),
DefaultZone: new("fr-par-1"),
SendTelemetry: new(true),
},
Profiles: map[string]*scw.Profile{
"p1": {
AccessKey: scw.StringPtr("SCWP1XXXXXXXXXXXXXXX"),
SecretKey: scw.StringPtr("invalidSecretKey"),
APIURL: scw.StringPtr("https://p1-mock-api-url.com"),
Insecure: scw.BoolPtr(true),
DefaultOrganizationID: scw.StringPtr("11111111-1111-1111-1111-111111111111"),
DefaultRegion: scw.StringPtr("fr-par"),
DefaultZone: scw.StringPtr("fr-par-1"),
SendTelemetry: scw.BoolPtr(true),
AccessKey: new("SCWP1XXXXXXXXXXXXXXX"),
SecretKey: new("invalidSecretKey"),
APIURL: new("https://p1-mock-api-url.com"),
Insecure: new(true),
DefaultOrganizationID: new("11111111-1111-1111-1111-111111111111"),
DefaultRegion: new("fr-par"),
DefaultZone: new("fr-par-1"),
SendTelemetry: new(true),
},
},
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func waitForContainer(ctx context.Context, _, respI any) (any, error) {
return api.WaitForContainer(&container.WaitForContainerRequest{
ContainerID: c.ID,
Region: c.Region,
Timeout: scw.TimeDurationPtr(containerDeployTimeout),
Timeout: new(containerDeployTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand Down
4 changes: 2 additions & 2 deletions internal/namespaces/container/v1beta1/custom_deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -476,8 +476,8 @@ func DeployStepCreateContainer(
Region: data.Args.Region,
ContainerID: targetContainer.ID,
RegistryImage: &data.Tag,
Port: scw.Uint32Ptr(data.Args.Port),
Redeploy: scw.BoolPtr(false),
Port: new(data.Args.Port),
Redeploy: new(false),
}, scw.WithContext(t.Ctx))
if err != nil {
return nil, fmt.Errorf("could not update container: %w", err)
Expand Down
5 changes: 2 additions & 3 deletions internal/namespaces/container/v1beta1/custom_namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/scaleway/scaleway-cli/v2/core"
"github.com/scaleway/scaleway-cli/v2/core/human"
container "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1"
"github.com/scaleway/scaleway-sdk-go/scw"
)

var (
Expand All @@ -34,7 +33,7 @@ func waitForContainerNamespace(ctx context.Context, _, respI any) (any, error) {
return api.WaitForNamespace(&container.WaitForNamespaceRequest{
NamespaceID: ns.ID,
Region: ns.Region,
Timeout: scw.TimeDurationPtr(containerNamespaceActionTimeout),
Timeout: new(containerNamespaceActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand All @@ -60,7 +59,7 @@ func containerNamespaceDeleteBuilder(c *core.Command) *core.Command {
_, err := api.WaitForNamespace(&container.WaitForNamespaceRequest{
NamespaceID: req.NamespaceID,
Region: req.Region,
Timeout: scw.TimeDurationPtr(containerNamespaceActionTimeout),
Timeout: new(containerNamespaceActionTimeout),
RetryInterval: core.DefaultRetryInterval,
})
if err != nil {
Expand Down
3 changes: 1 addition & 2 deletions internal/namespaces/flexibleip/v1alpha1/custom_ip.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/scaleway/scaleway-cli/v2/core"
"github.com/scaleway/scaleway-cli/v2/core/human"
flexibleip "github.com/scaleway/scaleway-sdk-go/api/flexibleip/v1alpha1"
"github.com/scaleway/scaleway-sdk-go/scw"
)

var ipStatusMarshalSpecs = human.EnumMarshalSpecs{
Expand All @@ -33,7 +32,7 @@ func createIPBuilder(c *core.Command) *core.Command {
return api.WaitForFlexibleIP(&flexibleip.WaitForFlexibleIPRequest{
FipID: getResp.ID,
Zone: getResp.Zone,
Timeout: scw.TimeDurationPtr(FlexibleIPTimeout),
Timeout: new(FlexibleIPTimeout),
RetryInterval: core.DefaultRetryInterval,
})
}
Expand Down
Loading
Loading