From 58f87152fd2aacdf05e675ea22ec594e6341b2d3 Mon Sep 17 00:00:00 2001 From: James Lu Date: Tue, 13 Aug 2024 16:55:35 +0800 Subject: [PATCH] fix(node): add the node.Status.Condition `ModulesLoaded` Check if the module `dm_crypt` is enabled first. ref: longhorn/longhorn 9153 Signed-off-by: James Lu --- controller/node_controller.go | 30 +++++++++++++++++++++++++++ controller/node_controller_test.go | 10 +++++++++ k8s/pkg/apis/longhorn/v1beta2/node.go | 2 ++ 3 files changed, 42 insertions(+) diff --git a/controller/node_controller.go b/controller/node_controller.go index 45793e4a14..dba1f4e391 100644 --- a/controller/node_controller.go +++ b/controller/node_controller.go @@ -1015,6 +1015,7 @@ func (nc *NodeController) environmentCheck(kubeNode *corev1.Node, node *longhorn namespaces := []lhtypes.Namespace{lhtypes.NamespaceMnt, lhtypes.NamespaceNet} nc.syncPackagesInstalled(kubeNode, node, namespaces) nc.syncMultipathd(node, namespaces) + nc.checkModulesLoaded(node, namespaces) nc.syncNFSClientVersion(kubeNode, node, namespaces) } @@ -1120,6 +1121,35 @@ func (nc *NodeController) syncMultipathd(node *longhorn.Node, namespaces []lhtyp node.Status.Conditions = types.SetCondition(node.Status.Conditions, longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, "", "") } +func (nc *NodeController) checkModulesLoaded(node *longhorn.Node, namespaces []lhtypes.Namespace) { + checkingModules := []string{ + "dm_crypt", + } + nsexec, err := lhns.NewNamespaceExecutor(lhtypes.ProcessNone, lhtypes.HostProcDirectory, namespaces) + if err != nil { + node.Status.Conditions = types.SetCondition(node.Status.Conditions, longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, + string(longhorn.NodeConditionReasonNamespaceExecutorErr), + fmt.Sprintf("Failed to get namespace executor: %v", err.Error())) + return + } + + notLoadedModules := []string{} + for _, module := range checkingModules { + args := []string{module, "/proc/modules"} + if _, err := nsexec.Execute(nil, "grep", args, lhtypes.ExecuteDefaultTimeout); err != nil { + notLoadedModules = append(notLoadedModules, module) + } + } + if len(notLoadedModules) != 0 { + node.Status.Conditions = types.SetCondition(node.Status.Conditions, longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, + string(longhorn.NodeConditionReasonModulesNotLoaded), + fmt.Sprintf("Modules %v are not loaded on node %v", notLoadedModules, node.Name)) + return + } + + node.Status.Conditions = types.SetCondition(node.Status.Conditions, longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusTrue, "", "") +} + func (nc *NodeController) syncNFSClientVersion(kubeNode *corev1.Node, node *longhorn.Node, namespaces []lhtypes.Namespace) { kernelVersion := kubeNode.Status.NodeInfo.KernelVersion nfsClientVersions := []string{"CONFIG_NFS_V4_2", "CONFIG_NFS_V4_1", "CONFIG_NFS_V4"} diff --git a/controller/node_controller_test.go b/controller/node_controller_test.go index 6b732f0a53..515a88460f 100644 --- a/controller/node_controller_test.go +++ b/controller/node_controller_test.go @@ -186,6 +186,7 @@ func (s *NodeControllerSuite) TestManagerPodUp(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, }, @@ -273,6 +274,7 @@ func (s *NodeControllerSuite) TestManagerPodDown(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonNoMountPropagationSupport), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, }, @@ -360,6 +362,7 @@ func (s *NodeControllerSuite) TestKubeNodeDown(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, }, @@ -447,6 +450,7 @@ func (s *NodeControllerSuite) TestKubeNodePressure(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, }, @@ -569,6 +573,7 @@ func (s *NodeControllerSuite) TestUpdateDiskStatus(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, DiskStatus: map[string]*longhorn.DiskStatus{ @@ -720,6 +725,7 @@ func (s *NodeControllerSuite) TestCleanDiskStatus(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, DiskStatus: map[string]*longhorn.DiskStatus{ @@ -877,6 +883,7 @@ func (s *NodeControllerSuite) TestDisableDiskOnFilesystemChange(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, DiskStatus: map[string]*longhorn.DiskStatus{ @@ -1005,6 +1012,7 @@ func (s *NodeControllerSuite) TestCreateDefaultInstanceManager(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, DiskStatus: map[string]*longhorn.DiskStatus{ @@ -1150,6 +1158,7 @@ func (s *NodeControllerSuite) TestCleanupRedundantInstanceManagers(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, DiskStatus: map[string]*longhorn.DiskStatus{ @@ -1265,6 +1274,7 @@ func (s *NodeControllerSuite) TestCleanupAllInstanceManagers(c *C) { newNodeCondition(longhorn.NodeConditionTypeMountPropagation, longhorn.ConditionStatusTrue, ""), newNodeCondition(longhorn.NodeConditionTypeRequiredPackages, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonUnknownOS), newNodeCondition(longhorn.NodeConditionTypeMultipathd, longhorn.ConditionStatusTrue, ""), + newNodeCondition(longhorn.NodeConditionTypeModulesLoaded, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonModulesNotLoaded), newNodeCondition(longhorn.NodeConditionTypeNFSClientInstalled, longhorn.ConditionStatusFalse, longhorn.NodeConditionReasonKernelConfigIsNotFound), }, DiskStatus: map[string]*longhorn.DiskStatus{}, diff --git a/k8s/pkg/apis/longhorn/v1beta2/node.go b/k8s/pkg/apis/longhorn/v1beta2/node.go index 7943543bbf..b685c04c3d 100644 --- a/k8s/pkg/apis/longhorn/v1beta2/node.go +++ b/k8s/pkg/apis/longhorn/v1beta2/node.go @@ -6,6 +6,7 @@ const ( NodeConditionTypeReady = "Ready" NodeConditionTypeMountPropagation = "MountPropagation" NodeConditionTypeMultipathd = "Multipathd" + NodeConditionTypeModulesLoaded = "ModulesLoaded" NodeConditionTypeRequiredPackages = "RequiredPackages" NodeConditionTypeNFSClientInstalled = "NFSClientInstalled" NodeConditionTypeSchedulable = "Schedulable" @@ -22,6 +23,7 @@ const ( NodeConditionReasonMultipathdIsRunning = "MultipathdIsRunning" NodeConditionReasonUnknownOS = "UnknownOS" NodeConditionReasonNamespaceExecutorErr = "NamespaceExecutorErr" + NodeConditionReasonModulesNotLoaded = "ModulesNotLoaded" NodeConditionReasonPackagesNotInstalled = "PackagesNotInstalled" NodeConditionReasonKernelConfigIsNotFound = "KernelConfigIsNotFound" NodeConditionReasonNFSClientIsNotFound = "NFSClientIsNotFound"