diff --git a/mtest/reboot_test.go b/mtest/reboot_test.go index 30488232e..d403b5328 100644 --- a/mtest/reboot_test.go +++ b/mtest/reboot_test.go @@ -406,6 +406,15 @@ func testRebootOperations() { Expect(re).Should(HaveLen(1)) Expect(re[0].Status).Should(Equal(cke.RebootStatusQueued)) Expect(re[0].DrainBackOffExpire).ShouldNot(Equal(time.Time{})) + Expect(re[0].DrainBackOffCount).Should(Not(BeZero())) + + By("Checking reset-backoff command resets drain backoff") + ckecliSafe("reboot-queue", "reset-backoff") + re, err = getRebootEntries() + Expect(err).ShouldNot(HaveOccurred()) + Expect(re).Should(HaveLen(1)) + Expect(re[0].DrainBackOffExpire).Should(Equal(time.Time{})) + Expect(re[0].DrainBackOffCount).Should(BeZero()) By("Waiting for reboot completion") waitRebootCompletion(cluster) diff --git a/pkg/ckecli/cmd/reboot_queue_backoff_reset.go b/pkg/ckecli/cmd/reboot_queue_backoff_reset.go new file mode 100644 index 000000000..46061c12a --- /dev/null +++ b/pkg/ckecli/cmd/reboot_queue_backoff_reset.go @@ -0,0 +1,44 @@ +package cmd + +import ( + "context" + "time" + + "github.com/cybozu-go/cke" + "github.com/cybozu-go/well" + "github.com/spf13/cobra" +) + +var rebootQueueBackoffResetCmd = &cobra.Command{ + Use: "reset-backoff", + Short: "reset backoff", + Long: `reset backoff`, + RunE: func(cmd *cobra.Command, args []string) error { + well.Go(func(ctx context.Context) error { + entries, err := storage.GetRebootsEntries(ctx) + if err != nil { + return err + } + + for _, entry := range entries { + entry.DrainBackOffCount = 0 + entry.DrainBackOffExpire = time.Time{} + err := storage.UpdateRebootsEntry(ctx, entry) + if err == cke.ErrNotFound { + // The entry has just finished + continue + } + if err != nil { + return err + } + } + return nil + }) + well.Stop() + return well.Wait() + }, +} + +func init() { + rebootQueueCmd.AddCommand(rebootQueueBackoffResetCmd) +}