Skip to content

Commit 6a3b68e

Browse files
committed
Apply labels to Machines if they're part of a MD or MS
1 parent 3bed0c5 commit 6a3b68e

File tree

5 files changed

+162
-2
lines changed

5 files changed

+162
-2
lines changed

api/v1alpha3/machine_types.go

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ const (
3131

3232
// ExcludeNodeDrainingAnnotation annotation explicitly skips node draining if set
3333
ExcludeNodeDrainingAnnotation = "machine.cluster.x-k8s.io.io/exclude-node-draining"
34+
35+
// MachineSetLabelName is the label set on machines if they're controlled by MachineSet
36+
MachineSetLabelName = "cluster.x-k8s.io/set-name"
37+
38+
// MachineDeploymentLabelName is the label set on machines if they're controlled by MachineDeployment
39+
MachineDeploymentLabelName = "cluster.x-k8s.io/deployment-name"
3440
)
3541

3642
// ANCHOR: MachineSpec

controllers/machine_controller.go

+32
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ func (r *MachineReconciler) reconcile(ctx context.Context, cluster *clusterv1.Cl
157157

158158
// Call the inner reconciliation methods.
159159
reconciliationErrors := []error{
160+
r.reconcileLables(ctx, m),
160161
r.reconcileBootstrap(ctx, m),
161162
r.reconcileInfrastructure(ctx, m),
162163
r.reconcileNodeRef(ctx, cluster, m),
@@ -181,6 +182,37 @@ func (r *MachineReconciler) reconcile(ctx context.Context, cluster *clusterv1.Cl
181182
return res, kerrors.NewAggregate(errs)
182183
}
183184

185+
func (r *MachineReconciler) reconcileLables(ctx context.Context, m *clusterv1.Machine) error {
186+
logger := r.Log.WithValues("machine", m.Name, "namespace", m.Namespace)
187+
188+
machineControllerRef := metav1.GetControllerOf(m)
189+
if machineControllerRef == nil {
190+
return nil
191+
}
192+
if m.Labels == nil {
193+
m.Labels = make(map[string]string)
194+
}
195+
m.Labels[clusterv1.MachineSetLabelName] = machineControllerRef.Name
196+
197+
ms := &clusterv1.MachineSet{}
198+
err := r.Client.Get(ctx, client.ObjectKey{
199+
Namespace: m.Namespace,
200+
Name: machineControllerRef.Name,
201+
}, ms)
202+
if err != nil {
203+
logger.Error(err, "failed to get owner machineset", "machineset", machineControllerRef.Name)
204+
return err
205+
}
206+
207+
machineSetControllerRef := metav1.GetControllerOf(ms)
208+
if machineSetControllerRef == nil {
209+
return nil
210+
}
211+
m.Labels[clusterv1.MachineDeploymentLabelName] = machineSetControllerRef.Name
212+
213+
return nil
214+
}
215+
184216
func (r *MachineReconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Cluster, m *clusterv1.Machine) (ctrl.Result, error) {
185217
logger := r.Log.WithValues("machine", m.Name, "namespace", m.Namespace)
186218
logger = logger.WithValues("cluster", cluster.Name)

controllers/machine_controller_test.go

+124
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"context"
21+
"reflect"
2022
"testing"
2123

2224
. "github.com/onsi/gomega"
@@ -26,6 +28,7 @@ import (
2628
"k8s.io/apimachinery/pkg/runtime"
2729
"k8s.io/apimachinery/pkg/types"
2830
"k8s.io/client-go/kubernetes/scheme"
31+
"k8s.io/klog/klogr"
2932
"k8s.io/utils/pointer"
3033
clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3"
3134
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -553,3 +556,124 @@ func TestRemoveMachineFinalizerAfterDeleteReconcile(t *testing.T) {
553556
Expect(mr.Client.Get(ctx, key, m)).ToNot(HaveOccurred())
554557
Expect(m.ObjectMeta.Finalizers).To(Equal([]string{metav1.FinalizerDeleteDependents}))
555558
}
559+
560+
func TestMachineReconciler_reconcileLables(t *testing.T) {
561+
RegisterTestingT(t)
562+
563+
err := clusterv1.AddToScheme(scheme.Scheme)
564+
Expect(err).NotTo(HaveOccurred())
565+
566+
tests := []struct {
567+
name string
568+
m *clusterv1.Machine
569+
ms *clusterv1.MachineSet
570+
md *clusterv1.MachineDeployment
571+
expectedLabels map[string]string
572+
wantErr bool
573+
}{
574+
{
575+
name: "no controller, machine should not have labels",
576+
m: &clusterv1.Machine{
577+
ObjectMeta: metav1.ObjectMeta{
578+
Name: "test-machine",
579+
Namespace: corev1.NamespaceDefault,
580+
},
581+
},
582+
wantErr: false,
583+
},
584+
{
585+
name: "controlled by machineset",
586+
m: &clusterv1.Machine{
587+
ObjectMeta: metav1.ObjectMeta{
588+
Name: "test-machine",
589+
Namespace: corev1.NamespaceDefault,
590+
OwnerReferences: []metav1.OwnerReference{
591+
{
592+
APIVersion: clusterv1.GroupVersion.String(),
593+
Kind: machineSetKind.String(),
594+
Name: "test-ms",
595+
Controller: pointer.BoolPtr(true),
596+
BlockOwnerDeletion: nil,
597+
},
598+
},
599+
},
600+
},
601+
ms: &clusterv1.MachineSet{
602+
ObjectMeta: metav1.ObjectMeta{
603+
Name: "test-ms",
604+
Namespace: corev1.NamespaceDefault,
605+
},
606+
},
607+
expectedLabels: map[string]string{
608+
clusterv1.MachineSetLabelName: "test-ms",
609+
},
610+
wantErr: false,
611+
},
612+
{
613+
name: "controlled by machinedeployment",
614+
m: &clusterv1.Machine{
615+
ObjectMeta: metav1.ObjectMeta{
616+
Name: "test-machine",
617+
Namespace: corev1.NamespaceDefault,
618+
OwnerReferences: []metav1.OwnerReference{
619+
{
620+
APIVersion: clusterv1.GroupVersion.String(),
621+
Kind: machineSetKind.String(),
622+
Name: "test-ms",
623+
Controller: pointer.BoolPtr(true),
624+
BlockOwnerDeletion: nil,
625+
},
626+
},
627+
},
628+
},
629+
ms: &clusterv1.MachineSet{
630+
ObjectMeta: metav1.ObjectMeta{
631+
Name: "test-ms",
632+
Namespace: corev1.NamespaceDefault,
633+
OwnerReferences: []metav1.OwnerReference{
634+
{
635+
APIVersion: clusterv1.GroupVersion.String(),
636+
Kind: machineDeploymentKind.String(),
637+
Name: "test-md",
638+
Controller: pointer.BoolPtr(true),
639+
BlockOwnerDeletion: nil,
640+
},
641+
},
642+
},
643+
},
644+
md: &clusterv1.MachineDeployment{
645+
ObjectMeta: metav1.ObjectMeta{
646+
Name: "test-md",
647+
Namespace: corev1.NamespaceDefault,
648+
},
649+
},
650+
expectedLabels: map[string]string{
651+
clusterv1.MachineSetLabelName: "test-ms",
652+
clusterv1.MachineDeploymentLabelName: "test-md",
653+
},
654+
wantErr: false,
655+
},
656+
}
657+
for _, tt := range tests {
658+
t.Run(tt.name, func(t *testing.T) {
659+
c := fake.NewFakeClientWithScheme(scheme.Scheme, tt.m)
660+
if tt.ms != nil {
661+
c = fake.NewFakeClientWithScheme(scheme.Scheme, tt.m, tt.ms)
662+
}
663+
if tt.md != nil {
664+
c = fake.NewFakeClientWithScheme(scheme.Scheme, tt.m, tt.ms, tt.md)
665+
}
666+
667+
r := &MachineReconciler{
668+
Log: klogr.New(),
669+
Client: c,
670+
}
671+
if err := r.reconcileLables(context.Background(), tt.m); (err != nil) != tt.wantErr {
672+
t.Errorf("reconcileLables() error = %v, wantErr %v", err, tt.wantErr)
673+
}
674+
if !reflect.DeepEqual(tt.m.Labels, tt.expectedLabels) {
675+
t.Errorf("expected labels %v, got %v", tt.expectedLabels, tt.m.Labels)
676+
}
677+
})
678+
}
679+
}

go.mod

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ require (
1919
github.com/sergi/go-diff v1.0.0
2020
github.com/spf13/cobra v0.0.5
2121
github.com/spf13/pflag v1.0.5
22-
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 // indirect
2322
golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc
2423
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 // indirect
2524
golang.org/x/text v0.3.2 // indirect

test/infrastructure/docker/go.mod

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ require (
66
github.com/ghodss/yaml v1.0.0
77
github.com/go-logr/logr v0.1.0
88
github.com/pkg/errors v0.8.1
9-
google.golang.org/appengine v1.5.0 // indirect
109
k8s.io/api v0.0.0-20190918195907-bd6ac527cfd2
1110
k8s.io/apimachinery v0.0.0-20190817020851-f2f3a405f61d
1211
k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible

0 commit comments

Comments
 (0)