mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-07 03:03:59 +00:00
SetNodeUpdateStatusNeeded whenever nodeAdd event is received
This commit is contained in:
parent
ec1371b2b1
commit
638ef1b977
@ -240,6 +240,23 @@ func (adc *attachDetachController) podDelete(obj interface{}) {
|
|||||||
|
|
||||||
func (adc *attachDetachController) nodeAdd(obj interface{}) {
|
func (adc *attachDetachController) nodeAdd(obj interface{}) {
|
||||||
node, ok := obj.(*v1.Node)
|
node, ok := obj.(*v1.Node)
|
||||||
|
// TODO: investigate if nodeName is empty then if we can return
|
||||||
|
// kubernetes/kubernetes/issues/37777
|
||||||
|
if node == nil || !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
nodeName := types.NodeName(node.Name)
|
||||||
|
adc.nodeUpdate(nil, obj)
|
||||||
|
// kubernetes/kubernetes/issues/37586
|
||||||
|
// This is to workaround the case when a node add causes to wipe out
|
||||||
|
// the attached volumes field. This function ensures that we sync with
|
||||||
|
// the actual status.
|
||||||
|
adc.actualStateOfWorld.SetNodeStatusUpdateNeeded(nodeName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (adc *attachDetachController) nodeUpdate(oldObj, newObj interface{}) {
|
||||||
|
node, ok := newObj.(*v1.Node)
|
||||||
|
// TODO: investigate if nodeName is empty then if we can return
|
||||||
if node == nil || !ok {
|
if node == nil || !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -250,15 +267,9 @@ func (adc *attachDetachController) nodeAdd(obj interface{}) {
|
|||||||
// detach controller. Add it to desired state of world.
|
// detach controller. Add it to desired state of world.
|
||||||
adc.desiredStateOfWorld.AddNode(nodeName)
|
adc.desiredStateOfWorld.AddNode(nodeName)
|
||||||
}
|
}
|
||||||
|
|
||||||
adc.processVolumesInUse(nodeName, node.Status.VolumesInUse)
|
adc.processVolumesInUse(nodeName, node.Status.VolumesInUse)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (adc *attachDetachController) nodeUpdate(oldObj, newObj interface{}) {
|
|
||||||
// The flow for update is the same as add.
|
|
||||||
adc.nodeAdd(newObj)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (adc *attachDetachController) nodeDelete(obj interface{}) {
|
func (adc *attachDetachController) nodeDelete(obj interface{}) {
|
||||||
node, ok := obj.(*v1.Node)
|
node, ok := obj.(*v1.Node)
|
||||||
if node == nil || !ok {
|
if node == nil || !ok {
|
||||||
|
@ -116,6 +116,9 @@ type ActualStateOfWorld interface {
|
|||||||
// since volumes should be removed from this list as soon a detach operation
|
// since volumes should be removed from this list as soon a detach operation
|
||||||
// is considered, before the detach operation is triggered).
|
// is considered, before the detach operation is triggered).
|
||||||
GetVolumesToReportAttached() map[types.NodeName][]v1.AttachedVolume
|
GetVolumesToReportAttached() map[types.NodeName][]v1.AttachedVolume
|
||||||
|
|
||||||
|
// GetNodesToUpdateStatusFor returns the map of nodeNames to nodeToUpdateStatusFor
|
||||||
|
GetNodesToUpdateStatusFor() map[types.NodeName]nodeToUpdateStatusFor
|
||||||
}
|
}
|
||||||
|
|
||||||
// AttachedVolume represents a volume that is attached to a node.
|
// AttachedVolume represents a volume that is attached to a node.
|
||||||
@ -457,6 +460,7 @@ func (asw *actualStateOfWorld) updateNodeStatusUpdateNeeded(nodeName types.NodeN
|
|||||||
"Failed to set statusUpdateNeeded to needed %t because nodeName=%q does not exist",
|
"Failed to set statusUpdateNeeded to needed %t because nodeName=%q does not exist",
|
||||||
needed,
|
needed,
|
||||||
nodeName)
|
nodeName)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeToUpdate.statusUpdateNeeded = needed
|
nodeToUpdate.statusUpdateNeeded = needed
|
||||||
@ -591,6 +595,10 @@ func (asw *actualStateOfWorld) GetVolumesToReportAttached() map[types.NodeName][
|
|||||||
return volumesToReportAttached
|
return volumesToReportAttached
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (asw *actualStateOfWorld) GetNodesToUpdateStatusFor() map[types.NodeName]nodeToUpdateStatusFor {
|
||||||
|
return asw.nodesToUpdateStatusFor
|
||||||
|
}
|
||||||
|
|
||||||
func getAttachedVolume(
|
func getAttachedVolume(
|
||||||
attachedVolume *attachedVolume,
|
attachedVolume *attachedVolume,
|
||||||
nodeAttachedTo *nodeAttachedTo) AttachedVolume {
|
nodeAttachedTo *nodeAttachedTo) AttachedVolume {
|
||||||
|
@ -1094,6 +1094,25 @@ func Test_OneVolumeTwoNodes_TwoDevicePaths(t *testing.T) {
|
|||||||
verifyAttachedVolume(t, attachedVolumes, generatedVolumeName2, string(volumeName), node2Name, devicePath2, true /* expectedMountedByNode */, false /* expectNonZeroDetachRequestedTime */)
|
verifyAttachedVolume(t, attachedVolumes, generatedVolumeName2, string(volumeName), node2Name, devicePath2, true /* expectedMountedByNode */, false /* expectNonZeroDetachRequestedTime */)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test_SetNodeStatusUpdateNeededError expects the map nodesToUpdateStatusFor
|
||||||
|
// to be empty if the SetNodeStatusUpdateNeeded is called on a node that
|
||||||
|
// does not exist in the actual state of the world
|
||||||
|
func Test_SetNodeStatusUpdateNeededError(t *testing.T) {
|
||||||
|
// Arrange
|
||||||
|
volumePluginMgr, _ := volumetesting.GetTestVolumePluginMgr(t)
|
||||||
|
asw := NewActualStateOfWorld(volumePluginMgr)
|
||||||
|
nodeName := types.NodeName("node-1")
|
||||||
|
|
||||||
|
// Act
|
||||||
|
asw.SetNodeStatusUpdateNeeded(nodeName)
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
nodesToUpdateStatusFor := asw.GetNodesToUpdateStatusFor()
|
||||||
|
if len(nodesToUpdateStatusFor) != 0 {
|
||||||
|
t.Fatalf("nodesToUpdateStatusFor should be empty as nodeName does not exist")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func verifyAttachedVolume(
|
func verifyAttachedVolume(
|
||||||
t *testing.T,
|
t *testing.T,
|
||||||
attachedVolumes []AttachedVolume,
|
attachedVolumes []AttachedVolume,
|
||||||
|
@ -59,6 +59,8 @@ type nodeStatusUpdater struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error {
|
func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error {
|
||||||
|
// TODO: investigate right behavior if nodeName is empty
|
||||||
|
// kubernetes/kubernetes/issues/37777
|
||||||
nodesToUpdate := nsu.actualStateOfWorld.GetVolumesToReportAttached()
|
nodesToUpdate := nsu.actualStateOfWorld.GetVolumesToReportAttached()
|
||||||
for nodeName, attachedVolumes := range nodesToUpdate {
|
for nodeName, attachedVolumes := range nodesToUpdate {
|
||||||
nodeObj, exists, err := nsu.nodeInformer.GetStore().GetByKey(string(nodeName))
|
nodeObj, exists, err := nsu.nodeInformer.GetStore().GetByKey(string(nodeName))
|
||||||
|
Loading…
Reference in New Issue
Block a user