Skip to content

Commit

Permalink
Merge pull request #532 from prashanth26/rel-v0.34.0
Browse files Browse the repository at this point in the history
Bugfix: Fixed issues with machineClass finalizers (rel-v0.34.0)
  • Loading branch information
prashanth26 authored Oct 15, 2020
2 parents a35c1fc + 351fb79 commit ec9dab9
Show file tree
Hide file tree
Showing 10 changed files with 371 additions and 61 deletions.
56 changes: 48 additions & 8 deletions pkg/controller/alicloudmachineclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (c *controller) machineSetToAlicloudMachineClassDelete(obj interface{}) {
}
}

func (c *controller) machineToAlicloudMachineClassDelete(obj interface{}) {
func (c *controller) machineToAlicloudMachineClassAdd(obj interface{}) {
machine, ok := obj.(*v1alpha1.Machine)
if machine == nil || !ok {
return
Expand All @@ -67,6 +67,40 @@ func (c *controller) machineToAlicloudMachineClassDelete(obj interface{}) {
}
}

func (c *controller) machineToAlicloudMachineClassUpdate(oldObj, newObj interface{}) {
oldMachine, ok := oldObj.(*v1alpha1.Machine)
if oldMachine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", oldObj)
return
}
newMachine, ok := newObj.(*v1alpha1.Machine)
if newMachine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", newObj)
return
}

if oldMachine.Spec.Class.Kind == newMachine.Spec.Class.Kind {
if newMachine.Spec.Class.Kind == AlicloudMachineClassKind {
// Both old and new machine refer to the same machineClass object
// And the correct kind so enqueuing only one of them.
c.alicloudMachineClassQueue.Add(newMachine.Spec.Class.Name)
}
} else {
// If both are pointing to different machineClasses
// we might have to enqueue both.
if oldMachine.Spec.Class.Kind == AlicloudMachineClassKind {
c.alicloudMachineClassQueue.Add(oldMachine.Spec.Class.Name)
}
if newMachine.Spec.Class.Kind == AlicloudMachineClassKind {
c.alicloudMachineClassQueue.Add(newMachine.Spec.Class.Name)
}
}
}

func (c *controller) machineToAlicloudMachineClassDelete(obj interface{}) {
c.machineToAlicloudMachineClassAdd(obj)
}

