From f784be33acfd4a960e57fda899fa0ba496720a70 Mon Sep 17 00:00:00 2001 From: Mike Danese Date: Thu, 3 Dec 2015 14:01:16 -0800 Subject: [PATCH] actually validate semver in node controller rather than prefix checking --- pkg/controller/node/nodecontroller.go | 12 ++++++-- pkg/controller/node/nodecontroller_test.go | 34 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/pkg/controller/node/nodecontroller.go b/pkg/controller/node/nodecontroller.go index 6227f479c7f..879b064b82d 100644 --- a/pkg/controller/node/nodecontroller.go +++ b/pkg/controller/node/nodecontroller.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" "net" - "strings" "sync" "time" @@ -38,6 +37,7 @@ import ( "k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util/sets" + "k8s.io/kubernetes/pkg/version" "k8s.io/kubernetes/pkg/watch" ) @@ -287,6 +287,8 @@ func (nc *NodeController) getCondition(status *api.NodeStatus, conditionType api return nil } +var gracefulDeletionVersion = version.MustParse("v1.1.0") + // maybeDeleteTerminatingPod non-gracefully deletes pods that are terminating // that should not be gracefully terminated. func (nc *NodeController) maybeDeleteTerminatingPod(obj interface{}) { @@ -328,7 +330,13 @@ func (nc *NodeController) maybeDeleteTerminatingPod(obj interface{}) { // guarantee backwards compatibility of master API to kubelets with // versions less than 1.1.0 node := nodeObj.(*api.Node) - if strings.HasPrefix(node.Status.NodeInfo.KubeletVersion, "v1.0") { + v, err := version.Parse(node.Status.NodeInfo.KubeletVersion) + if err != nil { + glog.Infof("couldn't parse verions %q of minion: %v", node.Status.NodeInfo.KubeletVersion, err) + nc.forcefullyDeletePod(pod) + return + } + if gracefulDeletionVersion.GT(v) { nc.forcefullyDeletePod(pod) return } diff --git a/pkg/controller/node/nodecontroller_test.go b/pkg/controller/node/nodecontroller_test.go index f9e44ca34fd..192cc040312 100644 --- a/pkg/controller/node/nodecontroller_test.go +++ b/pkg/controller/node/nodecontroller_test.go @@ -725,6 +725,20 @@ func TestCheckPod(t *testing.T) { }, prune: true, }, + { + pod: api.Pod{ + ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, + Spec: api.PodSpec{NodeName: "older"}, + }, + prune: true, + }, + { + pod: api.Pod{ + ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, + Spec: api.PodSpec{NodeName: "oldest"}, + }, + prune: true, + }, { pod: api.Pod{ ObjectMeta: api.ObjectMeta{DeletionTimestamp: &unversioned.Time{}}, @@ -763,6 +777,26 @@ func TestCheckPod(t *testing.T) { }, }, }) + nc.nodeStore.Store.Add(&api.Node{ + ObjectMeta: api.ObjectMeta{ + Name: "older", + }, + Status: api.NodeStatus{ + NodeInfo: api.NodeSystemInfo{ + KubeletVersion: "v0.21.4", + }, + }, + }) + nc.nodeStore.Store.Add(&api.Node{ + ObjectMeta: api.ObjectMeta{ + Name: "oldest", + }, + Status: api.NodeStatus{ + NodeInfo: api.NodeSystemInfo{ + KubeletVersion: "v0.19.3", + }, + }, + }) for i, tc := range tcs { var deleteCalls int