Skip to content

Commit 4254b78

Browse files
k4leung4k8s-ci-robot
authored andcommitted
Change machine actuator to stop removing finalizer. (#366)
The removal of the finalizer should belong in the machine controller, as the finalizer is inserted at object creation time. The documentation for the actuator Delete interface is updated to specify that if no error is returned, it is assumed all resources dependent on the machine is cleaned up.
1 parent 96a45c7 commit 4254b78

File tree

6 files changed

+25
-23
lines changed

6 files changed

+25
-23
lines changed

cloud/google/machineactuator.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -354,12 +354,6 @@ func (gce *GCEClient) Delete(cluster *clusterv1.Cluster, machine *clusterv1.Mach
354354
"error deleting GCE instance: %v", err))
355355
}
356356

357-
if gce.v1Alpha1Client != nil {
358-
// Remove the finalizer
359-
machine.ObjectMeta.Finalizers = util.Filter(machine.ObjectMeta.Finalizers, clusterv1.MachineFinalizer)
360-
_, err = gce.v1Alpha1Client.Machines(machine.Namespace).Update(machine)
361-
}
362-
363357
return err
364358
}
365359

cloud/vsphere/machineactuator.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,9 +423,8 @@ func (vc *VsphereClient) Delete(cluster *clusterv1.Cluster, machine *clusterv1.M
423423

424424
vc.cleanUpStagingDir(machine)
425425

426-
// Update annotation for the state and remove finalizer.
426+
// Update annotation for the state.
427427
machine.ObjectMeta.Annotations[StatusMachineTerraformState] = ""
428-
machine.ObjectMeta.Finalizers = util.Filter(machine.ObjectMeta.Finalizers, clusterv1.MachineFinalizer)
429428
_, err = vc.machineClient.Update(machine)
430429

431430
return err

pkg/controller/machine/actuator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
type Actuator interface {
2626
// Create the machine.
2727
Create(*clusterv1.Cluster, *clusterv1.Machine) error
28-
// Delete the machine.
28+
// Delete the machine. If no error is returned, it is assumed that all dependent resources have been cleaned up.
2929
Delete(*clusterv1.Cluster, *clusterv1.Machine) error
3030
// Update the machine to the provided definition.
3131
Update(*clusterv1.Cluster, *clusterv1.Machine) error

pkg/controller/machine/controller.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,15 @@ func (c *MachineControllerImpl) Init(arguments sharedinformers.ControllerInitArg
8484

8585
// Reconcile handles enqueued messages. The delete will be handled by finalizer.
8686
func (c *MachineControllerImpl) Reconcile(machine *clusterv1.Machine) error {
87+
// Deep-copy otherwise we are mutating our cache.
88+
m := machine.DeepCopy()
8789
// Implement controller logic here
88-
name := machine.Name
90+
name := m.Name
8991
glog.Infof("Running reconcile Machine for %s\n", name)
9092

91-
if !machine.ObjectMeta.DeletionTimestamp.IsZero() {
93+
if !m.ObjectMeta.DeletionTimestamp.IsZero() {
9294
// no-op if finalizer has been removed.
93-
if !util.Contains(machine.ObjectMeta.Finalizers, clusterv1.MachineFinalizer) {
95+
if !util.Contains(m.ObjectMeta.Finalizers, clusterv1.MachineFinalizer) {
9496
glog.Infof("reconciling machine object %v causes a no-op as there is no finalizer.", name)
9597
return nil
9698
}
@@ -99,38 +101,38 @@ func (c *MachineControllerImpl) Reconcile(machine *clusterv1.Machine) error {
99101
return nil
100102
}
101103
glog.Infof("reconciling machine object %v triggers delete.", name)
102-
if err := c.delete(machine); err != nil {
104+
if err := c.delete(m); err != nil {
103105
glog.Errorf("Error deleting machine object %v; %v", name, err)
104106
return err
105107
}
106108

107109
// Remove finalizer on successful deletion.
108110
glog.Infof("machine object %v deletion successful, removing finalizer.", name)
109-
machine.ObjectMeta.Finalizers = util.Filter(machine.ObjectMeta.Finalizers, clusterv1.MachineFinalizer)
110-
if _, err := c.clientSet.ClusterV1alpha1().Machines(machine.Namespace).Update(machine); err != nil {
111+
m.ObjectMeta.Finalizers = util.Filter(m.ObjectMeta.Finalizers, clusterv1.MachineFinalizer)
112+
if _, err := c.clientSet.ClusterV1alpha1().Machines(m.Namespace).Update(m); err != nil {
111113
glog.Errorf("Error removing finalizer from machine object %v; %v", name, err)
112114
return err
113115
}
114116
return nil
115117
}
116118

117-
cluster, err := c.getCluster(machine)
119+
cluster, err := c.getCluster(m)
118120
if err != nil {
119121
return err
120122
}
121123

122-
exist, err := c.actuator.Exists(cluster, machine)
124+
exist, err := c.actuator.Exists(cluster, m)
123125
if err != nil {
124126
glog.Errorf("Error checking existance of machine instance for machine object %v; %v", name, err)
125127
return err
126128
}
127129
if exist {
128130
glog.Infof("reconciling machine object %v triggers idempotent update.", name)
129-
return c.update(machine)
131+
return c.update(m)
130132
}
131133
// Machine resource created. Machine does not yet exist.
132-
glog.Infof("reconciling machine object %v triggers idempotent create.", machine.ObjectMeta.Name)
133-
return c.create(machine)
134+
glog.Infof("reconciling machine object %v triggers idempotent create.", m.ObjectMeta.Name)
135+
return c.create(m)
134136
}
135137

136138
func (c *MachineControllerImpl) Get(namespace, name string) (*clusterv1.Machine, error) {

pkg/controller/machine/controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ import (
2626
"k8s.io/apimachinery/pkg/util/wait"
2727
"sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset/typed/cluster/v1alpha1"
2828

29+
"k8s.io/client-go/tools/cache"
2930
clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1"
3031
"sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/testutil"
3132
"sigs.k8s.io/cluster-api/pkg/client/clientset_generated/clientset"
32-
"k8s.io/client-go/tools/cache"
3333
)
3434

3535
func machineControllerReconcile(t *testing.T, cs *clientset.Clientset, controller *MachineController, namespace string) {

pkg/controller/machine/reconcile_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import (
3232
"sigs.k8s.io/cluster-api/pkg/util"
3333
)
3434

35-
func TestMachineSetControllerReconcileHandler(t *testing.T) {
35+
func TestMachineControllerReconcileHandler(t *testing.T) {
3636
tests := []struct {
3737
name string
3838
objExists bool
@@ -160,7 +160,14 @@ func TestMachineSetControllerReconcileHandler(t *testing.T) {
160160
t.Fatal(err)
161161
}
162162

163-
finalizerRemoved := machineUpdated && !util.Contains(machineToTest.ObjectMeta.Finalizers, v1alpha1.MachineFinalizer)
163+
finalizerRemoved := false
164+
if machineUpdated {
165+
updatedMachine, err := fakeClient.ClusterV1alpha1().Machines(machineToTest.Namespace).Get(machineToTest.Name, metav1.GetOptions{})
166+
if err != nil {
167+
t.Fatalf("failed to get updated machine.")
168+
}
169+
finalizerRemoved = !util.Contains(updatedMachine.ObjectMeta.Finalizers, v1alpha1.MachineFinalizer)
170+
}
164171

165172
if finalizerRemoved != test.expectFinalizerRemoved {
166173
t.Errorf("Got finalizer removed %v, expected finalizer removed %v", finalizerRemoved, test.expectFinalizerRemoved)

0 commit comments

Comments
 (0)