diff --git a/cmd/scw/testdata/test-all-usage-container-namespace-create-usage.golden b/cmd/scw/testdata/test-all-usage-container-namespace-create-usage.golden index 552b6d8c4c..a60dc0f441 100644 --- a/cmd/scw/testdata/test-all-usage-container-namespace-create-usage.golden +++ b/cmd/scw/testdata/test-all-usage-container-namespace-create-usage.golden @@ -16,6 +16,7 @@ ARGS: FLAGS: -h, --help help for create + -w, --wait wait until the namespace is ready GLOBAL FLAGS: -c, --config string The path to the config file diff --git a/cmd/scw/testdata/test-all-usage-container-namespace-delete-usage.golden b/cmd/scw/testdata/test-all-usage-container-namespace-delete-usage.golden index e1624612fc..9502429299 100644 --- a/cmd/scw/testdata/test-all-usage-container-namespace-delete-usage.golden +++ b/cmd/scw/testdata/test-all-usage-container-namespace-delete-usage.golden @@ -11,6 +11,7 @@ ARGS: FLAGS: -h, --help help for delete + -w, --wait wait until the namespace is ready GLOBAL FLAGS: -c, --config string The path to the config file diff --git a/internal/core/errors_cmp.go b/internal/core/errors_cmp.go new file mode 100644 index 0000000000..69d6ccff44 --- /dev/null +++ b/internal/core/errors_cmp.go @@ -0,0 +1,14 @@ +package core + +import ( + "errors" + "net/http" + + "github.com/scaleway/scaleway-sdk-go/scw" +) + +func IsNotFoundError(err error) bool { + notFoundError := &scw.ResourceNotFoundError{} + responseError := &scw.ResponseError{} + return errors.As(err, &responseError) && responseError.StatusCode == http.StatusNotFound || errors.As(err, ¬FoundError) +} diff --git a/internal/namespaces/container/v1beta1/custom.go b/internal/namespaces/container/v1beta1/custom.go index b420f01b37..1381772125 100644 --- a/internal/namespaces/container/v1beta1/custom.go +++ b/internal/namespaces/container/v1beta1/custom.go @@ -14,6 +14,8 @@ func GetCommands() *core.Commands { human.RegisterMarshalerFunc(container.CronStatus(""), human.EnumMarshalFunc(cronStatusMarshalSpecs)) cmds.MustFind("container", "container", "deploy").Override(containerContainerDeployBuilder) + cmds.MustFind("container", "namespace", "create").Override(containerNamespaceCreateBuilder) + cmds.MustFind("container", "namespace", "delete").Override(containerNamespaceDeleteBuilder) cmds.Add(containerDeployCommand()) diff --git a/internal/namespaces/container/v1beta1/custom_namespace.go b/internal/namespaces/container/v1beta1/custom_namespace.go index 0fecb6fe8f..4f2b3653d9 100644 --- a/internal/namespaces/container/v1beta1/custom_namespace.go +++ b/internal/namespaces/container/v1beta1/custom_namespace.go @@ -1,12 +1,19 @@ package container import ( + "context" + "time" + "github.com/fatih/color" + "github.com/scaleway/scaleway-cli/v2/internal/core" "github.com/scaleway/scaleway-cli/v2/internal/human" container "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1" + "github.com/scaleway/scaleway-sdk-go/scw" ) var ( + containerNamespaceActionTimeout = 5 * time.Minute + namespaceStatusMarshalSpecs = human.EnumMarshalSpecs{ container.NamespaceStatusCreating: &human.EnumMarshalSpec{Attribute: color.FgBlue}, container.NamespaceStatusDeleting: &human.EnumMarshalSpec{Attribute: color.FgBlue}, @@ -17,3 +24,46 @@ var ( container.NamespaceStatusUnknown: &human.EnumMarshalSpec{Attribute: color.Faint}, } ) + +func containerNamespaceCreateBuilder(c *core.Command) *core.Command { + c.WaitFunc = func(ctx context.Context, argsI, respI interface{}) (interface{}, error) { + res := respI.(*container.Namespace) + + client := core.ExtractClient(ctx) + api := container.NewAPI(client) + return api.WaitForNamespace(&container.WaitForNamespaceRequest{ + NamespaceID: res.ID, + Region: res.Region, + Timeout: scw.TimeDurationPtr(containerNamespaceActionTimeout), + RetryInterval: core.DefaultRetryInterval, + }) + } + + return c +} + +func containerNamespaceDeleteBuilder(c *core.Command) *core.Command { + c.WaitFunc = func(ctx context.Context, argsI, respI interface{}) (interface{}, error) { + req := argsI.(*container.DeleteNamespaceRequest) + + client := core.ExtractClient(ctx) + api := container.NewAPI(client) + _, err := api.WaitForNamespace(&container.WaitForNamespaceRequest{ + NamespaceID: req.NamespaceID, + Region: req.Region, + Timeout: scw.TimeDurationPtr(containerNamespaceActionTimeout), + RetryInterval: core.DefaultRetryInterval, + }) + if err != nil { + if core.IsNotFoundError(err) { + return nil, nil + } + + return nil, err + } + + return nil, nil + } + + return c +}