diff --git a/cmd/scw/testdata/test-all-usage-k8s-node-reboot-usage.stderr.golden b/cmd/scw/testdata/test-all-usage-k8s-node-reboot-usage.stderr.golden index 031e0c002f..256faedc90 100644 --- a/cmd/scw/testdata/test-all-usage-k8s-node-reboot-usage.stderr.golden +++ b/cmd/scw/testdata/test-all-usage-k8s-node-reboot-usage.stderr.golden @@ -9,6 +9,7 @@ ARGS: FLAGS: -h, --help help for reboot + -w, --wait wait until the node is ready GLOBAL FLAGS: -D, --debug Enable debug mode diff --git a/internal/namespaces/k8s/v1beta4/custom.go b/internal/namespaces/k8s/v1beta4/custom.go index 2905105e02..58b0a6fbc2 100644 --- a/internal/namespaces/k8s/v1beta4/custom.go +++ b/internal/namespaces/k8s/v1beta4/custom.go @@ -17,6 +17,7 @@ func GetCommands() *core.Commands { human.RegisterMarshalerFunc(k8s.ClusterStatus(0), human.BindAttributesMarshalFunc(clusterStatusAttributes)) human.RegisterMarshalerFunc(k8s.PoolStatus(0), human.BindAttributesMarshalFunc(poolStatusAttributes)) + human.RegisterMarshalerFunc(k8s.NodeStatus(0), human.BindAttributesMarshalFunc(nodeStatusAttributes)) cmds.MustFind("k8s", "cluster", "list-available-versions").Override(clusterAvailableVersionsListBuilder) cmds.MustFind("k8s", "cluster", "create").Override(clusterCreateBuilder) @@ -29,5 +30,7 @@ func GetCommands() *core.Commands { cmds.MustFind("k8s", "pool", "upgrade").Override(poolUpgradeBuilder) cmds.MustFind("k8s", "pool", "delete").Override(poolDeleteBuilder) + cmds.MustFind("k8s", "node", "reboot").Override(nodeRebootBuilder) + return cmds } diff --git a/internal/namespaces/k8s/v1beta4/custom_node.go b/internal/namespaces/k8s/v1beta4/custom_node.go new file mode 100644 index 0000000000..b14634d06c --- /dev/null +++ b/internal/namespaces/k8s/v1beta4/custom_node.go @@ -0,0 +1,53 @@ +package k8s + +import ( + "context" + "time" + + "github.com/fatih/color" + "github.com/scaleway/scaleway-cli/internal/core" + "github.com/scaleway/scaleway-cli/internal/human" + k8s "github.com/scaleway/scaleway-sdk-go/api/k8s/v1beta4" + "github.com/scaleway/scaleway-sdk-go/scw" +) + +const ( + nodeActionTimeout = 10 * time.Minute +) + +var ( + // nodeStatusAttributes allows to override the displayed status color + nodeStatusAttributes = human.Attributes{ + k8s.NodeStatusCreating: color.FgBlue, + k8s.NodeStatusRebooting: color.FgBlue, + k8s.NodeStatusReady: color.FgGreen, + k8s.NodeStatusNotready: color.FgYellow, + k8s.NodeStatusCreationError: color.FgRed, + k8s.NodeStatusLocked: color.FgRed, + k8s.NodeStatusWarning: color.FgHiYellow, + } +) + +const ( + nodeActionReboot = iota +) + +func nodeRebootBuilder(c *core.Command) *core.Command { + c.WaitFunc = waitForNodeFunc(nodeActionReboot) + return c +} + +func waitForNodeFunc(action int) core.WaitFunc { + return func(ctx context.Context, _, respI interface{}) (interface{}, error) { + node, err := k8s.NewAPI(core.ExtractClient(ctx)).WaitForNode(&k8s.WaitForNodeRequest{ + Region: respI.(*k8s.Node).Region, + NodeID: respI.(*k8s.Node).ID, + Timeout: scw.DurationPtr(nodeActionTimeout), + }) + switch action { + case nodeActionReboot: + return node, err + } + return nil, err + } +}