Skip to content

Commit ad43a14

Browse files
authored
KUBE-1216: add provider id check to exclude node name reusing (#188)
* KUBE-1216: add provider id check to exclude node name reusing
1 parent 2114f1f commit ad43a14

22 files changed

+2562
-1248
lines changed

e2e/suites/gke.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func (ts *gkeTestSuite) Run(ctx context.Context, t *testing.T) {
148148
}
149149

150150
if deployment.Status.UnavailableReplicas != 1 {
151-
return fmt.Errorf("nginx replica running")
151+
return fmt.Errorf("%v replica running: %v", deployment.Name, deployment.Status.UnavailableReplicas)
152152
}
153153

154154
return nil

go.mod

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ require (
2222
golang.org/x/net v0.41.0
2323
golang.org/x/sync v0.16.0
2424
helm.sh/helm/v3 v3.17.3
25-
k8s.io/api v0.32.2
25+
k8s.io/api v0.33.2
2626
k8s.io/apiextensions-apiserver v0.32.2
27-
k8s.io/apimachinery v0.32.2
27+
k8s.io/apimachinery v0.33.2
2828
k8s.io/apiserver v0.32.2
2929
k8s.io/cli-runtime v0.32.2
30-
k8s.io/client-go v0.32.2
30+
k8s.io/client-go v0.33.2
3131
k8s.io/component-base v0.32.2
3232
k8s.io/klog/v2 v2.130.1
3333
k8s.io/kubectl v0.32.2
@@ -84,14 +84,12 @@ require (
8484
github.com/gobwas/glob v0.2.3 // indirect
8585
github.com/gogo/protobuf v1.3.2 // indirect
8686
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
87-
github.com/golang/protobuf v1.5.4 // indirect
88-
github.com/google/btree v1.0.1 // indirect
89-
github.com/google/gnostic-models v0.6.8 // indirect
87+
github.com/google/btree v1.1.3 // indirect
88+
github.com/google/gnostic-models v0.6.9 // indirect
9089
github.com/google/go-cmp v0.7.0 // indirect
91-
github.com/google/gofuzz v1.2.0 // indirect
9290
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
9391
github.com/gorilla/mux v1.8.1 // indirect
94-
github.com/gorilla/websocket v1.5.3 // indirect
92+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect
9593
github.com/gosuri/uitable v0.0.4 // indirect
9694
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
9795
github.com/hashicorp/errwrap v1.1.0 // indirect
@@ -169,11 +167,12 @@ require (
169167
gopkg.in/inf.v0 v0.9.1 // indirect
170168
gopkg.in/ini.v1 v1.67.0 // indirect
171169
gopkg.in/yaml.v3 v3.0.1 // indirect
172-
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect
170+
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
173171
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
174172
oras.land/oras-go v1.2.5 // indirect
175173
sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
176174
sigs.k8s.io/kustomize/api v0.18.0 // indirect
177175
sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect
178-
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect
176+
sigs.k8s.io/randfill v1.0.0 // indirect
177+
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
179178
)

go.sum

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -192,18 +192,16 @@ github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6
192192
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
193193
github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k=
194194
github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
195-
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
196-
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
197-
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
198-
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
195+
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
196+
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
197+
github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
198+
github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
199199
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
200200
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
201201
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
202202
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
203203
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
204204
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
205-
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
206-
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
207205
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
208206
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
209207
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
@@ -216,8 +214,8 @@ github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv
216214
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
217215
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
218216
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
219-
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
220-
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
217+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
218+
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
221219
github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY=
222220
github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo=
223221
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
@@ -616,24 +614,24 @@ gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
616614
gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
617615
helm.sh/helm/v3 v3.17.3 h1:3n5rW3D0ArjFl0p4/oWO8IbY/HKaNNwJtOQFdH2AZHg=
618616
helm.sh/helm/v3 v3.17.3/go.mod h1:+uJKMH/UiMzZQOALR3XUf3BLIoczI2RKKD6bMhPh4G8=
619-
k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw=
620-
k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y=
617+
k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
618+
k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
621619
k8s.io/apiextensions-apiserver v0.32.2 h1:2YMk285jWMk2188V2AERy5yDwBYrjgWYggscghPCvV4=
622620
k8s.io/apiextensions-apiserver v0.32.2/go.mod h1:GPwf8sph7YlJT3H6aKUWtd0E+oyShk/YHWQHf/OOgCA=
623-
k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ=
624-
k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
621+
k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
622+
k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
625623
k8s.io/apiserver v0.32.2 h1:WzyxAu4mvLkQxwD9hGa4ZfExo3yZZaYzoYvvVDlM6vw=
626624
k8s.io/apiserver v0.32.2/go.mod h1:PEwREHiHNU2oFdte7BjzA1ZyjWjuckORLIK/wLV5goM=
627625
k8s.io/cli-runtime v0.32.2 h1:aKQR4foh9qeyckKRkNXUccP9moxzffyndZAvr+IXMks=
628626
k8s.io/cli-runtime v0.32.2/go.mod h1:a/JpeMztz3xDa7GCyyShcwe55p8pbcCVQxvqZnIwXN8=
629-
k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA=
630-
k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94=
627+
k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
628+
k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
631629
k8s.io/component-base v0.32.2 h1:1aUL5Vdmu7qNo4ZsE+569PV5zFatM9hl+lb3dEea2zU=
632630
k8s.io/component-base v0.32.2/go.mod h1:PXJ61Vx9Lg+P5mS8TLd7bCIr+eMJRQTyXe8KvkrvJq0=
633631
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
634632
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
635-
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
636-
k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
633+
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
634+
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
637635
k8s.io/kubectl v0.32.2 h1:TAkag6+XfSBgkqK9I7ZvwtF0WVtUAvK8ZqTt+5zi1Us=
638636
k8s.io/kubectl v0.32.2/go.mod h1:+h/NQFSPxiDZYX/WZaWw9fwYezGLISP0ud8nQKg+3g8=
639637
k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
@@ -648,7 +646,10 @@ sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo
648646
sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
649647
sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
650648
sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
651-
sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA=
652-
sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
649+
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
650+
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
651+
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
652+
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
653+
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
653654
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
654655
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

internal/actions/check_node_deleted.go

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88
"time"
99

1010
"github.com/sirupsen/logrus"
11-
apierrors "k8s.io/apimachinery/pkg/api/errors"
12-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1311
"k8s.io/client-go/kubernetes"
1412

1513
"github.com/castai/cluster-controller/internal/castai"
@@ -43,6 +41,9 @@ type CheckNodeDeletedHandler struct {
4341
var errNodeNotDeleted = errors.New("node is not deleted")
4442

4543
func (h *CheckNodeDeletedHandler) Handle(ctx context.Context, action *castai.ClusterAction) error {
44+
if action == nil {
45+
return fmt.Errorf("action is nil %w", errAction)
46+
}
4647
req, ok := action.Data().(*castai.ActionCheckNodeDeleted)
4748
if !ok {
4849
return newUnexpectedTypeErr(action.Data(), req)
@@ -52,8 +53,17 @@ func (h *CheckNodeDeletedHandler) Handle(ctx context.Context, action *castai.Clu
5253
"node_name": req.NodeName,
5354
"node_id": req.NodeID,
5455
"type": reflect.TypeOf(action.Data().(*castai.ActionCheckNodeDeleted)).String(),
56+
"provider_id": req.ProviderId,
5557
ActionIDLogField: action.ID,
5658
})
59+
60+
log.Info("checking if node is deleted")
61+
if req.NodeName == "" ||
62+
(req.NodeID == "" && req.ProviderId == "") {
63+
return fmt.Errorf("node name %v or node ID: %v or provider ID: %v is empty %w",
64+
req.NodeName, req.NodeID, req.ProviderId, errAction)
65+
}
66+
5767
log.Info("checking if node is deleted")
5868

5969
boff := waitext.NewConstantBackoff(h.cfg.retryWait)
@@ -63,34 +73,7 @@ func (h *CheckNodeDeletedHandler) Handle(ctx context.Context, action *castai.Clu
6373
boff,
6474
h.cfg.retries,
6575
func(ctx context.Context) (bool, error) {
66-
n, err := h.clientset.CoreV1().Nodes().Get(ctx, req.NodeName, metav1.GetOptions{})
67-
if apierrors.IsNotFound(err) {
68-
return false, nil
69-
}
70-
71-
if n == nil {
72-
return false, nil
73-
}
74-
75-
currentNodeID, ok := n.Labels[castai.LabelNodeID]
76-
if !ok {
77-
log.Info("node doesn't have castai node id label")
78-
}
79-
if currentNodeID != "" {
80-
if currentNodeID != req.NodeID {
81-
log.Info("node name was reused. Original node is deleted")
82-
return false, nil
83-
}
84-
if currentNodeID == req.NodeID {
85-
return false, fmt.Errorf("current node id = request node ID %w", errNodeNotDeleted)
86-
}
87-
}
88-
89-
if n != nil {
90-
return false, errNodeNotDeleted
91-
}
92-
93-
return true, err
76+
return checkNodeDeleted(ctx, h.clientset.CoreV1().Nodes(), req.NodeName, req.NodeID, req.ProviderId, log)
9477
},
9578
func(err error) {
9679
log.Warnf("node deletion check failed, will retry: %v", err)

0 commit comments

Comments
 (0)