From 848568047b11e4b6bb20e5ecd39e67fe9809095d Mon Sep 17 00:00:00 2001 From: Shiva Krishna Merla Date: Wed, 19 Feb 2020 13:26:27 -0800 Subject: [PATCH] csi-driver: misc fixes related to nodeinfo updates (#109) (#110) * csi-driver: misc fixes related to nodeinfo updates * Problem: * nodeinfo resources are not cleaned up as log.Fatalf was used before unload. * on node-name re-use, stale nodeinfo resources are re-used as well * Implementation: * change log.Fatalf to Infof so we just log it but not exit. * update nodeinfo properties on node name re-use and stale hpenodeinfo objects. * Testing: tested scenarios of creation/deletion/IQN updates. node scale up/down by Fred. * Review: gcostea, rkumar, sbyadarahalli Signed-off-by: Shiva Krishna, Merla --- cmd/csi-driver/csi-driver.go | 2 +- pkg/flavor/kubernetes/flavor.go | 39 ++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/cmd/csi-driver/csi-driver.go b/cmd/csi-driver/csi-driver.go index 398d482e..8b084bec 100644 --- a/cmd/csi-driver/csi-driver.go +++ b/cmd/csi-driver/csi-driver.go @@ -148,7 +148,7 @@ func csiCliHandler(cmd *cobra.Command) error { syscall.SIGTERM) s := <-stop - log.Fatalf("Exiting due to signal [%v] notification for pid [%d]", s.String(), pid) + log.Infof("Exiting due to signal [%v] notification for pid [%d]", s.String(), pid) d.Stop(nodeService) log.Infof("Stopped [%d]", pid) return nil diff --git a/pkg/flavor/kubernetes/flavor.go b/pkg/flavor/kubernetes/flavor.go index 64e3dd0e..39f1da84 100644 --- a/pkg/flavor/kubernetes/flavor.go +++ b/pkg/flavor/kubernetes/flavor.go @@ -134,29 +134,50 @@ func (flavor *Flavor) LoadNodeInfo(node *model.Node) (string, error) { nodeInfo, err := flavor.getNodeInfoByUUID(node.UUID) if err != nil { - log.Errorf("Error obtaining node info by uuid - %s\n", err.Error()) + log.Errorf("Error obtaining node info by uuid %s- %s\n", node.UUID, err.Error()) return "", err } + if nodeInfo == nil { + nodeInfo, err = flavor.getNodeInfoByName(node.Name) + if err != nil { + log.Errorf("Error obtaining node info by name %s- %s\n", node.Name, err.Error()) + return "", err + } + } + if nodeInfo != nil { + // update nodename for lookup during cleanup(unload) + flavor.nodeName = nodeInfo.ObjectMeta.Name + log.Infof("Node info %s already known to cluster\n", nodeInfo.ObjectMeta.Name) // make sure the nodeInfo has updated information from the host updateNodeRequired := false + + // update node uuid on mismatch + if nodeInfo.Spec.UUID != node.UUID { + nodeInfo.Spec.UUID = node.UUID + updateNodeRequired = true + } + // update node initiator IQNs on mismatch iqnsFromNode := getIqnsFromNode(node) if !reflect.DeepEqual(nodeInfo.Spec.IQNs, iqnsFromNode) { nodeInfo.Spec.IQNs = iqnsFromNode updateNodeRequired = true } + // update node network information on mismatch networksFromNode := getNetworksFromNode(node) if !reflect.DeepEqual(nodeInfo.Spec.Networks, networksFromNode) { nodeInfo.Spec.Networks = networksFromNode updateNodeRequired = true } + // update node FC port WWPNs on mismatch wwpnsFromNode := getWwpnsFromNode(node) if !reflect.DeepEqual(nodeInfo.Spec.WWPNs, wwpnsFromNode) { nodeInfo.Spec.WWPNs = wwpnsFromNode updateNodeRequired = true } + if !updateNodeRequired { // no update needed to existing CRD return node.UUID, nil @@ -169,19 +190,6 @@ func (flavor *Flavor) LoadNodeInfo(node *model.Node) (string, error) { return "", err } } else { - // lookup the HPENodeInfo by name. In case of hard reset, CRDs still exist and we have new nodeID - nodeInfo, err := flavor.getNodeInfoByName(node.Name) - if nodeInfo != nil { - // patch the existing HpeNodeInfo with updated nodeID - log.Infof("updating Node %s from old UUID %s to new %s", nodeInfo.Name, nodeInfo.Spec.UUID, node.UUID) - nodeInfo.Spec.UUID = node.UUID - updatedNodeInfo, err := flavor.crdClient.StorageV1().HPENodeInfos().Update(nodeInfo) - if err != nil { - log.Errorf("Error updating the node %s - %s\n", nodeInfo.Name, err.Error()) - return "", err - } - return updatedNodeInfo.Spec.UUID, nil - } // if we didn't find HPENodeInfo yet, create one. newNodeInfo := &crd_v1.HPENodeInfo{ ObjectMeta: meta_v1.ObjectMeta{ @@ -204,8 +212,9 @@ func (flavor *Flavor) LoadNodeInfo(node *model.Node) (string, error) { return "", nil } - log.Infof("Successfully added node info for node %v", nodeInfo) + // update nodename for lookup during cleanup(unload) flavor.nodeName = nodeInfo.ObjectMeta.Name + log.Infof("Successfully added node info for node %v", nodeInfo) } return node.UUID, nil