Skip to content

Commit b98e59c

Browse files
committed
feat(reset): addressed review comments
Signed-off-by: rajaSahil <[email protected]>
1 parent 7c32a02 commit b98e59c

File tree

7 files changed

+83
-138
lines changed

7 files changed

+83
-138
lines changed

pkg/clientutil/service.go

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 The KubeOne Authors.
2+
Copyright 2025 The KubeOne Authors.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -20,9 +20,10 @@ import (
2020
"context"
2121
"time"
2222

23+
"github.com/sirupsen/logrus"
24+
2325
"k8c.io/kubeone/pkg/fail"
2426

25-
"github.com/sirupsen/logrus"
2627
corev1 "k8s.io/api/core/v1"
2728
"k8s.io/apimachinery/pkg/util/wait"
2829
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -31,17 +32,18 @@ import (
3132
func CleanupLBs(ctx context.Context, logger logrus.FieldLogger, c client.Client) error {
3233
serviceList := &corev1.ServiceList{}
3334
if err := c.List(ctx, serviceList); err != nil {
34-
return fail.KubeClient(err, "failed to list Service.")
35+
return fail.KubeClient(err, "listing services")
3536
}
3637

3738
for _, service := range serviceList.Items {
3839
// This service is already in deletion, nothing further needs to happen.
3940
if service.DeletionTimestamp != nil {
4041
continue
4142
}
43+
logger.Infof("Cleaning up LoadBalancer Services...")
4244
// Only LoadBalancer services incur charges on cloud providers
4345
if service.Spec.Type == corev1.ServiceTypeLoadBalancer {
44-
logger.Infof("Deleting SVC : %s/%s\n", service.Namespace, service.Name)
46+
logger.Debugf("Deleting LoadBalancer Service \"%s/%s\"", service.Namespace, service.Name)
4547
if err := DeleteIfExists(ctx, c, &service); err != nil {
4648
return err
4749
}
@@ -52,11 +54,13 @@ func CleanupLBs(ctx context.Context, logger logrus.FieldLogger, c client.Client)
5254
}
5355

5456
func WaitCleanupLbs(ctx context.Context, logger logrus.FieldLogger, c client.Client) error {
55-
logger.Infoln("Waiting for all load balancer services to get deleted...")
57+
logger.Infoln("Waiting for all LoadBalancer Services to get deleted...")
5658

5759
return wait.PollUntilContextTimeout(ctx, 5*time.Second, 5*time.Minute, false, func(ctx context.Context) (bool, error) {
5860
serviceList := &corev1.ServiceList{}
5961
if err := c.List(ctx, serviceList); err != nil {
62+
logger.Errorf("failed to list services, error: %v", err.Error())
63+
6064
return false, nil
6165
}
6266
for _, service := range serviceList.Items {

pkg/clientutil/volumes.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 The KubeOne Authors.
2+
Copyright 2025 The KubeOne Authors.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -21,10 +21,11 @@ import (
2121
"fmt"
2222
"time"
2323

24+
"github.com/sirupsen/logrus"
25+
2426
"k8c.io/kubeone/pkg/fail"
2527
"k8c.io/reconciler/pkg/reconciling"
2628

27-
"github.com/sirupsen/logrus"
2829
corev1 "k8s.io/api/core/v1"
2930
"k8s.io/apimachinery/pkg/util/wait"
3031
"sigs.k8s.io/controller-runtime/pkg/client"

pkg/clientutil/webhook.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2020 The KubeOne Authors.
2+
Copyright 2025 The KubeOne Authors.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.

pkg/cmd/reset.go

+31-70
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,23 @@ package cmd
1919
import (
2020
"fmt"
2121

22-
"k8c.io/kubeone/pkg/clientutil"
23-
"k8c.io/kubeone/pkg/kubeconfig"
24-
"k8c.io/kubeone/pkg/state"
25-
"k8c.io/kubeone/pkg/tasks"
26-
clusterv1alpha1 "k8c.io/machine-controller/pkg/apis/cluster/v1alpha1"
27-
2822
"github.com/MakeNowJust/heredoc/v2"
2923
"github.com/spf13/cobra"
3024
"github.com/spf13/pflag"
3125

32-
corev1 "k8s.io/api/core/v1"
26+
"k8c.io/kubeone/pkg/kubeconfig"
27+
"k8c.io/kubeone/pkg/state"
28+
"k8c.io/kubeone/pkg/tasks"
29+
clusterv1alpha1 "k8c.io/machine-controller/pkg/apis/cluster/v1alpha1"
3330
)
3431

3532
type resetOpts struct {
3633
globalOptions
37-
AutoApprove bool `longflag:"auto-approve" shortflag:"y"`
38-
DestroyWorkers bool `longflag:"destroy-workers"`
39-
CleanupVolumes bool `longflag:"cleanup-volumes"`
40-
CleanupLoadBalancers bool `longflag:"cleanup-load-balancers"`
41-
RemoveBinaries bool `longflag:"remove-binaries"`
34+
AutoApprove bool `longflag:"auto-approve" shortflag:"y"`
35+
DestroyWorkers bool `longflag:"destroy-workers"`
36+
RemoveVolumes bool `longflag:"remove-volumes"`
37+
RemoveLBServices bool `longflag:"remove-lb-services"`
38+
RemoveBinaries bool `longflag:"remove-binaries"`
4239
}
4340

4441
func (opts *resetOpts) BuildState() (*state.State, error) {
@@ -48,8 +45,8 @@ func (opts *resetOpts) BuildState() (*state.State, error) {
4845
}
4946

5047
s.DestroyWorkers = opts.DestroyWorkers
51-
s.CleanupVolumes = opts.CleanupVolumes
52-
s.CleanupLoadBalancers = opts.CleanupLoadBalancers
48+
s.RemoveVolumes = opts.RemoveVolumes
49+
s.RemoveLBServices = opts.RemoveLBServices
5350
s.RemoveBinaries = opts.RemoveBinaries
5451

5552
return s, nil
@@ -101,16 +98,16 @@ func resetCmd(rootFlags *pflag.FlagSet) *cobra.Command {
10198
"remove kubernetes binaries after resetting the cluster")
10299

103100
cmd.Flags().BoolVar(
104-
&opts.CleanupVolumes,
105-
longFlagName(opts, "CleanupVolumes"),
101+
&opts.RemoveVolumes,
102+
longFlagName(opts, "RemoveVolumes"),
106103
true,
107-
"cleanup all dynamically provisioned and unretained volumes before resetting the cluster")
104+
"remove all dynamically provisioned and unretained volumes before resetting the cluster")
108105

109106
cmd.Flags().BoolVar(
110-
&opts.CleanupLoadBalancers,
111-
longFlagName(opts, "CleanupLoadBalancers"),
107+
&opts.RemoveLBServices,
108+
longFlagName(opts, "RemoveLBServices"),
112109
true,
113-
"cleanup all load balancers services before resetting the cluster")
110+
"remove all load balancers services before resetting the cluster")
114111

115112
return cmd
116113
}
@@ -122,15 +119,15 @@ func runReset(opts *resetOpts) error {
122119
return err
123120
}
124121

125-
if opts.DestroyWorkers || opts.CleanupVolumes || opts.CleanupLoadBalancers {
122+
if opts.DestroyWorkers || opts.RemoveVolumes || opts.RemoveLBServices {
126123
if cErr := kubeconfig.BuildKubernetesClientset(s); cErr != nil {
127124
s.Logger.Errorln("Failed to build the Kubernetes clientset.")
128-
if opts.CleanupLoadBalancers {
125+
if opts.RemoveLBServices {
129126
s.Logger.Warnln("Unable to list and delete load balancers in the cluster.")
130127
s.Logger.Warnln("You can skip this phase by using '--cleanup-load-balancer=false'.")
131128
s.Logger.Warnln("If there are load balancers in the cluster, you might have to delete them manually.")
132129
}
133-
if opts.CleanupVolumes {
130+
if opts.RemoveVolumes {
134131
s.Logger.Warnln("Unable to list and delete dynamically provisioned and unretained volumes in the cluster.")
135132
s.Logger.Warnln("You can skip this phase by using '--cleanup-volumes=false'.")
136133
s.Logger.Warnln("If there are unretained volumes in the cluster, you might have to delete them manually.")
@@ -140,65 +137,22 @@ func runReset(opts *resetOpts) error {
140137
s.Logger.Warnln("You can skip this phase by using '--destroy-workers=false' flag.")
141138
s.Logger.Warnln("If there are worker nodes in the cluster, you might have to delete them manually.")
142139
}
143-
s.Logger.Warnln("If there are unretained volumes and load balancers in the cluster, you might have to delete them manually.")
144140

145141
return cErr
146142
}
147143
}
148144

149-
if opts.CleanupLoadBalancers {
150-
s.Logger.Warnln("cleanup-load-balancers command will PERMANENTLY delete the load balancers from the cluster.")
151-
svcList := corev1.ServiceList{}
152-
if err = s.DynamicClient.List(s.Context, &svcList); err != nil {
153-
s.Logger.Errorln("Failed to list load balancer services.")
154-
s.Logger.Warnln("Load balancer Service might not be deleted. If there are services of type load balancer in the cluster, you might have to delete them manually.")
155-
}
156-
services := []corev1.Service{}
157-
for _, svc := range svcList.Items {
158-
if svc.Spec.Type == corev1.ServiceTypeLoadBalancer {
159-
services = append(services, svc)
160-
}
161-
}
162-
if len(services) > 0 {
163-
fmt.Printf("\nThe following load balancer services will be destroyed:\n")
164-
for _, svc := range services {
165-
fmt.Printf("\t- %s/%s\n", svc.Namespace, svc.Name)
166-
}
167-
}
145+
if opts.RemoveLBServices {
146+
s.Logger.Warnln("remove-lb-services command will PERMANENTLY delete the load balancers from the cluster.")
168147
}
169148

170-
if opts.CleanupVolumes {
171-
s.Logger.Warnln("cleanup-volumes command will PERMANENTLY delete the unretained volumes from the cluster.")
172-
173-
pvList := corev1.PersistentVolumeList{}
174-
if err = s.DynamicClient.List(s.Context, &pvList); err != nil {
175-
s.Logger.Errorln("Failed to list persistent volumes.")
176-
s.Logger.Warnln("Volumes might not be deleted. If there are volumes in the cluster, you might have to delete them manually.")
177-
}
178-
pvs := []corev1.PersistentVolume{}
179-
for _, pv := range pvList.Items {
180-
if pv.Annotations[clientutil.AnnDynamicallyProvisioned] != "" && pv.Spec.PersistentVolumeReclaimPolicy == corev1.PersistentVolumeReclaimDelete {
181-
pvs = append(pvs, pv)
182-
}
183-
}
184-
if len(pvs) > 0 {
185-
fmt.Printf("\nThe following volumes will be destroyed:\n")
186-
for _, pv := range pvs {
187-
fmt.Printf("\t- %s/%s/%s\n", pv.Spec.ClaimRef.Namespace, pv.Spec.ClaimRef.Name, pv.Name)
188-
}
189-
}
149+
if opts.RemoveVolumes {
150+
s.Logger.Warnln("remove-volumes command will PERMANENTLY delete the unretained volumes from the cluster.")
190151
}
191152

192153
if opts.DestroyWorkers {
193154
s.Logger.Warnln("destroy-workers command will PERMANENTLY destroy the Kubernetes cluster running on the following nodes:")
194155

195-
for _, node := range s.Cluster.ControlPlane.Hosts {
196-
fmt.Printf("\t- reset control plane node %q (%s)\n", node.Hostname, node.PrivateAddress)
197-
}
198-
for _, node := range s.Cluster.StaticWorkers.Hosts {
199-
fmt.Printf("\t- reset static worker nodes %q (%s)\n", node.Hostname, node.PrivateAddress)
200-
}
201-
202156
// Gather information about machine-controller managed nodes
203157
machines := clusterv1alpha1.MachineList{}
204158
if err = s.DynamicClient.List(s.Context, &machines); err != nil {
@@ -217,6 +171,13 @@ func runReset(opts *resetOpts) error {
217171
s.Logger.Warnln("If there are worker nodes in the cluster, you might have to delete them manually.")
218172
}
219173

174+
for _, node := range s.Cluster.ControlPlane.Hosts {
175+
fmt.Printf("\t- reset control plane node %q (%s)\n", node.Hostname, node.PrivateAddress)
176+
}
177+
for _, node := range s.Cluster.StaticWorkers.Hosts {
178+
fmt.Printf("\t- reset static worker nodes %q (%s)\n", node.Hostname, node.PrivateAddress)
179+
}
180+
220181
fmt.Printf("\nAfter the command is complete, there's NO way to recover the cluster or its data!\n")
221182

222183
confirm, err := confirmCommand(opts.AutoApprove)

pkg/state/context.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ type State struct {
107107
Verbose bool
108108
BackupFile string
109109
DestroyWorkers bool
110-
CleanupVolumes bool
111-
CleanupLoadBalancers bool
110+
RemoveVolumes bool
111+
RemoveLBServices bool
112112
RemoveBinaries bool
113113
ForceUpgrade bool
114114
ForceInstall bool

pkg/tasks/reset.go

+24-56
Original file line numberDiff line numberDiff line change
@@ -31,85 +31,53 @@ import (
3131
"k8s.io/apimachinery/pkg/util/wait"
3232
)
3333

34-
// CleanupLoadBalancers Deletes all the load balancers services from the cluster.
35-
func CleanupLoadBalancers(s *state.State) error {
36-
if !s.CleanupLoadBalancers {
34+
// RemoveLBServices Deletes all the load balancers services from the cluster.
35+
func RemoveLBServices(s *state.State) error {
36+
if !s.RemoveLBServices {
3737
return nil
3838
}
3939
var lastErr error
40-
s.Logger.Infoln("Deleting load balancer services...")
41-
_ = wait.ExponentialBackoff(defaultRetryBackoff(3), func() (bool, error) {
42-
lastErr = clientutil.CleanupLBs(s.Context, s.Logger, s.DynamicClient)
43-
if lastErr != nil {
44-
s.Logger.Warn("Unable to delete services of type load balancer. Retrying...")
45-
46-
return false, nil
47-
}
48-
49-
return true, nil
50-
})
51-
52-
_ = wait.ExponentialBackoff(defaultRetryBackoff(3), func() (bool, error) {
53-
lastErr = clientutil.WaitCleanupLbs(s.Context, s.Logger, s.DynamicClient)
54-
if lastErr != nil {
55-
s.Logger.Warn("Waiting for all load balancer services to be deleted...")
40+
s.Logger.Infoln("Deleting LoadBalancer Services...")
41+
lastErr = clientutil.CleanupLBs(s.Context, s.Logger, s.DynamicClient)
42+
if lastErr != nil {
43+
s.Logger.Warn("Unable to delete services of type load balancer.")
5644

57-
return false, nil
58-
}
45+
return lastErr
46+
}
5947

60-
return true, nil
61-
})
48+
lastErr = clientutil.WaitCleanupLbs(s.Context, s.Logger, s.DynamicClient)
6249
if lastErr != nil {
50+
s.Logger.Warn("Waiting for all load balancer services to be deleted...")
51+
6352
return lastErr
6453
}
6554

6655
return lastErr
6756
}
6857

69-
// CleanupVolumes Deletes all the dynamically provisioned and unretained volumes from the cluster.
70-
func CleanupVolumes(s *state.State) error {
71-
if !s.CleanupVolumes {
58+
// RemoveVolumes Deletes all the dynamically provisioned and unretained volumes from the cluster.
59+
func RemoveVolumes(s *state.State) error {
60+
if !s.RemoveVolumes {
7261
return nil
7362
}
7463
var lastErr error
7564
s.Logger.Infoln("Deleting dynamically provisioned and unretained volumes...")
76-
_ = wait.ExponentialBackoff(defaultRetryBackoff(3), func() (bool, error) {
77-
lastErr = clientutil.CleanupUnretainedVolumes(s.Context, s.Logger, s.DynamicClient)
78-
if lastErr != nil {
79-
s.Logger.Warn("Unable to delete volumes. Retrying...")
80-
81-
return false, nil
82-
}
83-
84-
return true, nil
85-
})
65+
lastErr = clientutil.CleanupUnretainedVolumes(s.Context, s.Logger, s.DynamicClient)
8666
if lastErr != nil {
67+
s.Logger.Warn("Unable to delete volumes.")
8768
s.Logger.Infoln("Deleting ValidatingWebhookConfiguration to enable future PV & PVC creation...")
88-
_ = wait.ExponentialBackoff(defaultRetryBackoff(3), func() (bool, error) {
89-
if err := clientutil.DeletePreventingWebhook(s.Context, s.DynamicClient,
90-
"kubernetes-cluster-cleanup-"+strings.Join(clientutil.VolumeResources, "-")); err != nil {
91-
s.Logger.Warn("Unable to delete ValidatingWebhookConfiguration. Retrying...")
92-
93-
return false, nil
94-
}
95-
96-
return true, nil
97-
})
69+
if err := clientutil.DeletePreventingWebhook(s.Context, s.DynamicClient,
70+
"kubernetes-cluster-cleanup-"+strings.Join(clientutil.VolumeResources, "-")); err != nil {
71+
s.Logger.Warn("Unable to delete ValidatingWebhookConfiguration. Retrying...")
72+
}
9873

9974
return lastErr
10075
}
10176

102-
_ = wait.ExponentialBackoff(defaultRetryBackoff(3), func() (bool, error) {
103-
lastErr = clientutil.WaitCleanUpVolumes(s.Context, s.Logger, s.DynamicClient)
104-
if lastErr != nil {
105-
s.Logger.Warn("Waiting for all dynamically provisioned and unretained volumes to be deleted...")
106-
107-
return false, nil
108-
}
109-
110-
return true, nil
111-
})
77+
lastErr = clientutil.WaitCleanUpVolumes(s.Context, s.Logger, s.DynamicClient)
11278
if lastErr != nil {
79+
s.Logger.Warn("Waiting for all dynamically provisioned and unretained volumes to be deleted...")
80+
11381
return lastErr
11482
}
11583

pkg/tasks/tasks.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,19 @@ func WithUpgrade(t Tasks, followers ...kubeoneapi.HostConfig) Tasks {
391391

392392
func WithReset(t Tasks) Tasks {
393393
return t.append(Tasks{
394-
{Fn: CleanupLoadBalancers, Operation: "cleanup load balancers"},
395-
{Fn: CleanupVolumes, Operation: "cleanup dynamically provisioned and unretained volumes"},
394+
{
395+
Fn: RemoveLBServices,
396+
Operation: "remove load balancer services",
397+
Predicate: func(s *state.State) bool {
398+
return s.RemoveLBServices
399+
}},
400+
{
401+
Fn: RemoveVolumes,
402+
Operation: "remove dynamically provisioned and unretained volumes",
403+
Predicate: func(s *state.State) bool {
404+
return s.RemoveVolumes
405+
},
406+
},
396407
{Fn: destroyWorkers, Operation: "destroying workers"},
397408
{Fn: resetAllNodes, Operation: "resetting all nodes"},
398409
{Fn: removeBinariesAllNodes, Operation: "removing kubernetes binaries from nodes"},

0 commit comments

Comments
 (0)