remove stale OutOfDisk condition from kubelet side

pull/564/head
Di Xu 2019-01-03 11:15:15 +08:00
parent 76e9089d0e
commit e1a854b839
3 changed files with 64 additions and 0 deletions

View File

@ -524,6 +524,7 @@ func (kl *Kubelet) defaultNodeStatusFuncs() []func(*v1.Node) error {
nodestatus.PIDPressureCondition(kl.clock.Now, kl.evictionManager.IsUnderPIDPressure, kl.recordNodeStatusEvent),
nodestatus.ReadyCondition(kl.clock.Now, kl.runtimeState.runtimeErrors, kl.runtimeState.networkErrors, validateHostFunc, kl.containerManager.Status, kl.recordNodeStatusEvent),
nodestatus.VolumesInUse(kl.volumeManager.ReconcilerStatesHasBeenSynced, kl.volumeManager.GetVolumesInUse),
nodestatus.RemoveOutOfDiskCondition(),
// TODO(mtaufen): I decided not to move this setter for now, since all it does is send an event
// and record state back to the Kubelet runtime object. In the future, I'd like to isolate
// these side-effects by decoupling the decisions to send events and partial status recording

View File

@ -746,3 +746,18 @@ func VolumeLimits(volumePluginListFunc func() []volume.VolumePluginWithAttachLim
return nil
}
}
// RemoveOutOfDiskCondition removes stale OutOfDisk condition
// OutOfDisk condition has been removed from kubelet in 1.12
func RemoveOutOfDiskCondition() Setter {
return func(node *v1.Node) error {
var conditions []v1.NodeCondition
for i := range node.Status.Conditions {
if node.Status.Conditions[i].Type != v1.NodeOutOfDisk {
conditions = append(conditions, node.Status.Conditions[i])
}
}
node.Status.Conditions = conditions
return nil
}
}

View File

@ -1517,6 +1517,54 @@ func TestVolumeLimits(t *testing.T) {
}
}
func TestRemoveOutOfDiskCondition(t *testing.T) {
now := time.Now()
var cases = []struct {
desc string
inputNode *v1.Node
expectNode *v1.Node
}{
{
desc: "should remove stale OutOfDiskCondition from node status",
inputNode: &v1.Node{
Status: v1.NodeStatus{
Conditions: []v1.NodeCondition{
*makeMemoryPressureCondition(false, now, now),
{
Type: v1.NodeOutOfDisk,
Status: v1.ConditionFalse,
},
*makeDiskPressureCondition(false, now, now),
},
},
},
expectNode: &v1.Node{
Status: v1.NodeStatus{
Conditions: []v1.NodeCondition{
*makeMemoryPressureCondition(false, now, now),
*makeDiskPressureCondition(false, now, now),
},
},
},
},
}
for _, tc := range cases {
t.Run(tc.desc, func(t *testing.T) {
// construct setter
setter := RemoveOutOfDiskCondition()
// call setter on node
if err := setter(tc.inputNode); err != nil {
t.Fatalf("unexpected error: %v", err)
}
// check expected node
assert.True(t, apiequality.Semantic.DeepEqual(tc.expectNode, tc.inputNode),
"Diff: %s", diff.ObjectDiff(tc.expectNode, tc.inputNode))
})
}
}
// Test Helpers:
// sortableNodeAddress is a type for sorting []v1.NodeAddress