From 30aa32ecdcf203e3bfaca30eced6a41a73ab7776 Mon Sep 17 00:00:00 2001 From: Santhosh Lakshmanan <111809751+santhoshatdell@users.noreply.github.com> Date: Thu, 6 Feb 2025 09:55:28 -0600 Subject: [PATCH] Docker files clean up and unit test coverage (#425) --- .../Dockerfile.ubi.micro => Dockerfile | 12 +- Makefile | 10 +- docker-files/Dockerfile.centos | 45 ---- docker-files/Dockerfile.ubi | 46 ---- docker-files/Dockerfile.ubi.alt | 59 ----- docker-files/Dockerfile.ubi.min | 52 ----- mocks/NodeLabelsModifier.go | 66 ++++++ mocks/NodeLabelsRetriever.go | 38 ++-- pkg/common/k8sutils/k8sutils.go | 82 +++---- pkg/common/k8sutils/k8sutils_test.go | 201 ++++++++++++++++++ pkg/node/node_test.go | 81 +++---- 11 files changed, 372 insertions(+), 320 deletions(-) rename docker-files/Dockerfile.ubi.micro => Dockerfile (92%) delete mode 100644 docker-files/Dockerfile.centos delete mode 100644 docker-files/Dockerfile.ubi delete mode 100644 docker-files/Dockerfile.ubi.alt delete mode 100644 docker-files/Dockerfile.ubi.min create mode 100644 mocks/NodeLabelsModifier.go create mode 100644 pkg/common/k8sutils/k8sutils_test.go diff --git a/docker-files/Dockerfile.ubi.micro b/Dockerfile similarity index 92% rename from docker-files/Dockerfile.ubi.micro rename to Dockerfile index 7b9badc9..e6e91725 100644 --- a/docker-files/Dockerfile.ubi.micro +++ b/Dockerfile @@ -1,5 +1,3 @@ -# -# # Copyright © 2023-2025 Dell Inc. or its subsidiaries. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -11,13 +9,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# -# - -# Dockerfile to build PowerStore CSI Driver -# based on UBI-micro image -# Requires: RHEL host with subscription +# some arguments that must be supplied ARG GOIMAGE ARG BASEIMAGE @@ -32,9 +25,7 @@ RUN GOOS=linux CGO_ENABLED=0 go build -o csi-powerstore ./cmd/csi-powerstore # Stage to build the driver image FROM $BASEIMAGE - WORKDIR / - LABEL vendor="Dell Technologies" \ maintainer="Dell Technologies" \ name="csi-powerstore" \ @@ -43,7 +34,6 @@ LABEL vendor="Dell Technologies" \ release="1.13.0" \ version="2.13.0" \ license="Apache-2.0" - COPY licenses /licenses # validate some cli utilities are found diff --git a/Makefile b/Makefile index 187d67e6..08e03faf 100644 --- a/Makefile +++ b/Makefile @@ -19,12 +19,6 @@ all: clean build -# Dockerfile defines which base image to use [Dockerfile.centos, Dockerfile.ubi, Dockerfile.ubi.min, Dockerfile.ubi.alt] -# e.g.:$ make docker DOCKER_FILE=Dockerfile.ubi.alt -ifndef DOCKER_FILE - DOCKER_FILE = Dockerfile.ubi.micro -endif - # Tag parameters ifndef MAJOR MAJOR=2 @@ -63,12 +57,12 @@ tag: # Generates the docker container (but does not push) docker: go run core/semver/semver.go -f mk >semver.mk - make -f docker.mk DOCKER_FILE=docker-files/$(DOCKER_FILE) docker + make -f docker.mk DOCKER_FILE=Dockerfile docker # Same as `docker` but without cached layers and will pull latest version of base image docker-no-cache: go run core/semver/semver.go -f mk >semver.mk - make -f docker.mk DOCKER_FILE=docker-files/$(DOCKER_FILE) docker-no-cache + make -f docker.mk DOCKER_FILE=Dockerfile docker-no-cache # Pushes container to the repository push: docker diff --git a/docker-files/Dockerfile.centos b/docker-files/Dockerfile.centos deleted file mode 100644 index 3c995c31..00000000 --- a/docker-files/Dockerfile.centos +++ /dev/null @@ -1,45 +0,0 @@ -# -# -# Copyright © 2020-2025 Dell Inc. or its subsidiaries. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# - -# Dockerfile to build PowerStore CSI Driver -# based on CentOS -ARG BASEIMAGE - -FROM $BASEIMAGE AS driver - -LABEL vendor="Dell Inc." \ - name="csi-powerstore" \ - summary="CSI Driver for Dell EMC PowerStore" \ - description="CSI Driver for provisioning persistent storage from Dell EMC PowerStore" \ - version="2.13.0" \ - license="Apache-2.0" - -COPY licenses /licenses - -# dependencies, following by cleaning the cache -RUN echo "%_netsharedpath /sys:/proc" >> /etc/rpm/macros.dist && yum update -y && yum install -y e2fsprogs xfsprogs nfs-utils nfs4-acl-tools acl which device-mapper-multipath \ - && \ - yum clean all \ - && \ - rm -rf /var/cache/run - -# validate some cli utilities are found -RUN which mkfs.ext4 -RUN which mkfs.xfs -RUN echo "export PATH=$PATH:/sbin:/bin" > /etc/profile.d/ubuntu_path.sh - -COPY "csi-powerstore" . -ENTRYPOINT ["/csi-powerstore"] diff --git a/docker-files/Dockerfile.ubi b/docker-files/Dockerfile.ubi deleted file mode 100644 index ebc2e56a..00000000 --- a/docker-files/Dockerfile.ubi +++ /dev/null @@ -1,46 +0,0 @@ -# -# -# Copyright © 2020-2025 Dell Inc. or its subsidiaries. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# - -# Dockerfile to build PowerStore CSI Driver -# based on standard UBI image -# Requires: RHEL host with subscription -FROM registry.access.redhat.com/ubi8/ubi:latest - -LABEL vendor="Dell Inc." \ - name="csi-powerstore" \ - summary="CSI Driver for Dell EMC PowerStore" \ - description="CSI Driver for provisioning persistent storage from Dell EMC PowerStore" \ - version="2.13.0" \ - license="Apache-2.0" - -COPY licenses /licenses - -# dependencies, following by cleaning the cache -RUN yum update -y \ - && \ - yum install -y e2fsprogs xfsprogs nfs-utils nfs4-acl-tools acl which device-mapper-multipath \ - && \ - yum clean all \ - && \ - rm -rf /var/cache/run - -# validate some cli utilities are found -RUN which mkfs.ext4 -RUN which mkfs.xfs -RUN echo "export PATH=$PATH:/sbin:/bin" > /etc/profile.d/ubuntu_path.sh - -COPY "csi-powerstore" . -ENTRYPOINT ["/csi-powerstore"] diff --git a/docker-files/Dockerfile.ubi.alt b/docker-files/Dockerfile.ubi.alt deleted file mode 100644 index a15ebf8e..00000000 --- a/docker-files/Dockerfile.ubi.alt +++ /dev/null @@ -1,59 +0,0 @@ -# -# -# Copyright © 2020-2025 Dell Inc. or its subsidiaries. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# - -# Dockerfile to build PowerStore CSI Driver -# based on UBI standard image. -# Alternative way without RHEL host/subscription, using centos.repo -FROM registry.access.redhat.com/ubi8/ubi-minimal:8.7-1085 - -LABEL vendor="Dell Inc." \ - name="csi-powerstore" \ - summary="CSI Driver for Dell EMC PowerStore" \ - description="CSI Driver for provisioning persistent storage from Dell EMC PowerStore" \ - version="2.13.0" \ - license="Apache-2.0" - -COPY licenses /licenses - -# Adding Centos.repo file -RUN echo $'[centos] \n\ -name=centos \n\ -baseurl=http://mirror.centos.org/centos-8/8/BaseOS/x86_64/os \n\ -enabled=1 \n\ -gpgcheck=0' > /etc/yum.repos.d/centos.repo - -# dependencies, following by cleaning the cache -RUN yum -y update && \ - yum -y install \ - e2fsprogs.x86_64 \ - xfsprogs.x86_64 \ - nfs-utils.x86_64 \ - nfs4-acl-tools \ - acl \ - which \ - device-mapper-multipath \ - && \ - yum clean all \ - && \ - rm -rf /var/cache/run - -# validate some cli utilities are found -RUN which mke2fs -RUN which mkfs.xfs -RUN echo "export PATH=$PATH:/sbin:/bin" > /etc/profile.d/ubuntu_path.sh - -COPY "csi-powerstore" . -ENTRYPOINT ["/csi-powerstore"] diff --git a/docker-files/Dockerfile.ubi.min b/docker-files/Dockerfile.ubi.min deleted file mode 100644 index 4c7adce6..00000000 --- a/docker-files/Dockerfile.ubi.min +++ /dev/null @@ -1,52 +0,0 @@ -# -# -# Copyright © 2020-2025 Dell Inc. or its subsidiaries. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# - -# Dockerfile to build PowerStore CSI Driver -# based on UBI-minimal image -# Requires: RHEL host with subscription -# UBI Image: ubi8/ubi-minimal:8.7-1085 -FROM registry.access.redhat.com/ubi8/ubi-minimal@sha256:ab03679e683010d485ef0399e056b09a38d7843ba4a36ee7dec337dd0037f7a7 - -LABEL vendor="Dell Inc." \ - name="csi-powerstore" \ - summary="CSI Driver for Dell EMC PowerStore" \ - description="CSI Driver for provisioning persistent storage from Dell EMC PowerStore" \ - version="2.13.0" \ - license="Apache-2.0" - -COPY licenses /licenses - -# dependencies, following by cleaning the cache -RUN microdnf update -y \ - && \ - microdnf install -y \ - e2fsprogs \ - xfsprogs \ - nfs-utils \ - nfs4-acl-tools \ - acl \ - which \ - device-mapper-multipath \ - && \ - microdnf clean all - -# validate some cli utilities are found -RUN which mkfs.ext4 -RUN which mkfs.xfs -RUN echo "export PATH=$PATH:/sbin:/bin" > /etc/profile.d/ubuntu_path.sh - -COPY "csi-powerstore" . -ENTRYPOINT ["/csi-powerstore"] diff --git a/mocks/NodeLabelsModifier.go b/mocks/NodeLabelsModifier.go new file mode 100644 index 00000000..e36ef977 --- /dev/null +++ b/mocks/NodeLabelsModifier.go @@ -0,0 +1,66 @@ +/* + Copyright (c) 2025 Dell Inc, or its subsidiaries. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// NodeLabelsModifierInterface is an autogenerated mock type for the NodeLabelsModifierInterface type +type NodeLabelsModifierInterface struct { + mock.Mock +} + +// AddNVMeLabels provides a mock function with given fields: ctx, kubeNodeName +func (_m *NodeLabelsModifierInterface) AddNVMeLabels(ctx context.Context, kubeNodeName string, labelKey string, labelValue []string) error { + ret := _m.Called(ctx, kubeNodeName, labelKey, labelValue) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, []string) error); ok { + return rf(ctx, kubeNodeName, labelKey, labelValue) + } + + if rf, ok := ret.Get(0).(func(context.Context, string, string, []string)); ok { + rf(ctx, kubeNodeName, labelKey, labelValue) + } + + if rf, ok := ret.Get(0).(func(context.Context, string, string, []string) error); ok { + r0 = rf(ctx, kubeNodeName, labelKey, labelValue) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewNodeLabelsModifierInterface creates a new instance of NodeLabelsModifierInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewNodeLabelsModifierInterface(t interface { + mock.TestingT + Cleanup(func()) +}) *NodeLabelsModifierInterface { + mock := &NodeLabelsModifierInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/NodeLabelsRetriever.go b/mocks/NodeLabelsRetriever.go index 6c487c3e..d16dad98 100644 --- a/mocks/NodeLabelsRetriever.go +++ b/mocks/NodeLabelsRetriever.go @@ -1,5 +1,5 @@ /* - Copyright (c) 2023 Dell Inc, or its subsidiaries. + Copyright (c) 2023-2025 Dell Inc, or its subsidiaries. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,25 +59,25 @@ func (_m *NodeLabelsRetrieverInterface) BuildConfigFromFlags(masterURL string, k return r0, r1 } -// GetNVMeUUIDs provides a mock function with given fields: ctx, k8sclientset -func (_m *NodeLabelsRetrieverInterface) GetNVMeUUIDs(ctx context.Context, k8sclientset *kubernetes.Clientset) (map[string]string, error) { - ret := _m.Called(k8sclientset, ctx) +// GetNVMeUUIDs provides a mock function with given fields: ctx +func (_m *NodeLabelsRetrieverInterface) GetNVMeUUIDs(ctx context.Context) (map[string]string, error) { + ret := _m.Called(ctx) var r0 map[string]string var r1 error - if rf, ok := ret.Get(0).(func(*kubernetes.Clientset, context.Context) (map[string]string, error)); ok { - return rf(k8sclientset, ctx) + if rf, ok := ret.Get(0).(func(context.Context) (map[string]string, error)); ok { + return rf(ctx) } - if rf, ok := ret.Get(0).(func(*kubernetes.Clientset, context.Context) map[string]string); ok { - r0 = rf(k8sclientset, ctx) + if rf, ok := ret.Get(0).(func(context.Context) map[string]string); ok { + r0 = rf(ctx) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(map[string]string) } } - if rf, ok := ret.Get(1).(func(*kubernetes.Clientset, context.Context) error); ok { - r1 = rf(k8sclientset, ctx) + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) } else { r1 = ret.Error(1) } @@ -85,25 +85,25 @@ func (_m *NodeLabelsRetrieverInterface) GetNVMeUUIDs(ctx context.Context, k8scli return r0, r1 } -// GetNodeLabels provides a mock function with given fields: ctx, k8sclientset, kubeNodeName -func (_m *NodeLabelsRetrieverInterface) GetNodeLabels(ctx context.Context, k8sclientset *kubernetes.Clientset, kubeNodeName string) (map[string]string, error) { - ret := _m.Called(k8sclientset, ctx, kubeNodeName) +// GetNodeLabels provides a mock function with given fields: ctx, kubeNodeName +func (_m *NodeLabelsRetrieverInterface) GetNodeLabels(ctx context.Context, kubeNodeName string) (map[string]string, error) { + ret := _m.Called(ctx, kubeNodeName) var r0 map[string]string var r1 error - if rf, ok := ret.Get(0).(func(*kubernetes.Clientset, context.Context, string) (map[string]string, error)); ok { - return rf(k8sclientset, ctx, kubeNodeName) + if rf, ok := ret.Get(0).(func(context.Context, string) (map[string]string, error)); ok { + return rf(ctx, kubeNodeName) } - if rf, ok := ret.Get(0).(func(*kubernetes.Clientset, context.Context, string) map[string]string); ok { - r0 = rf(k8sclientset, ctx, kubeNodeName) + if rf, ok := ret.Get(0).(func(context.Context, string) map[string]string); ok { + r0 = rf(ctx, kubeNodeName) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(map[string]string) } } - if rf, ok := ret.Get(1).(func(*kubernetes.Clientset, context.Context, string) error); ok { - r1 = rf(k8sclientset, ctx, kubeNodeName) + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, kubeNodeName) } else { r1 = ret.Error(1) } diff --git a/pkg/common/k8sutils/k8sutils.go b/pkg/common/k8sutils/k8sutils.go index 798118cd..f2d8ce54 100644 --- a/pkg/common/k8sutils/k8sutils.go +++ b/pkg/common/k8sutils/k8sutils.go @@ -1,5 +1,5 @@ /* - Copyright (c) 2023 Dell Inc, or its subsidiaries. + Copyright (c) 2023-2025 Dell Inc, or its subsidiaries. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32,13 +32,13 @@ type NodeLabelsRetrieverInterface interface { BuildConfigFromFlags(masterURL, kubeconfig string) (*rest.Config, error) InClusterConfig() (*rest.Config, error) NewForConfig(config *rest.Config) (*kubernetes.Clientset, error) - GetNodeLabels(ctx context.Context, k8sclientset *kubernetes.Clientset, kubeNodeName string) (map[string]string, error) - GetNVMeUUIDs(ctx context.Context, k8sclientset *kubernetes.Clientset) (map[string]string, error) + GetNodeLabels(ctx context.Context, kubeNodeName string) (map[string]string, error) + GetNVMeUUIDs(ctx context.Context) (map[string]string, error) } // NodeLabelsModifierInterface defines the methods for retrieving Kubernetes Node Labels type NodeLabelsModifierInterface interface { - AddNVMeLabels(ctx context.Context, k8sclientset *kubernetes.Clientset, kubeNodeName string, labelKey string, labelValue []string) error + AddNVMeLabels(ctx context.Context, kubeNodeName string, labelKey string, labelValue []string) error } // NodeLabelsRetrieverImpl provided the implementation for NodeLabelsRetrieverInterface @@ -47,10 +47,12 @@ type NodeLabelsRetrieverImpl struct{} // NodeLabelsModifierImpl provides the implementation for NodeLabelsModifierInterface type NodeLabelsModifierImpl struct{} -// NodeLabelsRetriever is the actual instance of NodeLabelsRetrieverInterface which is used to retrieve the node labels var ( + // NodeLabelsRetriever is the actual instance of NodeLabelsRetrieverInterface which is used to retrieve the node labels NodeLabelsRetriever NodeLabelsRetrieverInterface NodeLabelsModifier NodeLabelsModifierInterface + // Kube Clientset + Clientset kubernetes.Interface ) func init() { @@ -74,9 +76,9 @@ func (svc *NodeLabelsRetrieverImpl) NewForConfig(config *rest.Config) (*kubernet } // GetNodeLabels retrieves the kubernetes node object and returns its labels -func (svc *NodeLabelsRetrieverImpl) GetNodeLabels(ctx context.Context, k8sclientset *kubernetes.Clientset, kubeNodeName string) (map[string]string, error) { - if k8sclientset != nil { - node, err := k8sclientset.CoreV1().Nodes().Get(ctx, kubeNodeName, v1.GetOptions{}) +func (svc *NodeLabelsRetrieverImpl) GetNodeLabels(ctx context.Context, kubeNodeName string) (map[string]string, error) { + if Clientset != nil { + node, err := Clientset.CoreV1().Nodes().Get(ctx, kubeNodeName, v1.GetOptions{}) if err != nil { return nil, err } @@ -87,41 +89,39 @@ func (svc *NodeLabelsRetrieverImpl) GetNodeLabels(ctx context.Context, k8sclient return nil, nil } -// CreateKubeClientSet creates and returns kubeclient set -func CreateKubeClientSet(kubeconfig string) (*kubernetes.Clientset, error) { - var clientset *kubernetes.Clientset - if kubeconfig != "" { - config, err := NodeLabelsRetriever.BuildConfigFromFlags("", kubeconfig) - if err != nil { - return nil, err +// CreateKubeClientSet creates kubeclient set if not created already +func CreateKubeClientSet(kubeconfig string) error { + if Clientset == nil { + var config *rest.Config + var err error + if kubeconfig != "" { + config, err = NodeLabelsRetriever.BuildConfigFromFlags("", kubeconfig) + if err != nil { + return err + } + } else { + config, err = NodeLabelsRetriever.InClusterConfig() + if err != nil { + return err + } } // create the clientset - clientset, err = NodeLabelsRetriever.NewForConfig(config) - if err != nil { - return nil, err - } - } else { - config, err := NodeLabelsRetriever.InClusterConfig() + Clientset, err = NodeLabelsRetriever.NewForConfig(config) if err != nil { - return nil, err - } - // creates the clientset - clientset, err = NodeLabelsRetriever.NewForConfig(config) - if err != nil { - return nil, err + return err } } - return clientset, nil + return nil } // AddNVMeLabels adds a hostnqn uuid label to the specified Kubernetes node -func (svc *NodeLabelsModifierImpl) AddNVMeLabels(ctx context.Context, k8sclientset *kubernetes.Clientset, kubeNodeName string, labelKey string, labelValue []string) error { - if k8sclientset == nil { +func (svc *NodeLabelsModifierImpl) AddNVMeLabels(ctx context.Context, kubeNodeName string, labelKey string, labelValue []string) error { + if Clientset == nil { return fmt.Errorf("k8sclientset is nil") } // Get the current node - node, err := k8sclientset.CoreV1().Nodes().Get(ctx, kubeNodeName, v1.GetOptions{}) + node, err := Clientset.CoreV1().Nodes().Get(ctx, kubeNodeName, v1.GetOptions{}) if err != nil { return fmt.Errorf("failed to get node %s: %v", kubeNodeName, err.Error()) } @@ -142,7 +142,7 @@ func (svc *NodeLabelsModifierImpl) AddNVMeLabels(ctx context.Context, k8sclients // Update the node with the new labels node.Labels[labelKey] = strings.Join(uuids, ",") - _, err = k8sclientset.CoreV1().Nodes().Update(ctx, node, v1.UpdateOptions{}) + _, err = Clientset.CoreV1().Nodes().Update(ctx, node, v1.UpdateOptions{}) if err != nil { return fmt.Errorf("failed to update node %s labels: %v", kubeNodeName, err.Error()) } @@ -150,14 +150,14 @@ func (svc *NodeLabelsModifierImpl) AddNVMeLabels(ctx context.Context, k8sclients } // GetNVMeUUIDs returns map of hosts with their hostnqn uuids -func (svc *NodeLabelsRetrieverImpl) GetNVMeUUIDs(ctx context.Context, k8sclientset *kubernetes.Clientset) (map[string]string, error) { +func (svc *NodeLabelsRetrieverImpl) GetNVMeUUIDs(ctx context.Context) (map[string]string, error) { nodeUUIDs := make(map[string]string) - if k8sclientset == nil { + if Clientset == nil { return nodeUUIDs, fmt.Errorf("k8sclientset is nil") } // Retrieve the list of nodes - nodes, err := k8sclientset.CoreV1().Nodes().List(ctx, v1.ListOptions{}) + nodes, err := Clientset.CoreV1().Nodes().List(ctx, v1.ListOptions{}) if err != nil { return nodeUUIDs, fmt.Errorf("failed to get node list: %v", err.Error()) } @@ -175,30 +175,30 @@ func (svc *NodeLabelsRetrieverImpl) GetNVMeUUIDs(ctx context.Context, k8sclients // GetNodeLabels returns labels present in the k8s node func GetNodeLabels(ctx context.Context, kubeConfigPath string, kubeNodeName string) (map[string]string, error) { - k8sclientset, err := CreateKubeClientSet(kubeConfigPath) + err := CreateKubeClientSet(kubeConfigPath) if err != nil { return nil, err } - return NodeLabelsRetriever.GetNodeLabels(ctx, k8sclientset, kubeNodeName) + return NodeLabelsRetriever.GetNodeLabels(ctx, kubeNodeName) } // AddNVMeLabels adds a hostnqn uuid label in the k8s node func AddNVMeLabels(ctx context.Context, kubeConfigPath string, kubeNodeName string, labelKey string, labelValue []string) error { - k8sclientset, err := CreateKubeClientSet(kubeConfigPath) + err := CreateKubeClientSet(kubeConfigPath) if err != nil { return err } - return NodeLabelsModifier.AddNVMeLabels(ctx, k8sclientset, kubeNodeName, labelKey, labelValue) + return NodeLabelsModifier.AddNVMeLabels(ctx, kubeNodeName, labelKey, labelValue) } // GetNVMeUUIDs checks for duplicate hostnqn uuid labels in the k8s node func GetNVMeUUIDs(ctx context.Context, kubeConfigPath string) (map[string]string, error) { - k8sclientset, err := CreateKubeClientSet(kubeConfigPath) + err := CreateKubeClientSet(kubeConfigPath) if err != nil { return map[string]string{}, err } - return NodeLabelsRetriever.GetNVMeUUIDs(ctx, k8sclientset) + return NodeLabelsRetriever.GetNVMeUUIDs(ctx) } diff --git a/pkg/common/k8sutils/k8sutils_test.go b/pkg/common/k8sutils/k8sutils_test.go new file mode 100644 index 00000000..385f39b0 --- /dev/null +++ b/pkg/common/k8sutils/k8sutils_test.go @@ -0,0 +1,201 @@ +/* + * Copyright © 2025 Dell Inc. or its subsidiaries. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package k8sutils_test + +import ( + "context" + "errors" + "testing" + + "github.com/dell/csi-powerstore/v2/mocks" + "github.com/dell/csi-powerstore/v2/pkg/common/k8sutils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/fake" +) + +func GetMockNodeWithLabels() *corev1.Node { + return &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + Labels: map[string]string{ + "max-powerstore-volumes-per-node": "2", + "hostnqn-uuid": "uuid1", + }, + }, + } +} + +func GetMockNodeWithoutLabels() *corev1.Node { + return &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node1", + }, + } +} + +func TestUtilFunctions(t *testing.T) { + nodeLabelsRetriever := &k8sutils.NodeLabelsRetrieverImpl{} + nodeLabelsModifier := &k8sutils.NodeLabelsModifierImpl{} + t.Run("GetNodeLabels", func(t *testing.T) { + k8sutils.Clientset = fake.NewClientset(GetMockNodeWithLabels()) + + labels, err := nodeLabelsRetriever.GetNodeLabels(context.Background(), "node1") + + assert.NoError(t, err) + assert.Equal(t, map[string]string{"max-powerstore-volumes-per-node": "2", "hostnqn-uuid": "uuid1"}, labels) + }) + + t.Run("GetNVMeUUIDs", func(t *testing.T) { + k8sutils.Clientset = fake.NewClientset(GetMockNodeWithLabels()) + + nodeUUIDs, err := nodeLabelsRetriever.GetNVMeUUIDs(context.Background()) + + assert.NoError(t, err) + assert.Equal(t, map[string]string{"node1": "uuid1"}, nodeUUIDs) + }) + + t.Run("AddNVMeLabels", func(t *testing.T) { + k8sutils.Clientset = fake.NewClientset(GetMockNodeWithoutLabels()) + + err := nodeLabelsModifier.AddNVMeLabels(context.Background(), "node1", "hostnqn", []string{"nqn.2025-mm.nvmexpress:uuid:xxxx-yyyy-zzzz"}) + + assert.NoError(t, err) + // Assert the node labels in the fake client set + node, err := k8sutils.Clientset.CoreV1().Nodes().Get(context.Background(), "node1", metav1.GetOptions{}) + assert.NoError(t, err) + assert.Equal(t, map[string]string{"hostnqn": "xxxx-yyyy-zzzz"}, node.Labels) + }) +} + +func TestUtilFunctions_Error(t *testing.T) { + nodeLabelsRetriever := &k8sutils.NodeLabelsRetrieverImpl{} + nodeLabelsModifier := &k8sutils.NodeLabelsModifierImpl{} + t.Run("GetNodeLabels error", func(t *testing.T) { + k8sutils.Clientset = fake.NewClientset() + + labels, err := nodeLabelsRetriever.GetNodeLabels(context.Background(), "node1") + + assert.Error(t, err) + assert.Nil(t, labels) + }) + + t.Run("GetNVMeUUIDs error", func(t *testing.T) { + k8sutils.Clientset = nil + + _, err := nodeLabelsRetriever.GetNVMeUUIDs(context.Background()) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "k8sclientset is nil") + }) + + t.Run("AddNVMeLabels get error", func(t *testing.T) { + k8sutils.Clientset = fake.NewClientset() + + err := nodeLabelsModifier.AddNVMeLabels(context.Background(), "node1", "hostnqn", []string{"nqn.2025-mm.nvmexpress:uuid:xxxx-yyyy-zzzz"}) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "failed to get node") + }) + + t.Run("AddNVMeLabels error", func(t *testing.T) { + k8sutils.Clientset = nil + + err := nodeLabelsModifier.AddNVMeLabels(context.Background(), "node1", "hostnqn", []string{"nqn.2025-mm.nvmexpress:uuid:xxxx-yyyy-zzzz"}) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "k8sclientset is nil") + }) +} + +func TestNodeLabelRetrieverAndModifier(t *testing.T) { + retrieverMock := new(mocks.NodeLabelsRetrieverInterface) + k8sutils.NodeLabelsRetriever = retrieverMock + modifierMock := new(mocks.NodeLabelsModifierInterface) + k8sutils.NodeLabelsModifier = modifierMock + + retrieverMock.On("InClusterConfig", mock.Anything).Return(nil, nil) + retrieverMock.On("BuildConfigFromFlags", mock.Anything, mock.Anything).Return(nil, nil) + retrieverMock.On("NewForConfig", mock.Anything).Return(nil, nil) + + t.Run("GetNodeLabels", func(t *testing.T) { + retrieverMock.On("GetNodeLabels", mock.Anything, mock.Anything, mock.Anything).Return( + map[string]string{"max-powerstore-volumes-per-node": "2"}, nil) + + labels, err := k8sutils.GetNodeLabels(context.Background(), "", "test-node") + + assert.NoError(t, err) + assert.Equal(t, map[string]string{"max-powerstore-volumes-per-node": "2"}, labels) + }) + + t.Run("GetNVMeUUIDs", func(t *testing.T) { + retrieverMock.On("GetNVMeUUIDs", mock.Anything, mock.Anything).Return( + map[string]string{"node1": "uuid1", "node2": "uuid2"}, nil) + + nodeUUIDs, err := k8sutils.GetNVMeUUIDs(context.Background(), "") + + assert.NoError(t, err) + assert.Equal(t, map[string]string{"node1": "uuid1", "node2": "uuid2"}, nodeUUIDs) + }) + + t.Run("AddNVMeLabels", func(t *testing.T) { + modifierMock.On("AddNVMeLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) + + err := k8sutils.AddNVMeLabels(context.Background(), "/config/path", "test-node", "max-powerstore-volumes-per-node", []string{"2"}) + + assert.NoError(t, err) + }) +} + +func TestNodeLabelRetriever_ConfigError(t *testing.T) { + k8sutils.Clientset = nil + retrieverMock := new(mocks.NodeLabelsRetrieverInterface) + k8sutils.NodeLabelsRetriever = retrieverMock + retrieverMock.On("InClusterConfig", mock.Anything).Return(nil, errors.New("Unable to create kubeclientset")) + retrieverMock.On("BuildConfigFromFlags", mock.Anything, mock.Anything).Return(nil, errors.New("Unable to build config")) + + t.Run("GetNodeLabels error", func(t *testing.T) { + _, err := k8sutils.GetNodeLabels(context.Background(), "", "test-node") + + assert.Error(t, err) + assert.Contains(t, err.Error(), "Unable to create kubeclientset") + }) + + t.Run("AddNVMeLabels error", func(t *testing.T) { + err := k8sutils.AddNVMeLabels(context.Background(), "/config/path", "test-node", "max-powerstore-volumes-per-node", []string{"2"}) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "Unable to build config") + }) +} + +func TestNodeLabelRetriever_CreateError(t *testing.T) { + k8sutils.Clientset = nil + retrieverMock := new(mocks.NodeLabelsRetrieverInterface) + k8sutils.NodeLabelsRetriever = retrieverMock + retrieverMock.On("InClusterConfig", mock.Anything).Return(nil, nil) + retrieverMock.On("NewForConfig", mock.Anything).Return(nil, errors.New("Unable to create kubeclientset")) + + t.Run("GetNVMeUUIDs error", func(t *testing.T) { + _, err := k8sutils.GetNVMeUUIDs(context.Background(), "") + + assert.Error(t, err) + assert.Contains(t, err.Error(), "Unable to create kubeclientset") + }) +} diff --git a/pkg/node/node_test.go b/pkg/node/node_test.go index 606834a0..5ab81399 100644 --- a/pkg/node/node_test.go +++ b/pkg/node/node_test.go @@ -1,6 +1,6 @@ /* * - * Copyright © 2021-2024 Dell Inc. or its subsidiaries. All Rights Reserved. + * Copyright © 2021-2025 Dell Inc. or its subsidiaries. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,6 +62,7 @@ var ( iscsiLibMock *goiscsi.MockISCSI nvmeLibMock *gonvme.MockNVMe nodeLabelsRetrieverMock *mocks.NodeLabelsRetrieverInterface + nodeLabelsModifierMock *mocks.NodeLabelsModifierInterface ) const ( @@ -239,7 +240,8 @@ func setVariables() { nvmeLibMock = gonvme.NewMockNVMe(nil) nodeLabelsRetrieverMock = new(mocks.NodeLabelsRetrieverInterface) k8sutils.NodeLabelsRetriever = nodeLabelsRetrieverMock - + nodeLabelsModifierMock = new(mocks.NodeLabelsModifierInterface) + k8sutils.NodeLabelsModifier = nodeLabelsModifierMock arrays := getTestArrays() nodeSvc = &Service{ @@ -270,12 +272,13 @@ func setVariables() { nodeSvc.SetDefaultArray(arrays[firstValidIP]) } -func setDefaultNodeLabelsRetrieverMock() { +func setDefaultNodeLabelsMock() { nodeLabelsRetrieverMock.On("BuildConfigFromFlags", mock.Anything, mock.Anything).Return(nil, nil) - nodeLabelsRetrieverMock.On("GetNodeLabels", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil) + nodeLabelsRetrieverMock.On("GetNodeLabels", mock.Anything, mock.Anything).Return(nil, nil) nodeLabelsRetrieverMock.On("InClusterConfig", mock.Anything).Return(nil, nil) nodeLabelsRetrieverMock.On("NewForConfig", mock.Anything).Return(nil, nil) - nodeLabelsRetrieverMock.On("GetNVMeUUIDs", mock.Anything, mock.Anything).Return(nil, nil) + nodeLabelsRetrieverMock.On("GetNVMeUUIDs", mock.Anything).Return(nil, nil) + nodeLabelsModifierMock.On("AddNVMeLabels", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) } var _ = ginkgo.Describe("CSINodeService", func() { @@ -320,7 +323,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() nodeSvc.opts.NodeNamePrefix = "" err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -332,7 +335,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { nodeSvc.nodeID = "" fsMock.On("ReadFile", mock.Anything).Return([]byte("my-host-id"), errors.New("no such file")) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err.Error()).To(gomega.ContainSubstring("no such file")) @@ -372,7 +375,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }}, nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() nodeSvc.opts.NodeNamePrefix = "" err := nodeSvc.Init() gomega.Expect(err.Error()).To(gomega.ContainSubstring("Could not connect to PowerStore array")) @@ -412,7 +415,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }}, nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() nodeSvc.opts.NodeNamePrefix = "" err := nodeSvc.Init() gomega.Expect(err.Error()).To(gomega.ContainSubstring("node name prefix is too long")) @@ -444,7 +447,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }, Name: "host-name", }, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) }) @@ -469,7 +472,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("ModifyHost", mock.Anything, mock.Anything, "host-id"). Return(gopowerstore.CreateResponse{}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -509,7 +512,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }}, nil) clientMock.On("ModifyHost", mock.Anything, mock.Anything, "host-id"). Return(gopowerstore.CreateResponse{ID: "host-id"}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -549,7 +552,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }}, nil) clientMock.On("ModifyHost", mock.Anything, mock.Anything, "host-id"). Return(gopowerstore.CreateResponse{ID: "host-id"}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -600,7 +603,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -646,7 +649,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -671,7 +674,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { nodeSvc.opts.KubeNodeName = common.EnvKubeNodeName nodeSvc.opts.KubeConfigPath = common.EnvKubeConfigPath - nodeLabelsRetrieverMock.On("GetNVMeUUIDs", mock.Anything, mock.Anything).Return( + nodeLabelsRetrieverMock.On("GetNVMeUUIDs", mock.Anything).Return( map[string]string{ "node1": "duplicate-uuid", "node2": "duplicate-uuid", @@ -700,7 +703,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -742,7 +745,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -786,7 +789,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() err := nodeSvc.Init() gomega.Expect(err).To(gomega.BeNil()) @@ -832,7 +835,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() nodeSvc.Arrays()[firstValidIP].BlockProtocol = "default_protocol" @@ -3681,7 +3684,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -3718,7 +3721,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { nil, ) nodeLabelsRetrieverMock.On("BuildConfigFromFlags", mock.Anything, mock.Anything).Return(nil, nil) - nodeLabelsRetrieverMock.On("GetNodeLabels", mock.Anything, mock.Anything, mock.Anything).Return(map[string]string{"max-powerstore-volumes-per-node": "2"}, nil) + nodeLabelsRetrieverMock.On("GetNodeLabels", mock.Anything, mock.Anything).Return(map[string]string{"max-powerstore-volumes-per-node": "2"}, nil) nodeLabelsRetrieverMock.On("InClusterConfig", mock.Anything).Return(nil, nil) nodeLabelsRetrieverMock.On("NewForConfig", mock.Anything).Return(nil, nil) @@ -3757,7 +3760,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { nil, ) nodeLabelsRetrieverMock.On("BuildConfigFromFlags", mock.Anything, mock.Anything).Return(nil, nil) - nodeLabelsRetrieverMock.On("GetNodeLabels", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil) + nodeLabelsRetrieverMock.On("GetNodeLabels", mock.Anything, mock.Anything).Return(nil, nil) nodeLabelsRetrieverMock.On("InClusterConfig", mock.Anything).Return(nil, errors.New("Unable to create kubeclientset")) nodeLabelsRetrieverMock.On("NewForConfig", mock.Anything).Return(nil, nil) @@ -3795,7 +3798,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() nodeSvc.opts.MaxVolumesPerNode = 2 res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) @@ -3832,7 +3835,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -3859,7 +3862,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) @@ -3894,7 +3897,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -3945,7 +3948,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }, Name: "host-name", }, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -3998,7 +4001,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }, Name: "host-name", }, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4051,7 +4054,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }, Name: "host-name", }, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4080,7 +4083,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4111,7 +4114,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4151,7 +4154,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { }, Name: "host-name", }, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4191,7 +4194,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4229,7 +4232,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4274,7 +4277,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4320,7 +4323,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4361,7 +4364,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { conn, nil, ) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() res, err := nodeSvc.NodeGetInfo(context.Background(), &csi.NodeGetInfoRequest{}) gomega.Expect(err).To(gomega.BeNil()) @@ -4419,7 +4422,7 @@ var _ = ginkgo.Describe("CSINodeService", func() { clientMock.On("SetCustomHTTPHeaders", mock.Anything).Return(nil) clientMock.On("CreateHost", mock.Anything, mock.Anything). Return(gopowerstore.CreateResponse{ID: validHostID}, nil) - setDefaultNodeLabelsRetrieverMock() + setDefaultNodeLabelsMock() nodeSvc.opts.NodeNamePrefix = "" nodeSvc.Init()