github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/cloud/pkg/synccontroller/createfailedobject.go (about)

     1  package synccontroller
     2  
     3  import (
     4  	apierrors "k8s.io/apimachinery/pkg/api/errors"
     5  	"k8s.io/apimachinery/pkg/labels"
     6  	"k8s.io/klog"
     7  
     8  	beehiveContext "github.com/kubeedge/beehive/pkg/core/context"
     9  	"github.com/kubeedge/beehive/pkg/core/model"
    10  	edgemgr "github.com/kubeedge/kubeedge/cloud/pkg/edgecontroller/manager"
    11  	commonconst "github.com/kubeedge/kubeedge/common/constants"
    12  )
    13  
    14  // Compare the objects in K8s with the objects that have been persisted to the edge,
    15  // If the objects fail to persisted to the edge for the first time, it will be recreated here.
    16  // Just focus on the pod, service, endpoint, because if the pod is passed down, and the configmap and secret
    17  // cannot be found then it will be queried to the cloud.
    18  func (sctl *SyncController) manageCreateFailedObject() {
    19  	sctl.manageCreateFailedCoreObject()
    20  	// TODO: checking for devices
    21  	// sctl.manageCreateFailedDevice()
    22  }
    23  
    24  func (sctl *SyncController) manageCreateFailedCoreObject() {
    25  	allPods, err := sctl.podLister.List(labels.Everything())
    26  	if err != nil {
    27  		klog.Errorf("Filed to list all the pods: %v", err)
    28  		return
    29  	}
    30  
    31  	set := labels.Set{edgemgr.NodeRoleKey: edgemgr.NodeRoleValue}
    32  	selector := labels.SelectorFromSet(set)
    33  	allEdgeNodes, err := sctl.nodeLister.List(selector)
    34  	if err != nil {
    35  		klog.Errorf("Filed to list all the edge nodes: %v", err)
    36  		return
    37  	}
    38  
    39  	for _, pod := range allPods {
    40  		if !isFromEdgeNode(allEdgeNodes, pod.Spec.NodeName) {
    41  			continue
    42  		}
    43  		// Check whether the pod is successfully persisted to edge
    44  		_, err := sctl.objectSyncLister.ObjectSyncs(pod.Namespace).Get(BuildObjectSyncName(pod.Spec.NodeName, string(pod.UID)))
    45  		if err != nil && apierrors.IsNotFound(err) {
    46  			msg := buildEdgeControllerMessage(pod.Spec.NodeName, pod.Namespace, model.ResourceTypePod, pod.Name, model.InsertOperation, pod)
    47  			beehiveContext.Send(commonconst.DefaultContextSendModuleName, *msg)
    48  		}
    49  
    50  		// TODO: add send check for service and endpoint
    51  		/*
    52  			services, err := sctl.serviceLister.GetPodServices(pod)
    53  			if err != nil {
    54  				klog.Errorf("Filed to list all the services for pod %s: %v", pod.Name, err)
    55  			}
    56  
    57  			for _, svc := range services {
    58  				// Check whether the service related to pod is successfully persisted to edge
    59  				_, err := sctl.objectSyncLister.ObjectSyncs(svc.Namespace).Get(buildObjectSyncName(pod.Spec.NodeName, string(svc.UID)))
    60  				if err != nil && apierrors.IsNotFound(err) {
    61  					msg := buildEdgeControllerMessage(pod.Spec.NodeName, svc.Namespace, commonconst.ResourceTypeService, svc.Name, model.InsertOperation, svc)
    62  					beehiveContext.Send(commonconst.DefaultContextSendModuleName, *msg)
    63  				}
    64  
    65  				selector := labels.SelectorFromSet(svc.Spec.Selector)
    66  				endpoints, err := sctl.endpointLister.Endpoints(svc.Namespace).List(selector)
    67  				if err != nil {
    68  					klog.Errorf("Filed to list all the endpoints for svc %s: %v", svc.Name, err)
    69  				}
    70  
    71  				for _, endpoint := range endpoints {
    72  					// Check whether the endpoint related to service is successfully persisted to edge
    73  					_, err := sctl.objectSyncLister.ObjectSyncs(endpoint.Namespace).Get(buildObjectSyncName(pod.Spec.NodeName, string(endpoint.UID)))
    74  					if err != nil && apierrors.IsNotFound(err) {
    75  						msg := buildEdgeControllerMessage(pod.Spec.NodeName, endpoint.Namespace, commonconst.ResourceTypeEndpoints, endpoint.Name, model.InsertOperation, endpoint)
    76  						beehiveContext.Send(commonconst.DefaultContextSendModuleName, *msg)
    77  					}
    78  				}
    79  			}
    80  		*/
    81  	}
    82  }
    83  
    84  func (sctl *SyncController) manageCreateFailedDevice() {
    85  	allDevices, err := sctl.deviceLister.List(labels.Everything())
    86  	if err != nil {
    87  		klog.Errorf("Filed to list all the devices: %v", err)
    88  		return
    89  	}
    90  
    91  	for _, device := range allDevices {
    92  		// Check whether the device is successfully persisted to edge
    93  		// TODO: refactor the nodeselector of the device
    94  		nodeName := device.Spec.NodeSelector.NodeSelectorTerms[0].MatchExpressions[0].Values[0]
    95  		_, err := sctl.objectSyncLister.ObjectSyncs(device.Namespace).Get(BuildObjectSyncName(nodeName, string(device.UID)))
    96  		if err != nil && apierrors.IsNotFound(err) {
    97  			msg := buildEdgeControllerMessage(nodeName, device.Namespace, commonconst.ResourceTypeService, device.Name, model.InsertOperation, device)
    98  			beehiveContext.Send(commonconst.DefaultContextSendModuleName, *msg)
    99  		}
   100  	}
   101  }