func (c *controller) alicloudMachineClassAdd(obj interface{}) {
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
if err != nil {
Expand All @@ -89,6 +123,10 @@ func (c *controller) alicloudMachineClassUpdate(oldObj, newObj interface{}) {
c.alicloudMachineClassAdd(newObj)
}

func (c *controller) alicloudMachineClassDelete(obj interface{}) {
c.alicloudMachineClassAdd(obj)
}

// reconcileClusterAlicloudMachineClassKey reconciles an AlicloudMachineClass due to controller resync
// or an event on the alicloudMachineClass.
func (c *controller) reconcileClusterAlicloudMachineClassKey(key string) error {
Expand Down Expand Up @@ -135,6 +173,14 @@ func (c *controller) reconcileClusterAlicloudMachineClass(class *v1alpha1.Aliclo
return nil
}

// Add finalizer to avoid losing machineClass object
if class.DeletionTimestamp == nil {
err = c.addAlicloudMachineClassFinalizers(class)
if err != nil {
return err
}
}

machines, err := c.findMachinesForClass(AlicloudMachineClassKind, class.Name)
if err != nil {
return err
Expand All @@ -144,13 +190,7 @@ func (c *controller) reconcileClusterAlicloudMachineClass(class *v1alpha1.Aliclo
// If deletion timestamp doesn't exist
_, annotationPresent := class.Annotations[machineutils.MigratedMachineClass]

if len(machines) > 0 {
// If 1 or more machine objects are referring the machineClass
err = c.addAlicloudMachineClassFinalizers(class)
if err != nil {
return err
}
} else if c.deleteMigratedMachineClass && annotationPresent {
if c.deleteMigratedMachineClass && annotationPresent && len(machines) == 0 {
// If controller has deleteMigratedMachineClass flag set
// and the migratedMachineClass annotation is set
err = c.controlMachineClient.AlicloudMachineClasses(class.Namespace).Delete(class.Name, &metav1.DeleteOptions{})
Expand Down
57 changes: 49 additions & 8 deletions pkg/controller/awsmachineclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,16 +57,51 @@ func (c *controller) machineSetToAWSMachineClassDelete(obj interface{}) {
}
}

func (c *controller) machineToAWSMachineClassDelete(obj interface{}) {
func (c *controller) machineToAWSMachineClassAdd(obj interface{}) {
machine, ok := obj.(*v1alpha1.Machine)
if machine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", obj)
return
}
if machine.Spec.Class.Kind == AWSMachineClassKind {
c.awsMachineClassQueue.Add(machine.Spec.Class.Name)
}
}

func (c *controller) machineToAWSMachineClassUpdate(oldObj, newObj interface{}) {
oldMachine, ok := oldObj.(*v1alpha1.Machine)
if oldMachine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", oldObj)
return
}
newMachine, ok := newObj.(*v1alpha1.Machine)
if newMachine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", newObj)
return
}

if oldMachine.Spec.Class.Kind == newMachine.Spec.Class.Kind {
if newMachine.Spec.Class.Kind == AWSMachineClassKind {
// Both old and new machine refer to the same machineClass object
// And the correct kind so enqueuing only one of them.
c.awsMachineClassQueue.Add(newMachine.Spec.Class.Name)
}
} else {
// If both are pointing to different machineClasses
// we might have to enqueue both.
if oldMachine.Spec.Class.Kind == AWSMachineClassKind {
c.awsMachineClassQueue.Add(oldMachine.Spec.Class.Name)
}
if newMachine.Spec.Class.Kind == AWSMachineClassKind {
c.awsMachineClassQueue.Add(newMachine.Spec.Class.Name)
}
}
}

func (c *controller) machineToAWSMachineClassDelete(obj interface{}) {
c.machineToAWSMachineClassAdd(obj)
}

func (c *controller) awsMachineClassAdd(obj interface{}) {
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
if err != nil {
Expand All @@ -89,6 +124,10 @@ func (c *controller) awsMachineClassUpdate(oldObj, newObj interface{}) {
c.awsMachineClassAdd(newObj)
}

func (c *controller) awsMachineClassDelete(obj interface{}) {
c.awsMachineClassAdd(obj)
}

// reconcileClusterAWSMachineClassKey reconciles an AWSMachineClass due to controller resync
// or an event on the awsMachineClass.
func (c *controller) reconcileClusterAWSMachineClassKey(key string) error {
Expand Down Expand Up @@ -135,6 +174,14 @@ func (c *controller) reconcileClusterAWSMachineClass(class *v1alpha1.AWSMachineC
return nil
}

// Add finalizer to avoid losing machineClass object
if class.DeletionTimestamp == nil {
err = c.addAWSMachineClassFinalizers(class)
if err != nil {
return err
}
}

machines, err := c.findMachinesForClass(AWSMachineClassKind, class.Name)
if err != nil {
return err
Expand All @@ -144,13 +191,7 @@ func (c *controller) reconcileClusterAWSMachineClass(class *v1alpha1.AWSMachineC
// If deletion timestamp doesn't exist
_, annotationPresent := class.Annotations[machineutils.MigratedMachineClass]

if len(machines) > 0 {
// If 1 or more machine objects are referring the machineClass
err = c.addAWSMachineClassFinalizers(class)
if err != nil {
return err
}
} else if c.deleteMigratedMachineClass && annotationPresent {
if c.deleteMigratedMachineClass && annotationPresent && len(machines) == 0 {
// If controller has deleteMigratedMachineClass flag set
// and the migratedMachineClass annotation is set
err = c.controlMachineClient.AWSMachineClasses(class.Namespace).Delete(class.Name, &metav1.DeleteOptions{})
Expand Down
57 changes: 49 additions & 8 deletions pkg/controller/azuremachineclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,16 +57,51 @@ func (c *controller) machineSetToAzureMachineClassDelete(obj interface{}) {
}
}

func (c *controller) machineToAzureMachineClassDelete(obj interface{}) {
func (c *controller) machineToAzureMachineClassAdd(obj interface{}) {
machine, ok := obj.(*v1alpha1.Machine)
if machine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", obj)
return
}
if machine.Spec.Class.Kind == AzureMachineClassKind {
c.azureMachineClassQueue.Add(machine.Spec.Class.Name)
}
}

func (c *controller) machineToAzureMachineClassUpdate(oldObj, newObj interface{}) {
oldMachine, ok := oldObj.(*v1alpha1.Machine)
if oldMachine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", oldObj)
return
}
newMachine, ok := newObj.(*v1alpha1.Machine)
if newMachine == nil || !ok {
klog.Warningf("Couldn't get machine from object: %+v", newObj)
return
}

if oldMachine.Spec.Class.Kind == newMachine.Spec.Class.Kind {
if newMachine.Spec.Class.Kind == AzureMachineClassKind {
// Both old and new machine refer to the same machineClass object
// And the correct kind so enqueuing only one of them.
c.azureMachineClassQueue.Add(newMachine.Spec.Class.Name)
}
} else {
// If both are pointing to different machineClasses
// we might have to enqueue both.
if oldMachine.Spec.Class.Kind == AzureMachineClassKind {
c.azureMachineClassQueue.Add(oldMachine.Spec.Class.Name)
}
if newMachine.Spec.Class.Kind == AzureMachineClassKind {
c.azureMachineClassQueue.Add(newMachine.Spec.Class.Name)
}
}
}

func (c *controller) machineToAzureMachineClassDelete(obj interface{}) {
c.machineToAzureMachineClassAdd(obj)
}

func (c *controller) azureMachineClassAdd(obj interface{}) {
key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj)
if err != nil {
Expand All @@ -89,6 +124,10 @@ func (c *controller) azureMachineClassUpdate(oldObj, newObj interface{}) {
c.azureMachineClassAdd(newObj)
}

func (c *controller) azureMachineClassDelete(obj interface{}) {
c.azureMachineClassAdd(obj)
}

// reconcileClusterAzureMachineClassKey reconciles an AzureMachineClass due to controller resync
// or an event on the azureMachineClass.
func (c *controller) reconcileClusterAzureMachineClassKey(key string) error {
Expand Down Expand Up @@ -136,6 +175,14 @@ func (c *controller) reconcileClusterAzureMachineClass(class *v1alpha1.AzureMach
return nil
}

// Add finalizer to avoid losing machineClass object
if class.DeletionTimestamp == nil {
err = c.addAzureMachineClassFinalizers(class)
if err != nil {
return err
}
}

machines, err := c.findMachinesForClass(AzureMachineClassKind, class.Name)
if err != nil {
return err
Expand All @@ -145,13 +192,7 @@ func (c *controller) reconcileClusterAzureMachineClass(class *v1alpha1.AzureMach
// If deletion timestamp doesn't exist
_, annotationPresent := class.Annotations[machineutils.MigratedMachineClass]

if len(machines) > 0 {
// If 1 or more machine objects are referring the machineClass
err = c.addAzureMachineClassFinalizers(class)
if err != nil {
return err
}
} else if c.deleteMigratedMachineClass && annotationPresent {
if c.deleteMigratedMachineClass && annotationPresent && len(machines) == 0 {
// If controller has deleteMigratedMachineClass flag set
// and the migratedMachineClass annotation is set
err = c.controlMachineClient.AzureMachineClasses(class.Namespace).Delete(class.Name, &metav1.DeleteOptions{})
Expand Down
18 changes: 18 additions & 0 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,12 +215,15 @@ func NewController(
})

machineInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.machineToOpenStackMachineClassAdd,
UpdateFunc: controller.machineToOpenStackMachineClassUpdate,
DeleteFunc: controller.machineToOpenStackMachineClassDelete,
})

openStackMachineClassInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.openStackMachineClassAdd,
UpdateFunc: controller.openStackMachineClassUpdate,
DeleteFunc: controller.openStackMachineClassDelete,
})

// AWS Controller Informers
Expand All @@ -233,12 +236,15 @@ func NewController(
})

machineInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.machineToAWSMachineClassAdd,
UpdateFunc: controller.machineToAWSMachineClassUpdate,
DeleteFunc: controller.machineToAWSMachineClassDelete,
})

awsMachineClassInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.awsMachineClassAdd,
UpdateFunc: controller.awsMachineClassUpdate,
DeleteFunc: controller.awsMachineClassDelete,
})

// Azure Controller Informers
Expand All @@ -251,12 +257,15 @@ func NewController(
})

machineInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.machineToAzureMachineClassAdd,
UpdateFunc: controller.machineToAzureMachineClassUpdate,
DeleteFunc: controller.machineToAzureMachineClassDelete,
})

azureMachineClassInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.azureMachineClassAdd,
UpdateFunc: controller.azureMachineClassUpdate,
DeleteFunc: controller.azureMachineClassDelete,
})

