Skip to content

Commit a794d8d

Browse files
authored
Read MaxVolumesPerNode from env variable (#225)
* Read MaxVolumesPerNode from env variable * Fix typos * Fix log msg * Add UT Signed-off-by: Mayank Sachan <[email protected]> * Fix linter Signed-off-by: Mayank Sachan <[email protected]> * Fix UT Signed-off-by: Mayank Sachan <[email protected]> --------- Signed-off-by: Mayank Sachan <[email protected]>
1 parent 34c18c3 commit a794d8d

File tree

5 files changed

+268
-116
lines changed

5 files changed

+268
-116
lines changed

pkg/constants/constants.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ const (
4444

4545
BucketVersioning = "bucketVersioning"
4646

47-
IsNodeServer = "IS_NODE_SERVER"
48-
KubeNodeName = "KUBE_NODE_NAME"
47+
IsNodeServer = "IS_NODE_SERVER"
48+
KubeNodeName = "KUBE_NODE_NAME"
49+
MaxVolumesPerNodeEnv = "MAX_VOLUMES_PER_NODE"
4950
)
5051

5152
var (

pkg/driver/nodeserver.go

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ package driver
1212

1313
import (
1414
"fmt"
15-
"os"
1615

1716
"github.com/IBM/ibm-object-csi-driver/pkg/constants"
1817
"github.com/IBM/ibm-object-csi-driver/pkg/mounter"
@@ -29,12 +28,19 @@ import (
2928
type nodeServer struct {
3029
*S3Driver
3130
csi.UnimplementedNodeServer
32-
Stats utils.StatsUtils
33-
NodeID string
31+
Stats utils.StatsUtils
32+
NodeServerConfig
3433
Mounter mounter.NewMounterFactory
3534
MounterUtils mounterUtils.MounterUtils
3635
}
3736

37+
type NodeServerConfig struct {
38+
MaxVolumesPerNode int64
39+
Region string
40+
Zone string
41+
NodeID string
42+
}
43+
3844
func (ns *nodeServer) NodeStageVolume(_ context.Context, req *csi.NodeStageVolumeRequest) (*csi.NodeStageVolumeResponse, error) {
3945
klog.V(2).Infof("CSINodeServer-NodeStageVolume: Request %+v", req)
4046

@@ -286,28 +292,15 @@ func (ns *nodeServer) NodeGetCapabilities(_ context.Context, req *csi.NodeGetCap
286292
func (ns *nodeServer) NodeGetInfo(_ context.Context, req *csi.NodeGetInfoRequest) (*csi.NodeGetInfoResponse, error) {
287293
klog.V(3).Infof("NodeGetInfo: called with args %+v", req)
288294

289-
nodeName := os.Getenv(constants.KubeNodeName)
290-
if nodeName == "" {
291-
return nil, fmt.Errorf("KUBE_NODE_NAME env variable not set")
292-
}
293-
294-
region, zone, err := ns.Stats.GetRegionAndZone(nodeName)
295-
if err != nil {
296-
return nil, err
297-
}
298-
299-
klog.V(3).Infof("NodeGetInfo: Node region %s", region)
300-
klog.V(3).Infof("NodeGetInfo: Node zone %s", zone)
301-
302295
topology := &csi.Topology{
303296
Segments: map[string]string{
304-
constants.NodeRegionLabel: region,
305-
constants.NodeZoneLabel: zone,
297+
constants.NodeRegionLabel: ns.Region,
298+
constants.NodeZoneLabel: ns.Zone,
306299
},
307300
}
308301
resp := &csi.NodeGetInfoResponse{
309302
NodeId: ns.NodeID,
310-
MaxVolumesPerNode: constants.DefaultVolumesPerNode,
303+
MaxVolumesPerNode: ns.MaxVolumesPerNode,
311304
AccessibleTopology: topology,
312305
}
313306
klog.V(2).Info("NodeGetInfo: ", resp)

pkg/driver/nodeserver_test.go

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ package driver
1818

1919
import (
2020
"errors"
21-
"fmt"
22-
"os"
2321
"reflect"
2422
"testing"
2523

@@ -643,64 +641,46 @@ func TestNodeGetCapabilities(t *testing.T) {
643641
}
644642

645643
func TestNodeGetInfo(t *testing.T) {
644+
testMaxVolumesPerNode := int64(10)
645+
testRegion := "test-region"
646+
testZone := "test-zone"
647+
648+
nodeServer := nodeServer{
649+
NodeServerConfig: NodeServerConfig{
650+
MaxVolumesPerNode: testMaxVolumesPerNode,
651+
Region: testRegion,
652+
Zone: testZone,
653+
NodeID: testNodeID,
654+
},
655+
}
656+
646657
testCases := []struct {
647-
testCaseName string
648-
envKubeNodeName string
649-
driverStatsUtils utils.StatsUtils
650-
req *csi.NodeGetInfoRequest
651-
expectedResp *csi.NodeGetInfoResponse
652-
expectedErr error
658+
testCaseName string
659+
req *csi.NodeGetInfoRequest
660+
expectedResp *csi.NodeGetInfoResponse
661+
expectedErr error
653662
}{
654663
{
655-
testCaseName: "Positive: Successful",
656-
envKubeNodeName: testNodeID,
657-
req: &csi.NodeGetInfoRequest{},
658-
driverStatsUtils: utils.NewFakeStatsUtilsImpl(utils.FakeStatsUtilsFuncStruct{
659-
GetRegionAndZoneFn: func(nodeName string) (string, string, error) {
660-
return "test-region", "test-zone", nil
661-
},
662-
}),
664+
testCaseName: "Positive: Successful",
665+
req: &csi.NodeGetInfoRequest{},
663666
expectedResp: &csi.NodeGetInfoResponse{
664667
NodeId: testNodeID,
665-
MaxVolumesPerNode: constants.DefaultVolumesPerNode,
668+
MaxVolumesPerNode: testMaxVolumesPerNode,
666669
AccessibleTopology: &csi.Topology{
667670
Segments: map[string]string{
668-
constants.NodeRegionLabel: "test-region",
669-
constants.NodeZoneLabel: "test-zone",
671+
constants.NodeRegionLabel: testRegion,
672+
constants.NodeZoneLabel: testZone,
670673
},
671674
},
672675
},
673676
expectedErr: nil,
674677
},
675-
{
676-
testCaseName: "Negative: Failed to get KUBE_NODE_NAME env variable",
677-
envKubeNodeName: "",
678-
driverStatsUtils: &utils.DriverStatsUtils{},
679-
req: &csi.NodeGetInfoRequest{},
680-
expectedResp: nil,
681-
expectedErr: errors.New("KUBE_NODE_NAME env variable not set"),
682-
},
683-
{
684-
testCaseName: "Negative: Failed to get region and zone",
685-
envKubeNodeName: testNodeID,
686-
driverStatsUtils: &utils.DriverStatsUtils{},
687-
req: &csi.NodeGetInfoRequest{},
688-
expectedResp: nil,
689-
expectedErr: errors.New("unable to load in-cluster configuration"),
690-
},
691678
}
692679

693680
for _, tc := range testCases {
694681
t.Log("Testcase being executed", zap.String("testcase", tc.testCaseName))
695682

696-
_ = os.Setenv(constants.KubeNodeName, tc.envKubeNodeName)
697-
698-
nodeServer := nodeServer{
699-
NodeID: testNodeID,
700-
Stats: tc.driverStatsUtils,
701-
}
702683
actualResp, actualErr := nodeServer.NodeGetInfo(ctx, tc.req)
703-
fmt.Println(actualErr)
704684

705685
if tc.expectedErr != nil {
706686
assert.Error(t, actualErr)

pkg/driver/s3-driver.go

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ package driver
1212

1313
import (
1414
"fmt"
15+
"os"
16+
"strconv"
1517

1618
"github.com/IBM/ibm-csi-common/pkg/utils"
19+
"github.com/IBM/ibm-object-csi-driver/pkg/constants"
1720
"github.com/IBM/ibm-object-csi-driver/pkg/mounter"
1821
mounterUtils "github.com/IBM/ibm-object-csi-driver/pkg/mounter/utils"
1922
"github.com/IBM/ibm-object-csi-driver/pkg/s3client"
@@ -129,14 +132,36 @@ func newControllerServer(d *S3Driver, statsUtil pkgUtils.StatsUtils, s3cosSessio
129132
}
130133
}
131134

132-
func newNodeServer(d *S3Driver, statsUtil pkgUtils.StatsUtils, nodeID string, mountObj mounter.NewMounterFactory, mounterUtil mounterUtils.MounterUtils) *nodeServer {
133-
return &nodeServer{
134-
S3Driver: d,
135-
Stats: statsUtil,
136-
NodeID: nodeID,
137-
Mounter: mountObj,
138-
MounterUtils: mounterUtil,
135+
func newNodeServer(d *S3Driver, statsUtil pkgUtils.StatsUtils, nodeID string, mountObj mounter.NewMounterFactory, mounterUtil mounterUtils.MounterUtils) (*nodeServer, error) {
136+
nodeName := os.Getenv(constants.KubeNodeName)
137+
if nodeName == "" {
138+
return nil, fmt.Errorf("KUBE_NODE_NAME env variable not set")
139+
}
140+
141+
region, zone, err := statsUtil.GetRegionAndZone(nodeName)
142+
if err != nil {
143+
return nil, err
139144
}
145+
146+
var maxVolumesPerNode int64
147+
maxVolumesPerNodeStr := os.Getenv(constants.MaxVolumesPerNodeEnv)
148+
if maxVolumesPerNodeStr != "" {
149+
maxVolumesPerNode, err = strconv.ParseInt(maxVolumesPerNodeStr, 10, 64)
150+
if err != nil {
151+
return nil, err
152+
}
153+
} else {
154+
d.logger.Warn("MAX_VOLUMES_PER_NODE env variable not set. Using default value")
155+
maxVolumesPerNode = int64(constants.DefaultVolumesPerNode)
156+
}
157+
158+
return &nodeServer{
159+
S3Driver: d,
160+
Stats: statsUtil,
161+
NodeServerConfig: NodeServerConfig{MaxVolumesPerNode: maxVolumesPerNode, Region: region, Zone: zone, NodeID: nodeID},
162+
Mounter: mountObj,
163+
MounterUtils: mounterUtil,
164+
}, nil
140165
}
141166

142167
func (driver *S3Driver) NewS3CosDriver(nodeID string, endpoint string, s3cosSession s3client.ObjectStorageSessionFactory, mountObj mounter.NewMounterFactory, statsUtil pkgUtils.StatsUtils, mounterUtil mounterUtils.MounterUtils) (*S3Driver, error) {
@@ -158,13 +183,13 @@ func (driver *S3Driver) NewS3CosDriver(nodeID string, endpoint string, s3cosSess
158183
case "controller":
159184
driver.cs = newControllerServer(driver, statsUtil, s3cosSession, driver.logger)
160185
case "node":
161-
driver.ns = newNodeServer(driver, statsUtil, nodeID, mountObj, mounterUtil)
186+
driver.ns, err = newNodeServer(driver, statsUtil, nodeID, mountObj, mounterUtil)
162187
case "controller-node":
163188
driver.cs = newControllerServer(driver, statsUtil, s3cosSession, driver.logger)
164-
driver.ns = newNodeServer(driver, statsUtil, nodeID, mountObj, mounterUtil)
189+
driver.ns, err = newNodeServer(driver, statsUtil, nodeID, mountObj, mounterUtil)
165190
}
166191

167-
return driver, nil
192+
return driver, err
168193
}
169194

170195
func (driver *S3Driver) Run() {

0 commit comments

Comments
 (0)