Commit 9e5ed1dc authored by Nikhil Jindal's avatar Nikhil Jindal

Merge pull request #13880 from yujuhong/fix_annotations

Fix source annotation in kubelet
parents 55774307 fb270779
...@@ -190,19 +190,13 @@ func (s *podStorage) Merge(source string, change interface{}) error { ...@@ -190,19 +190,13 @@ func (s *podStorage) Merge(source string, change interface{}) error {
return nil return nil
} }
// recordFirstSeenTime records the first seen time of this pod.
func recordFirstSeenTime(pod *api.Pod) {
glog.V(4).Infof("Receiving a new pod %q", kubeletUtil.FormatPodName(pod))
pod.Annotations[kubelet.ConfigFirstSeenAnnotationKey] = kubeletTypes.NewTimestamp().GetString()
}
func (s *podStorage) merge(source string, change interface{}) (adds, updates, deletes *kubelet.PodUpdate) { func (s *podStorage) merge(source string, change interface{}) (adds, updates, deletes *kubelet.PodUpdate) {
s.podLock.Lock() s.podLock.Lock()
defer s.podLock.Unlock() defer s.podLock.Unlock()
adds = &kubelet.PodUpdate{Op: kubelet.ADD} adds = &kubelet.PodUpdate{Op: kubelet.ADD, Source: source}
updates = &kubelet.PodUpdate{Op: kubelet.UPDATE} updates = &kubelet.PodUpdate{Op: kubelet.UPDATE, Source: source}
deletes = &kubelet.PodUpdate{Op: kubelet.REMOVE} deletes = &kubelet.PodUpdate{Op: kubelet.REMOVE, Source: source}
pods := s.pods[source] pods := s.pods[source]
if pods == nil { if pods == nil {
...@@ -221,6 +215,11 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de ...@@ -221,6 +215,11 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de
filtered := filterInvalidPods(update.Pods, source, s.recorder) filtered := filterInvalidPods(update.Pods, source, s.recorder)
for _, ref := range filtered { for _, ref := range filtered {
name := kubecontainer.GetPodFullName(ref) name := kubecontainer.GetPodFullName(ref)
// Annotate the pod with the source before any comparison.
if ref.Annotations == nil {
ref.Annotations = make(map[string]string)
}
ref.Annotations[kubelet.ConfigSourceAnnotationKey] = source
if existing, found := pods[name]; found { if existing, found := pods[name]; found {
if checkAndUpdatePod(existing, ref) { if checkAndUpdatePod(existing, ref) {
// this is an update // this is an update
...@@ -231,10 +230,6 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de ...@@ -231,10 +230,6 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de
continue continue
} }
// this is an add // this is an add
if ref.Annotations == nil {
ref.Annotations = make(map[string]string)
}
ref.Annotations[kubelet.ConfigSourceAnnotationKey] = source
recordFirstSeenTime(ref) recordFirstSeenTime(ref)
pods[name] = ref pods[name] = ref
adds.Pods = append(adds.Pods, ref) adds.Pods = append(adds.Pods, ref)
...@@ -263,6 +258,11 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de ...@@ -263,6 +258,11 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de
filtered := filterInvalidPods(update.Pods, source, s.recorder) filtered := filterInvalidPods(update.Pods, source, s.recorder)
for _, ref := range filtered { for _, ref := range filtered {
name := kubecontainer.GetPodFullName(ref) name := kubecontainer.GetPodFullName(ref)
// Annotate the pod with the source before any comparison.
if ref.Annotations == nil {
ref.Annotations = make(map[string]string)
}
ref.Annotations[kubelet.ConfigSourceAnnotationKey] = source
if existing, found := oldPods[name]; found { if existing, found := oldPods[name]; found {
pods[name] = existing pods[name] = existing
if checkAndUpdatePod(existing, ref) { if checkAndUpdatePod(existing, ref) {
...@@ -273,10 +273,6 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de ...@@ -273,10 +273,6 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de
// this is a no-op // this is a no-op
continue continue
} }
if ref.Annotations == nil {
ref.Annotations = make(map[string]string)
}
ref.Annotations[kubelet.ConfigSourceAnnotationKey] = source
recordFirstSeenTime(ref) recordFirstSeenTime(ref)
pods[name] = ref pods[name] = ref
adds.Pods = append(adds.Pods, ref) adds.Pods = append(adds.Pods, ref)
...@@ -358,9 +354,12 @@ func isLocalAnnotationKey(key string) bool { ...@@ -358,9 +354,12 @@ func isLocalAnnotationKey(key string) bool {
// for local annotations. // for local annotations.
func isAnnotationMapEqual(existingMap, candidateMap map[string]string) bool { func isAnnotationMapEqual(existingMap, candidateMap map[string]string) bool {
if candidateMap == nil { if candidateMap == nil {
return true candidateMap = make(map[string]string)
} }
for k, v := range candidateMap { for k, v := range candidateMap {
if isLocalAnnotationKey(k) {
continue
}
if existingValue, ok := existingMap[k]; ok && existingValue == v { if existingValue, ok := existingMap[k]; ok && existingValue == v {
continue continue
} }
...@@ -378,6 +377,12 @@ func isAnnotationMapEqual(existingMap, candidateMap map[string]string) bool { ...@@ -378,6 +377,12 @@ func isAnnotationMapEqual(existingMap, candidateMap map[string]string) bool {
return true return true
} }
// recordFirstSeenTime records the first seen time of this pod.
func recordFirstSeenTime(pod *api.Pod) {
glog.V(4).Infof("Receiving a new pod %q", kubeletUtil.FormatPodName(pod))
pod.Annotations[kubelet.ConfigFirstSeenAnnotationKey] = kubeletTypes.NewTimestamp().GetString()
}
// updateAnnotations returns an Annotation map containing the api annotation map plus // updateAnnotations returns an Annotation map containing the api annotation map plus
// locally managed annotations // locally managed annotations
func updateAnnotations(existing, ref *api.Pod) { func updateAnnotations(existing, ref *api.Pod) {
...@@ -393,18 +398,30 @@ func updateAnnotations(existing, ref *api.Pod) { ...@@ -393,18 +398,30 @@ func updateAnnotations(existing, ref *api.Pod) {
existing.Annotations = annotations existing.Annotations = annotations
} }
func podsDifferSemantically(existing, ref *api.Pod) bool {
if reflect.DeepEqual(existing.Spec, ref.Spec) &&
reflect.DeepEqual(existing.DeletionTimestamp, ref.DeletionTimestamp) &&
reflect.DeepEqual(existing.DeletionGracePeriodSeconds, ref.DeletionGracePeriodSeconds) &&
isAnnotationMapEqual(existing.Annotations, ref.Annotations) {
return false
}
return true
}
// checkAndUpdatePod updates existing if ref makes a meaningful change and returns true, or // checkAndUpdatePod updates existing if ref makes a meaningful change and returns true, or
// returns false if there was no update. // returns false if there was no update.
func checkAndUpdatePod(existing, ref *api.Pod) bool { func checkAndUpdatePod(existing, ref *api.Pod) bool {
// TODO: it would be better to update the whole object and only preserve certain things // TODO: it would be better to update the whole object and only preserve certain things
// like the source annotation or the UID (to ensure safety) // like the source annotation or the UID (to ensure safety)
if reflect.DeepEqual(existing.Spec, ref.Spec) && if !podsDifferSemantically(existing, ref) {
reflect.DeepEqual(existing.DeletionTimestamp, ref.DeletionTimestamp) &&
reflect.DeepEqual(existing.DeletionGracePeriodSeconds, ref.DeletionGracePeriodSeconds) &&
isAnnotationMapEqual(existing.Annotations, ref.Annotations) {
return false return false
} }
// this is an update // this is an update
// Overwrite the first-seen time with the existing one. This is our own
// internal annotation, there is no need to update.
ref.Annotations[kubelet.ConfigFirstSeenAnnotationKey] = existing.Annotations[kubelet.ConfigFirstSeenAnnotationKey]
existing.Spec = ref.Spec existing.Spec = ref.Spec
existing.DeletionTimestamp = ref.DeletionTimestamp existing.DeletionTimestamp = ref.DeletionTimestamp
existing.DeletionGracePeriodSeconds = ref.DeletionGracePeriodSeconds existing.DeletionGracePeriodSeconds = ref.DeletionGracePeriodSeconds
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment