Skip to content

Commit 9b5d031

Browse files
authored
Fixes machine deletion when infra machine is deleted (#1120)
Signed-off-by: Alexey Makhov <[email protected]> Signed-off-by: makhov <[email protected]>
1 parent ffb279b commit 9b5d031

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed

internal/controller/controlplane/k0s_controlplane_controller.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ func (c *K0sController) reconcileMachines(ctx context.Context, cluster *clusterv
396396
desiredMachineNamesSlice := []string{}
397397

398398
var clusterIsUpdating bool
399+
var infraMachineMissing bool
399400
for _, m := range activeMachines.SortedByCreationTimestamp() {
400401
if m.Spec.Version == nil || (!versionMatches(m, kcp.Spec.Version)) {
401402
clusterIsUpdating = true
@@ -405,6 +406,9 @@ func (c *K0sController) reconcileMachines(ctx context.Context, cluster *clusterv
405406
machineNamesToDelete[m.Name] = true
406407
}
407408
} else if !matchesTemplateClonedFrom(infraMachines, kcp, m) || c.hasControllerConfigChanged(bootstrapConfigs, kcp, m) {
409+
if _, found := infraMachines[m.Name]; !found {
410+
infraMachineMissing = true
411+
}
408412
machineNamesToDelete[m.Name] = true
409413
} else {
410414
desiredMachineNamesSlice = append(desiredMachineNamesSlice, m.Name)
@@ -453,8 +457,7 @@ func (c *K0sController) reconcileMachines(ctx context.Context, cluster *clusterv
453457
}
454458
}
455459

456-
if len(machineNamesToDelete)+len(desiredMachineNames) > int(kcp.Spec.Replicas) {
457-
460+
if infraMachineMissing || (len(machineNamesToDelete)+len(desiredMachineNames) > int(kcp.Spec.Replicas)) {
458461
m := activeMachines.Newest().Name
459462
err := c.checkMachineIsReady(ctx, m, cluster)
460463
if err != nil {

inttest/capi-controlplane-docker/capi_controlplane_docker_test.go

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,19 @@ import (
2626
"testing"
2727
"time"
2828

29-
cpv1beta1 "github.com/k0sproject/k0smotron/api/controlplane/v1beta1"
30-
"sigs.k8s.io/cluster-api/api/v1beta1"
31-
32-
"github.com/k0sproject/k0smotron/inttest/util"
33-
3429
"github.com/stretchr/testify/suite"
3530
corev1 "k8s.io/api/core/v1"
3631
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3733
"k8s.io/apimachinery/pkg/util/json"
3834
"k8s.io/apimachinery/pkg/util/wait"
3935
"k8s.io/client-go/kubernetes"
4036
"k8s.io/client-go/rest"
4137
"k8s.io/client-go/tools/clientcmd"
38+
"sigs.k8s.io/cluster-api/api/v1beta1"
39+
40+
cpv1beta1 "github.com/k0sproject/k0smotron/api/controlplane/v1beta1"
41+
"github.com/k0sproject/k0smotron/inttest/util"
4242
)
4343

4444
type CAPIControlPlaneDockerSuite struct {
@@ -173,6 +173,39 @@ func (s *CAPIControlPlaneDockerSuite) TestCAPIControlPlaneDocker() {
173173
extraFileFromSecret, err = getDockerNodeFile("docker-test-cluster-docker-test-worker-0", "/tmp/test-file-secret")
174174
s.Require().NoError(err)
175175
s.Require().Equal("test", extraFileFromSecret)
176+
177+
err = s.client.RESTClient().
178+
Delete().
179+
AbsPath("/apis/infrastructure.cluster.x-k8s.io/v1beta1/namespaces/default/dockermachines/docker-test-2").
180+
Do(s.ctx).
181+
Error()
182+
183+
err = wait.PollUntilContextCancel(s.ctx, 100*time.Millisecond, true, func(ctx context.Context) (bool, error) {
184+
var obj unstructured.UnstructuredList
185+
err := s.client.RESTClient().
186+
Get().
187+
AbsPath("/apis/cluster.x-k8s.io/v1beta1/namespaces/default/machines").
188+
Do(s.ctx).
189+
Into(&obj)
190+
if err != nil {
191+
return false, nil
192+
}
193+
194+
// We expect 4 machines: 3 control plane and 1 worker
195+
return len(obj.Items) == 4, nil
196+
})
197+
s.Require().NoError(err)
198+
199+
err = wait.PollUntilContextCancel(s.ctx, 1*time.Second, true, func(ctx context.Context) (bool, error) {
200+
b, _ := s.client.RESTClient().
201+
Get().
202+
AbsPath("/healthz").
203+
DoRaw(context.Background())
204+
205+
return string(b) == "ok", nil
206+
})
207+
s.Require().NoError(err)
208+
176209
}
177210

178211
func (s *CAPIControlPlaneDockerSuite) applyClusterObjects() {
@@ -265,7 +298,7 @@ metadata:
265298
namespace: default
266299
spec:
267300
replicas: 3
268-
version: v1.27.2+k0s.0
301+
version: v1.33.3+k0s.0
269302
k0sConfigSpec:
270303
k0s:
271304
apiVersion: k0s.k0sproject.io/v1beta1
@@ -321,7 +354,7 @@ metadata:
321354
name: docker-test-worker-0
322355
namespace: default
323356
spec:
324-
version: v1.27.1
357+
version: v1.33.2
325358
clusterName: docker-test-cluster
326359
bootstrap:
327360
configRef:
@@ -340,7 +373,7 @@ metadata:
340373
namespace: default
341374
spec:
342375
# version is deliberately different to be able to verify we actually pick it up :)
343-
version: v1.27.1+k0s.0
376+
version: v1.33.2+k0s.0
344377
args:
345378
- --labels=k0sproject.io/foo=bar
346379
preStartCommands:

0 commit comments

Comments
 (0)