This is an automated email from the ASF dual-hosted git repository.
liuxun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/submarine.git
The following commit(s) were added to refs/heads/master by this push:
new 13656d4 SUBMARINE-828. Set up event handlers for various resources
other than submarine custom resource
13656d4 is described below
commit 13656d49a9f796c4ba798846b89c68d07d4f60ef
Author: MortalHappiness <[email protected]>
AuthorDate: Mon May 31 20:34:39 2021 +0800
SUBMARINE-828. Set up event handlers for various resources other than
submarine custom resource
### What is this PR for?
Currently we only set up event handler for Submarine custom resource. We
need to set up event handlers for other resources.
References:
1.
https://github.com/kubernetes/sample-controller/blob/73e81dab82c945b087f7db1f1f4a7b50e7d92751/controller.go#L123-L142
2.
https://github.com/kubernetes/sample-controller/blob/73e81dab82c945b087f7db1f1f4a7b50e7d92751/controller.go#L353-L386
### What type of PR is it?
[Feature]
### Todos
### What is the Jira issue?
https://issues.apache.org/jira/browse/SUBMARINE-828
### How should this be tested?
1. Run the operator using the command `./submarine-operator -v 4`
2. Create submarine custom resource
3. Delete the deployment `submarine-server`
4. See the log `Processing object: submarine-server` in the operator log
### Screenshots (if appropriate)

### Questions:
* Do the license files need updating? No
* Are there breaking changes for older versions? No
* Does this need new documentation? No
Author: MortalHappiness <[email protected]>
Signed-off-by: Liu Xun <[email protected]>
Closes #595 from MortalHappiness/SUBMARINE-828 and squashes the following
commits:
2cdcb7f [MortalHappiness] SUBMARINE-828. Set up event handlers for various
resources other than submarine custom resource
---
submarine-cloud-v2/controller.go | 162 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 161 insertions(+), 1 deletion(-)
diff --git a/submarine-cloud-v2/controller.go b/submarine-cloud-v2/controller.go
index d0acf42..676b0db 100644
--- a/submarine-cloud-v2/controller.go
+++ b/submarine-cloud-v2/controller.go
@@ -196,7 +196,127 @@ func NewController(
},
})
- // TODO: Setting up event handler for other resources. E.g. namespace
+ // Setting up event handler for other resources
+
namespaceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newNamespace := new.(*corev1.Namespace)
+ oldNamespace := old.(*corev1.Namespace)
+ if newNamespace.ResourceVersion ==
oldNamespace.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
deploymentInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newDeployment := new.(*appsv1.Deployment)
+ oldDeployment := old.(*appsv1.Deployment)
+ if newDeployment.ResourceVersion ==
oldDeployment.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
serviceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newService := new.(*corev1.Service)
+ oldService := old.(*corev1.Service)
+ if newService.ResourceVersion ==
oldService.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
serviceaccountInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newServiceAccount := new.(*corev1.ServiceAccount)
+ oldServiceAccount := old.(*corev1.ServiceAccount)
+ if newServiceAccount.ResourceVersion ==
oldServiceAccount.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
persistentvolumeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newPV := new.(*corev1.PersistentVolume)
+ oldPV := old.(*corev1.PersistentVolume)
+ if newPV.ResourceVersion == oldPV.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
persistentvolumeclaimInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newPVC := new.(*corev1.PersistentVolumeClaim)
+ oldPVC := old.(*corev1.PersistentVolumeClaim)
+ if newPVC.ResourceVersion == oldPVC.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
ingressInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newIngress := new.(*extensionsv1beta1.Ingress)
+ oldIngress := old.(*extensionsv1beta1.Ingress)
+ if newIngress.ResourceVersion ==
oldIngress.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
ingressrouteInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newIngressRoute := new.(*traefikv1alpha1.IngressRoute)
+ oldIngressRoute := old.(*traefikv1alpha1.IngressRoute)
+ if newIngressRoute.ResourceVersion ==
oldIngressRoute.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
clusterroleInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newClusterRole := new.(*rbacv1.ClusterRole)
+ oldClusterRole := old.(*rbacv1.ClusterRole)
+ if newClusterRole.ResourceVersion ==
oldClusterRole.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
+
clusterrolebindingInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: controller.handleObject,
+ UpdateFunc: func(old, new interface{}) {
+ newClusterRoleBinding :=
new.(*rbacv1.ClusterRoleBinding)
+ oldClusterRoleBinding :=
old.(*rbacv1.ClusterRoleBinding)
+ if newClusterRoleBinding.ResourceVersion ==
oldClusterRoleBinding.ResourceVersion {
+ return
+ }
+ controller.handleObject(new)
+ },
+ DeleteFunc: controller.handleObject,
+ })
return controller
}
@@ -1344,3 +1464,43 @@ func (c *Controller) enqueueSubmarine(obj interface{},
action int) {
action: action,
})
}
+
+// handleObject will take any resource implementing metav1.Object and attempt
+// to find the Submarine resource that 'owns' it. It does this by looking at
the
+// objects metadata.ownerReferences field for an appropriate OwnerReference.
+// It then enqueues that Submarine resource to be processed. If the object
does not
+// have an appropriate OwnerReference, it will simply be skipped.
+func (c *Controller) handleObject(obj interface{}) {
+ var object metav1.Object
+ var ok bool
+ if object, ok = obj.(metav1.Object); !ok {
+ tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
+ if !ok {
+ utilruntime.HandleError(fmt.Errorf("error decoding
object, invalid type"))
+ return
+ }
+ object, ok = tombstone.Obj.(metav1.Object)
+ if !ok {
+ utilruntime.HandleError(fmt.Errorf("error decoding
object tombstone, invalid type"))
+ return
+ }
+ klog.V(4).Infof("Recovered deleted object '%s' from tombstone",
object.GetName())
+ }
+ klog.V(4).Infof("Processing object: %s", object.GetName())
+ if ownerRef := metav1.GetControllerOf(object); ownerRef != nil {
+ // If this object is not owned by a Submarine, we should not do
anything
+ // more with it.
+ if ownerRef.Kind != "Submarine" {
+ return
+ }
+
+ submarine, err :=
c.submarinesLister.Submarines(object.GetNamespace()).Get(ownerRef.Name)
+ if err != nil {
+ klog.V(4).Infof("ignoring orphaned object '%s' of
submarine '%s'", object.GetSelfLink(), ownerRef.Name)
+ return
+ }
+
+ c.enqueueSubmarine(submarine, UPDATE)
+ return
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]