github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/edged/podmanager/pod_manager.go (about)

     1  /*
     2  Copyright 2015 The Kubernetes Authors.
     3  Licensed under the Apache License, Version 2.0 (the "License");
     4  you may not use this file except in compliance with the License.
     5  You may obtain a copy of the License at
     6      http://www.apache.org/licenses/LICENSE-2.0
     7  Unless required by applicable law or agreed to in writing, software
     8  distributed under the License is distributed on an "AS IS" BASIS,
     9  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    10  See the License for the specific language governing permissions and
    11  limitations under the License.
    12  
    13  @CHANGELOG
    14  KubeEdge Authors: To create mini-kubelet for edge deployment scenario,
    15  This file is derived from K8S Kubelet code with pruned structures and interfaces
    16  and changed most of the realization.
    17  1. Manager struct is dericed from basicManager struct in kubernetes/pkg/kubelet/pod/pod_manager.go
    18  2. The methods are also pruned and modifed
    19  */
    20  
    21  package podmanager
    22  
    23  import (
    24  	"sync"
    25  
    26  	"k8s.io/api/core/v1"
    27  	"k8s.io/apimachinery/pkg/types"
    28  	"k8s.io/kubernetes/pkg/kubelet/container"
    29  	"k8s.io/kubernetes/pkg/kubelet/pod"
    30  	"k8s.io/kubernetes/pkg/kubelet/pod/testing"
    31  	kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
    32  )
    33  
    34  //Manager is derived from kubernetes/pkg/kubelet/pod/pod_manager.go
    35  type Manager interface {
    36  	pod.Manager
    37  }
    38  
    39  type podManager struct {
    40  	lock          sync.RWMutex
    41  	podByUID      map[types.UID]*v1.Pod
    42  	podByFullName map[string]*v1.Pod
    43  	*testing.MockManager
    44  }
    45  
    46  //NewPodManager creates new pod manager object
    47  func NewPodManager() pod.Manager {
    48  	pm := &podManager{
    49  		MockManager: new(testing.MockManager),
    50  	}
    51  	pm.podByUID = make(map[types.UID]*v1.Pod)
    52  	pm.podByFullName = make(map[string]*v1.Pod)
    53  	return pm
    54  }
    55  
    56  func (pm *podManager) AddPod(pod *v1.Pod) {
    57  	pm.UpdatePod(pod)
    58  }
    59  
    60  func (pm *podManager) UpdatePod(pod *v1.Pod) {
    61  	pm.lock.Lock()
    62  	defer pm.lock.Unlock()
    63  	pm.updatePodsInternal(pod)
    64  }
    65  
    66  func (pm *podManager) updatePodsInternal(pods ...*v1.Pod) {
    67  	for _, pod := range pods {
    68  		podFullName := container.GetPodFullName(pod)
    69  		pm.podByUID[pod.UID] = pod
    70  		pm.podByFullName[podFullName] = pod
    71  	}
    72  }
    73  
    74  func podsMapToPods(UIDMap map[types.UID]*v1.Pod) []*v1.Pod {
    75  	pods := make([]*v1.Pod, 0, len(UIDMap))
    76  	for _, pod := range UIDMap {
    77  		pods = append(pods, pod)
    78  	}
    79  	return pods
    80  }
    81  
    82  func (pm *podManager) GetPods() []*v1.Pod {
    83  	pm.lock.RLock()
    84  	defer pm.lock.RUnlock()
    85  	return podsMapToPods(pm.podByUID)
    86  }
    87  
    88  func (pm *podManager) GetPodByUID(uid types.UID) (*v1.Pod, bool) {
    89  	pm.lock.RLock()
    90  	defer pm.lock.RUnlock()
    91  	pod, ok := pm.podByUID[uid]
    92  	return pod, ok
    93  }
    94  
    95  func (pm *podManager) GetPodByName(namespace, name string) (*v1.Pod, bool) {
    96  	podFullName := container.BuildPodFullName(name, namespace)
    97  	return pm.GetPodByFullName(podFullName)
    98  }
    99  
   100  func (pm *podManager) GetPodByFullName(podFullName string) (*v1.Pod, bool) {
   101  	pm.lock.RLock()
   102  	defer pm.lock.RUnlock()
   103  	pod, ok := pm.podByFullName[podFullName]
   104  	return pod, ok
   105  }
   106  
   107  func (pm *podManager) DeletePod(pod *v1.Pod) {
   108  	pm.lock.RLock()
   109  	defer pm.lock.RUnlock()
   110  	podFullName := container.GetPodFullName(pod)
   111  	delete(pm.podByUID, pod.UID)
   112  	delete(pm.podByFullName, podFullName)
   113  }
   114  
   115  // GetUIDTranslations is part of the interface
   116  // We don't have static pod, so don't have podToMirror and mirrorToPod
   117  func (pm *podManager) GetUIDTranslations() (podToMirror map[kubetypes.ResolvedPodUID]kubetypes.MirrorPodUID,
   118  	mirrorToPod map[kubetypes.MirrorPodUID]kubetypes.ResolvedPodUID) {
   119  	return nil, nil
   120  }
   121  
   122  func (pm *podManager) TranslatePodUID(uid types.UID) kubetypes.ResolvedPodUID {
   123  	return kubetypes.ResolvedPodUID(uid)
   124  }
   125  
   126  func (pm *podManager) GetMirrorPodByPod(*v1.Pod) (*v1.Pod, bool) {
   127  	return nil, false
   128  }