// GCP Controller Informers
Expand All @@ -269,12 +278,15 @@ func NewController(
})

machineInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.machineToGCPMachineClassAdd,
UpdateFunc: controller.machineToGCPMachineClassUpdate,
DeleteFunc: controller.machineToGCPMachineClassDelete,
})

gcpMachineClassInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.gcpMachineClassAdd,
UpdateFunc: controller.gcpMachineClassUpdate,
DeleteFunc: controller.gcpMachineClassDelete,
})

// Alicloud Controller Informers
Expand All @@ -287,12 +299,15 @@ func NewController(
})

machineInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.machineToAlicloudMachineClassAdd,
UpdateFunc: controller.machineToAlicloudMachineClassUpdate,
DeleteFunc: controller.machineToAlicloudMachineClassDelete,
})

alicloudMachineClassInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.alicloudMachineClassAdd,
UpdateFunc: controller.alicloudMachineClassUpdate,
DeleteFunc: controller.alicloudMachineClassDelete,
})

// Packet Controller Informers
Expand All @@ -305,12 +320,15 @@ func NewController(
})

machineInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.machineToPacketMachineClassAdd,
UpdateFunc: controller.machineToPacketMachineClassUpdate,
DeleteFunc: controller.machineToPacketMachineClassDelete,
})

packetMachineClassInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.packetMachineClassAdd,
UpdateFunc: controller.packetMachineClassUpdate,
DeleteFunc: controller.packetMachineClassDelete,
})

/* Node Controller Informers - Don't remove this, saved for future use case.
Expand Down
Loading

0 comments on commit ec9dab9

Please sign in to comment.