Merge pull request #15983 from yujuhong/hash_pods

Stores hash of pod manifest in mirror pod's annotation
This commit is contained in:
Dawn Chen 2015-10-21 17:08:57 -07:00
commit a702d5f29b
6 changed files with 45 additions and 29 deletions

View File

@ -64,6 +64,12 @@ func applyDefaults(pod *api.Pod, source string, isFile bool, nodeName string) er
pod.Spec.NodeName = nodeName pod.Spec.NodeName = nodeName
pod.ObjectMeta.SelfLink = getSelfLink(pod.Name, pod.Namespace) pod.ObjectMeta.SelfLink = getSelfLink(pod.Name, pod.Namespace)
if pod.Annotations == nil {
pod.Annotations = make(map[string]string)
}
// The generated UID is the hash of the file.
pod.Annotations[kubetypes.ConfigHashAnnotationKey] = string(pod.UID)
return nil return nil
} }

View File

@ -96,10 +96,11 @@ func TestReadPodsFromFile(t *testing.T) {
}, },
expected: CreatePodUpdate(kubetypes.SET, kubetypes.FileSource, &api.Pod{ expected: CreatePodUpdate(kubetypes.SET, kubetypes.FileSource, &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "test-" + hostname, Name: "test-" + hostname,
UID: "12345", UID: "12345",
Namespace: "mynamespace", Namespace: "mynamespace",
SelfLink: getSelfLink("test-"+hostname, "mynamespace"), Annotations: map[string]string{kubetypes.ConfigHashAnnotationKey: "12345"},
SelfLink: getSelfLink("test-"+hostname, "mynamespace"),
}, },
Spec: api.PodSpec{ Spec: api.PodSpec{
NodeName: hostname, NodeName: hostname,

View File

@ -152,11 +152,11 @@ func TestExtractPodsFromHTTP(t *testing.T) {
kubetypes.HTTPSource, kubetypes.HTTPSource,
&api.Pod{ &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
UID: "111", UID: "111",
Name: "foo" + "-" + hostname, Name: "foo" + "-" + hostname,
Namespace: "mynamespace", Namespace: "mynamespace",
Annotations: map[string]string{kubetypes.ConfigHashAnnotationKey: "111"},
SelfLink: getSelfLink("foo-"+hostname, "mynamespace"), SelfLink: getSelfLink("foo-"+hostname, "mynamespace"),
}, },
Spec: api.PodSpec{ Spec: api.PodSpec{
NodeName: hostname, NodeName: hostname,
@ -210,11 +210,11 @@ func TestExtractPodsFromHTTP(t *testing.T) {
kubetypes.HTTPSource, kubetypes.HTTPSource,
&api.Pod{ &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
UID: "111", UID: "111",
Name: "foo" + "-" + hostname, Name: "foo" + "-" + hostname,
Namespace: "default", Namespace: "default",
Annotations: map[string]string{kubetypes.ConfigHashAnnotationKey: "111"},
SelfLink: getSelfLink("foo-"+hostname, kubetypes.NamespaceDefault), SelfLink: getSelfLink("foo-"+hostname, kubetypes.NamespaceDefault),
}, },
Spec: api.PodSpec{ Spec: api.PodSpec{
NodeName: hostname, NodeName: hostname,
@ -233,11 +233,11 @@ func TestExtractPodsFromHTTP(t *testing.T) {
}, },
&api.Pod{ &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
UID: "222", UID: "222",
Name: "bar" + "-" + hostname, Name: "bar" + "-" + hostname,
Namespace: "default", Namespace: "default",
Annotations: map[string]string{kubetypes.ConfigHashAnnotationKey: "222"},
SelfLink: getSelfLink("bar-"+hostname, kubetypes.NamespaceDefault), SelfLink: getSelfLink("bar-"+hostname, kubetypes.NamespaceDefault),
}, },
Spec: api.PodSpec{ Spec: api.PodSpec{
NodeName: hostname, NodeName: hostname,

View File

@ -234,7 +234,11 @@ func (pm *basicManager) IsMirrorPodOf(mirrorPod, pod *api.Pod) bool {
if pod.Name != mirrorPod.Name || pod.Namespace != mirrorPod.Namespace { if pod.Name != mirrorPod.Name || pod.Namespace != mirrorPod.Namespace {
return false return false
} }
return api.Semantic.DeepEqual(&pod.Spec, &mirrorPod.Spec) hash, ok := getHashFromMirrorPod(mirrorPod)
if !ok {
return false
}
return hash == getPodHash(pod)
} }
func podsMapToPods(UIDMap map[types.UID]*api.Pod) []*api.Pod { func podsMapToPods(UIDMap map[types.UID]*api.Pod) []*api.Pod {

View File

@ -52,7 +52,7 @@ func (mc *basicMirrorClient) CreateMirrorPod(pod *api.Pod) error {
for k, v := range pod.Annotations { for k, v := range pod.Annotations {
copyPod.Annotations[k] = v copyPod.Annotations[k] = v
} }
copyPod.Annotations[kubetypes.ConfigMirrorAnnotationKey] = kubetypes.MirrorType copyPod.Annotations[kubetypes.ConfigMirrorAnnotationKey] = getPodHash(pod)
_, err := mc.apiserverClient.Pods(copyPod.Namespace).Create(&copyPod) _, err := mc.apiserverClient.Pods(copyPod.Namespace).Create(&copyPod)
return err return err
@ -81,9 +81,16 @@ func IsStaticPod(pod *api.Pod) bool {
} }
func IsMirrorPod(pod *api.Pod) bool { func IsMirrorPod(pod *api.Pod) bool {
if value, ok := pod.Annotations[kubetypes.ConfigMirrorAnnotationKey]; !ok { _, ok := pod.Annotations[kubetypes.ConfigMirrorAnnotationKey]
return false return ok
} else { }
return value == kubetypes.MirrorType
} func getHashFromMirrorPod(pod *api.Pod) (string, bool) {
hash, ok := pod.Annotations[kubetypes.ConfigMirrorAnnotationKey]
return hash, ok
}
func getPodHash(pod *api.Pod) string {
// The annotation exists for all static pods.
return pod.Annotations[kubetypes.ConfigHashAnnotationKey]
} }

View File

@ -25,6 +25,7 @@ import (
const ConfigSourceAnnotationKey = "kubernetes.io/config.source" const ConfigSourceAnnotationKey = "kubernetes.io/config.source"
const ConfigMirrorAnnotationKey = "kubernetes.io/config.mirror" const ConfigMirrorAnnotationKey = "kubernetes.io/config.mirror"
const ConfigFirstSeenAnnotationKey = "kubernetes.io/config.seen" const ConfigFirstSeenAnnotationKey = "kubernetes.io/config.seen"
const ConfigHashAnnotationKey = "kubernetes.io/config.hash"
// PodOperation defines what changes will be made on a pod configuration. // PodOperation defines what changes will be made on a pod configuration.
type PodOperation int type PodOperation int
@ -49,9 +50,6 @@ const (
// Updates from all sources // Updates from all sources
AllSource = "*" AllSource = "*"
// Used for ConfigMirrorAnnotationKey.
MirrorType = "mirror"
NamespaceDefault = api.NamespaceDefault NamespaceDefault = api.NamespaceDefault
) )