Repository: kubernetes-sigs/gcp-compute-persistent-disk-csi-driver
Pull request #2037 (2025-04-03 04:46:17)

update cache logic to calculate chunk size based on total cache
<!--  Thanks for sending a pull request!  Here are some tips for you:

1. If this is your first time, please read our contributor guidelines: https://git.k8s.io/community/contributors/guide#your-first-contribution and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide
2. Follow the instructions for writing a release note: https://git.k8s.io/community/contributors/guide/release-notes.md
3. If the PR is unfinished, see how to mark it: https://git.k8s.io/community/contributors/guide/pull-requests.md#marking-unfinished-pull-requests
-->

**What type of PR is this?**
> Uncomment only one ` /kind <>` line, hit enter to put that in a new line, and remove leading whitespaces from that line:
>
> /kind api-change
/kind bug
> /kind cleanup
> /kind design
> /kind documentation
> /kind failing-test
> /kind feature
> /kind flake

**What this PR does / why we need it**:
Updates the logic to calculate chunk size for data cache
**Which issue(s) this PR fixes**:
<!--
*Automatically closes linked issue when PR is merged.
Usage: `Fixes #<issue number>`, or `Fixes (paste link of issue)`.
_If PR is about `failing-tests or flakes`, please post the related issues/tests in a comment and do not use `Fixes`_*
-->
Fixes #

**Special notes for your reviewer**:

**Does this PR introduce a user-facing change?**:
<!--
If no, just write "NONE" in the release-note block below.
If yes, a release note is required:
Enter your extended release note in the block below. If the PR requires additional action from users switching to the new release, include the string "action required".
-->
```release-note
Updates the logic to calculate chunk size for data cache
```


k8s-ci-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2037#" title="Author self-approved">Sneha-at</a>*
**Once this PR has been reviewed and has the lgtm label**, please assign [pwschuurman](https://github.com/pwschuurman) for approval. For more information see [the Code Review Process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process).

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=kubernetes-sigs%2Fgcp-compute-persistent-disk-csi-driver).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/blob/master/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["pwschuurman"]} -->
k8s-ci-robot: @Sneha-at: The following test **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-gcp-compute-persistent-disk-csi-driver-e2e | ed2a3422b46c5c99a2c921ec86e758ed3233ce0f | [link](https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/kubernetes-sigs_gcp-compute-persistent-disk-csi-driver/2037/pull-gcp-compute-persistent-disk-csi-driver-e2e/1907655879608504320) | true | `/test pull-gcp-compute-persistent-disk-csi-driver-e2e`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=gcp-compute-persistent-disk-csi-driver&pr=2037). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3ASneha-at). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
k8s-ci-robot: @Sneha-at: The following tests **failed**, say `/retest` to rerun all failed tests or `/retest-required` to rerun all mandatory failed tests:

Test name | Commit | Details | Required | Rerun command
--- | --- | --- | --- | ---
pull-gcp-compute-persistent-disk-csi-driver-e2e | ed2a3422b46c5c99a2c921ec86e758ed3233ce0f | [link](https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/kubernetes-sigs_gcp-compute-persistent-disk-csi-driver/2037/pull-gcp-compute-persistent-disk-csi-driver-e2e/1907655879608504320) | true | `/test pull-gcp-compute-persistent-disk-csi-driver-e2e`
pull-gcp-compute-persistent-disk-csi-driver-e2e-windows-2019 | 884b4725cee4f34ada65965b6966089c3411ea34 | [link](https://prow.k8s.io/view/gs/kubernetes-ci-logs/pr-logs/pull/kubernetes-sigs_gcp-compute-persistent-disk-csi-driver/2037/pull-gcp-compute-persistent-disk-csi-driver-e2e-windows-2019/1907789398703869952) | false | `/test pull-gcp-compute-persistent-disk-csi-driver-e2e-windows-2019`

[Full PR test history](https://prow.k8s.io/pr-history?org=kubernetes-sigs&repo=gcp-compute-persistent-disk-csi-driver&pr=2037). [Your PR dashboard](https://prow.k8s.io/pr?query=is%3Apr%20state%3Aopen%20author%3ASneha-at). Please help us cut down on flakes by [linking to](https://git.k8s.io/community/contributors/devel/sig-testing/flaky-tests.md#filing-issues-for-flaky-tests) an [open issue](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/issues?q=is:issue+is:open) when you hit one in your PR.

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
Sneha-at: /cherry-pick release-1.17
k8s-infra-cherrypick-robot: @Sneha-at: once the present PR merges, I will cherry-pick it on top of `release-1.17` in a new PR and assign it to you.

<details>

In response to [this](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver/pull/2037#issuecomment-2775966672):

>/cherry-pick release-1.17


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>

Patch:
diff --git a/OWNERS b/OWNERS
index 35dc3c5f..fe7aae6e 100644
--- a/OWNERS
+++ b/OWNERS
@@ -7,7 +7,7 @@ reviewers:
   - sunnylovestiramisu
   - pwschuurman
   - tyuchn
-  - tonyzhc
+  - songjiaxun
 approvers:
   - amacaskill
   - leiyiz
@@ -17,6 +17,7 @@ approvers:
   - sunnylovestiramisu
   - pwschuurman
   - tyuchn
+  - songjiaxun
 emeritus_reviewers:
   - davidz627
   - jingxu97
diff --git a/deploy/kubernetes/base/controller/controller.yaml b/deploy/kubernetes/base/controller/controller.yaml
index 58c0f4d1..2a37539d 100644
--- a/deploy/kubernetes/base/controller/controller.yaml
+++ b/deploy/kubernetes/base/controller/controller.yaml
@@ -126,7 +126,6 @@ spec:
             - "--leader-election"
             - "--leader-election-namespace=$(PDCSI_NAMESPACE)"
             - "--timeout=300s"
-            - "--retry-interval-max=60s"
           env:
             - name: PDCSI_NAMESPACE
               valueFrom:
diff --git a/go.mod b/go.mod
index bcf75e4f..7bb77099 100644
--- a/go.mod
+++ b/go.mod
@@ -15,7 +15,7 @@ require (
 	github.com/google/uuid v1.6.0
 	github.com/googleapis/gax-go/v2 v2.12.4
 	github.com/hashicorp/golang-lru/v2 v2.0.7
-	github.com/kubernetes-csi/csi-proxy/client v1.2.1
+	github.com/kubernetes-csi/csi-proxy/client v1.2.0
 	github.com/kubernetes-csi/csi-test/v5 v5.3.1
 	github.com/onsi/ginkgo/v2 v2.22.2
 	github.com/onsi/gomega v1.36.2
diff --git a/go.sum b/go.sum
index 0feaadb5..c234295f 100644
--- a/go.sum
+++ b/go.sum
@@ -1034,8 +1034,8 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kubernetes-csi/csi-proxy/client v1.2.1 h1:6ApXTKp5Rhb+2PrPfnk6C+TDG7XwnWJ9/xmmq7iN5cw=
-github.com/kubernetes-csi/csi-proxy/client v1.2.1/go.mod h1:SfK4HVKQdMH5KrffivddAWgX5hl3P5KmnuOTBbDNboU=
+github.com/kubernetes-csi/csi-proxy/client v1.2.0 h1:8oagHPy7VHbHqu6iOyZyusUvGCyzbPg8OQQVh8e4Q3E=
+github.com/kubernetes-csi/csi-proxy/client v1.2.0/go.mod h1:SfK4HVKQdMH5KrffivddAWgX5hl3P5KmnuOTBbDNboU=
 github.com/kubernetes-csi/csi-test/v5 v5.3.1 h1:Wiukp1In+kif+BFo6q2ExjgB+MbrAz4jZWzGfijypuY=
 github.com/kubernetes-csi/csi-test/v5 v5.3.1/go.mod h1:7hA2cSYJ6T8CraEZPA6zqkLZwemjBD54XAnPsPC3VpA=
 github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs=
diff --git a/pkg/common/parameters.go b/pkg/common/parameters.go
index cd973b31..18cca76f 100644
--- a/pkg/common/parameters.go
+++ b/pkg/common/parameters.go
@@ -80,7 +80,6 @@ const (
 	DiskTypeHdHA = "hyperdisk-balanced-high-availability"
 	DiskTypeHdT  = "hyperdisk-throughput"
 	DiskTypeHdE  = "hyperdisk-extreme"
-	DiskTypeHdML = "hyperdisk-ml"
 )
 
 type DataCacheParameters struct {
diff --git a/pkg/gce-pd-csi-driver/cache.go b/pkg/gce-pd-csi-driver/cache.go
index 151f90c3..633ae473 100644
--- a/pkg/gce-pd-csi-driver/cache.go
+++ b/pkg/gce-pd-csi-driver/cache.go
@@ -175,10 +175,18 @@ func setupCaching(devicePath string, req *csi.NodeStageVolumeRequest, nodeId str
 		klog.V(4).Infof("Assuming valid data cache size and mode, resizing cache is not supported")
 	} else {
 		cacheSize := req.GetPublishContext()[common.ContextDataCacheSize]
-		chunkSize, err := fetchChunkSizeKiB(cacheSize)
+		maxChunkSizeStr := strconv.FormatInt(int64(maxChunkSize/KiB), 10)
+		var chunkSize string
+		cachePvSize, err := fetchPvSizeGiB()
 		if err != nil {
-			klog.Errorf("Errored to fetch cache size, verify the data-cache-size is valid: got %v, error: %q", cacheSize, err)
-			return mainDevicePath, err
+			klog.Errorf("Errored while fetching PV size, got %v, falling back to default chunkSize of %v", err, maxChunkSize)
+			chunkSize = maxChunkSizeStr
+		} else {
+			chunkSize, err = fetchChunkSizeKiB(cachePvSize)
+			if err != nil {
+				klog.Errorf("Errored to fetch cache size, verify the data-cache-size is valid: got %v, error: %q", chunkSize, err)
+				chunkSize = maxChunkSizeStr
+			}
 		}
 		// Check if LV exists
 		info, err = common.RunCommand("" /* pipedCmd */, nil /* pipedCmdArg */, "lvs", args...)
@@ -641,16 +649,8 @@ func watchDiskDetaches(watcher *fsnotify.Watcher, nodeName string, errorCh chan
 		case event := <-watcher.Events:
 			// In case of an event i.e. creation or deletion of any new PV, we update the VG metadata.
 			// This might include some non-LVM changes, no harm in updating metadata multiple times.
-			args := []string{
-				"--updatemetadata",
-				getVolumeGroupName(nodeName),
-			}
-			_, err := common.RunCommand("" /* pipedCmd */, nil /* pipedCmdArg */, "vgck", args...)
-			if err != nil {
-				klog.Errorf("Error updating volume group's metadata: %v", err)
-			}
 			reduceVolumeGroup(getVolumeGroupName(nodeName), true)
-			klog.V(2).Infof("disk attach/detach event %#v\n", event)
+			klog.V(6).Infof("disk attach/detach event %#v\n", event)
 		}
 	}
 }
@@ -682,3 +682,48 @@ func addRaidedLSSDToVg(vgName, lssdPath string) error {
 	}
 	return nil
 }
+
+func fetchPvSizeGiB() (string, error) {
+	args := []string{
+		"--select",
+		"-o",
+		"--noheadings",
+		"pv_size",
+		"--units=b",
+	}
+	// RAIDed device is always registered with its /dev/md127 equivalent in VG so cannot check it directly based on the RAIDed LSSD path which could be /dev/md/csi-driver-data-cache
+	info, err := common.RunCommand("grep" /* pipedCmd */, []string{"/dev/md"} /* pipedCmdArg */, "pvs", args...)
+	if err != nil {
+		return "", fmt.Errorf("errored while fetching PV size %v: %s", err, info)
+	}
+	infoString := strings.TrimSpace(string(info))
+	infoSlice := strings.Fields(infoString)
+	pvSize, err := fetchNumberGiB(infoSlice)
+	if err != nil {
+		return "", fmt.Errorf("Error fetching PV size for cache %v", err)
+	}
+	return pvSize, nil
+
+}
+
+func fetchNumberGiB(infoSlice []string) (string, error) {
+	re, err := regexp.Compile("^[0-9]+B$")
+	if err != nil {
+		return "", fmt.Errorf("Failed to compile regex match %v", err)
+	}
+	var pvSize string
+	for _, i := range infoSlice {
+		if re.MatchString(i) {
+			pvSize, err = strings.TrimSuffix(i, "B"), nil
+			if err != nil {
+				return "", fmt.Errorf("Failed to extract PV size %v", err)
+			}
+			break
+		}
+	}
+	pvSizeInt, err := strconv.ParseFloat(pvSize, 64)
+	if err != nil {
+		return "", fmt.Errorf("Error while fetching PV size for cache %v", err)
+	}
+	return strconv.FormatInt(int64(math.Ceil(pvSizeInt/GiB)), 10) + "GiB", nil
+}
diff --git a/pkg/gce-pd-csi-driver/controller.go b/pkg/gce-pd-csi-driver/controller.go
index dcb0e3c4..fcb1ddb6 100644
--- a/pkg/gce-pd-csi-driver/controller.go
+++ b/pkg/gce-pd-csi-driver/controller.go
@@ -232,7 +232,7 @@ var (
 		"nextPageToken",
 	}
 	listDisksFieldsWithUsers      = append(listDisksFieldsWithoutUsers, "items/users")
-	disksWithModifiableAccessMode = []string{common.DiskTypeHdML}
+	disksWithModifiableAccessMode = []string{"hyperdisk-ml"}
 	disksWithUnsettableAccessMode = map[string]bool{
 		common.DiskTypeHdE: true,
 		common.DiskTypeHdT: true,
@@ -374,8 +374,7 @@ func (gceCS *GCEControllerServer) createVolumeInternal(ctx context.Context, req
 
 	// Validate VolumeContentSource is set when access mode is read only
 	readonly, _ := getReadOnlyFromCapabilities(volumeCapabilities)
-
-	if readonly && req.GetVolumeContentSource() == nil && params.DiskType != common.DiskTypeHdML {
+	if readonly && req.GetVolumeContentSource() == nil {
 		return nil, status.Error(codes.InvalidArgument, "VolumeContentSource must be provided when AccessMode is set to read only")
 	}
 
@@ -486,19 +485,12 @@ func (gceCS *GCEControllerServer) createMultiZoneDisk(ctx context.Context, req *
 	}
 	defer gceCS.volumeLocks.Release(volumeID)
 
-	// If creating an empty disk (content source nil), always create RWO disks (when supported)
-	// This allows disks to be created as underlying RWO disks, so they can be hydrated.
-	accessMode := common.GCEReadWriteOnceAccessMode
-	if req.GetVolumeContentSource() != nil {
-		accessMode = common.GCEReadOnlyManyAccessMode
-	}
-
 	createDiskErrs := []error{}
 	createdDisks := make([]*gce.CloudDisk, 0, len(zones))
 	for _, zone := range zones {
 		volKey := meta.ZonalKey(req.GetName(), zone)
 		klog.V(4).Infof("Creating single zone disk for zone %q and volume: %v", zone, volKey)
-		disk, err := gceCS.createSingleDisk(ctx, req, params, volKey, []string{zone}, accessMode)
+		disk, err := gceCS.createSingleDisk(ctx, req, params, volKey, []string{zone})
 		if err != nil {
 			createDiskErrs = append(createDiskErrs, err)
 			continue
@@ -601,23 +593,11 @@ func (gceCS *GCEControllerServer) createSingleDeviceDisk(ctx context.Context, re
 	if err != nil {
 		return nil, common.LoggedError("Failed to convert volume key to volume ID: ", err)
 	}
-	accessMode, err := getAccessMode(req, params)
-	if err != nil {
-		return nil, common.LoggedError("Failed to get access mode: ", err)
-	}
-
-	// If creating an empty disk (content source nil), always create RWO disks (when supported)
-	// This allows disks to be created as underlying RWO disks, so they can be hydrated.
-	readonly, _ := getReadOnlyFromCapabilities(req.GetVolumeCapabilities())
-	if readonly && req.GetVolumeContentSource() == nil && params.DiskType == common.DiskTypeHdML {
-		accessMode = common.GCEReadWriteOnceAccessMode
-	}
-
 	if acquired := gceCS.volumeLocks.TryAcquire(volumeID); !acquired {
 		return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, volumeID)
 	}
 	defer gceCS.volumeLocks.Release(volumeID)
-	disk, err := gceCS.createSingleDisk(ctx, req, params, volKey, zones, accessMode)
+	disk, err := gceCS.createSingleDisk(ctx, req, params, volKey, zones)
 
 	if err != nil {
 		return nil, common.LoggedError("CreateVolume failed: %v", err)
@@ -626,36 +606,30 @@ func (gceCS *GCEControllerServer) createSingleDeviceDisk(ctx context.Context, re
 	return generateCreateVolumeResponseWithVolumeId(disk, zones, params, dataCacheParams, enableDataCache, volumeID), err
 }
 
-func getAccessMode(req *csi.CreateVolumeRequest, params common.DiskParameters) (string, error) {
+func (gceCS *GCEControllerServer) createSingleDisk(ctx context.Context, req *csi.CreateVolumeRequest, params common.DiskParameters, volKey *meta.Key, zones []string) (*gce.CloudDisk, error) {
+	capacityRange := req.GetCapacityRange()
+	capBytes, _ := getRequestCapacity(capacityRange)
 	readonly, _ := getReadOnlyFromCapabilities(req.GetVolumeCapabilities())
+	accessMode := ""
+	multiWriter := false
 	if common.IsHyperdisk(params.DiskType) {
 		if am, err := getHyperdiskAccessModeFromCapabilities(req.GetVolumeCapabilities()); err != nil {
-			return "", err
+			return nil, err
 		} else if disksWithUnsettableAccessMode[params.DiskType] {
 			// Disallow multi-attach for HdT and HdE. These checks were done in `createVolumeInternal`,
 			// but repeating them here future-proves us from possible refactors.
 			if am != common.GCEReadWriteOnceAccessMode {
-				return "", status.Errorf(codes.Internal, "")
+				return nil, status.Errorf(codes.Internal, "")
 			}
 		} else {
-			return am, nil
+			accessMode = am
 		}
+	} else {
+		multiWriter, _ = getMultiWriterFromCapabilities(req.GetVolumeCapabilities())
 	}
 
 	if readonly && slices.Contains(disksWithModifiableAccessMode, params.DiskType) {
-		return common.GCEReadOnlyManyAccessMode, nil
-	}
-
-	return "", nil
-}
-
-func (gceCS *GCEControllerServer) createSingleDisk(ctx context.Context, req *csi.CreateVolumeRequest, params common.DiskParameters, volKey *meta.Key, zones []string, accessMode string) (*gce.CloudDisk, error) {
-	capacityRange := req.GetCapacityRange()
-	capBytes, _ := getRequestCapacity(capacityRange)
-
-	multiWriter := false
-	if !common.IsHyperdisk(params.DiskType) {
-		multiWriter, _ = getMultiWriterFromCapabilities(req.GetVolumeCapabilities())
+		accessMode = common.GCEReadOnlyManyAccessMode
 	}
 
 	// Validate if disk already exists
diff --git a/vendor/modules.txt b/vendor/modules.txt
index eca8eb43..c0e003a7 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -197,7 +197,7 @@ github.com/josharian/intern
 # github.com/json-iterator/go v1.1.12
 ## explicit; go 1.12
 github.com/json-iterator/go
-# github.com/kubernetes-csi/csi-proxy/client v1.2.1
+# github.com/kubernetes-csi/csi-proxy/client v1.2.0
 ## explicit; go 1.16
 github.com/kubernetes-csi/csi-proxy/client
 github.com/kubernetes-csi/csi-proxy/client/api/disk/v1


Test patch:
diff --git a/pkg/gce-pd-csi-driver/cache_test.go b/pkg/gce-pd-csi-driver/cache_test.go
index 4574dde4..340c924a 100644
--- a/pkg/gce-pd-csi-driver/cache_test.go
+++ b/pkg/gce-pd-csi-driver/cache_test.go
@@ -55,3 +55,63 @@ func TestFetchChunkSizeKiB(t *testing.T) {
 	}
 
 }
+
+func TestFetchNumberGiB(t *testing.T) {
+	testCases := []struct {
+		name        string
+		stringInput []string
+		expOutput   string // Outputs value in GiB
+		expErr      bool
+	}{
+		{
+			name:        "valid input 1",
+			stringInput: []string{"5000000000B"},
+			expOutput:   "5GiB", //range defined in fetchChunkSizeKiB
+		},
+		{
+			name:        "valid input 2",
+			stringInput: []string{"375000000000B"}, // 1 LSSD attached
+			expOutput:   "350GiB",                  //range defined in fetchChunkSizeKiB
+		},
+		{
+			name:        "valid input 3",
+			stringInput: []string{"9000000000000B"}, // 24 LSSD attached
+			expOutput:   "8382GiB",                  //range defined in fetchChunkSizeKiB
+		},
+		{
+			name:        "valid input 4",
+			stringInput: []string{"Some text before ", "9000000000000B", "Some text after"}, // 24 LSSD attached
+			expOutput:   "8382GiB",                                                          //range defined in fetchChunkSizeKiB
+		},
+		{
+			name:        "invalid input 1",
+			stringInput: []string{"9000000000000"},
+			expErr:      true,
+		},
+		{
+			name:        "invalid input 2",
+			stringInput: []string{"A9000000000000B"},
+			expErr:      true,
+		},
+		{
+			name:        "valid input 5",
+			stringInput: []string{"900000B"}, // <1GiB gets rounded off to 0GiB
+			expOutput:   "1GiB",
+		},
+	}
+
+	for _, tc := range testCases {
+		v, err := fetchNumberGiB(tc.stringInput)
+		if err != nil {
+			if !tc.expErr {
+				t.Errorf("Errored %s", err)
+			}
+			continue
+		}
+		if v != tc.expOutput {
+			t.Errorf("Got %s want %s", v, tc.expOutput)
+		}
+
+	}
+
+}
diff --git a/pkg/gce-pd-csi-driver/controller_test.go b/pkg/gce-pd-csi-driver/controller_test.go
index f55d3352..30a508ae 100644
--- a/pkg/gce-pd-csi-driver/controller_test.go
+++ b/pkg/gce-pd-csi-driver/controller_test.go
@@ -1298,54 +1298,6 @@ func TestCreateVolumeArguments(t *testing.T) {
 			},
 			expErrCode: codes.InvalidArgument,
 		},
-		{
-			name: "err empty HdB ROX single-zone disk no content source",
-			req: &csi.CreateVolumeRequest{
-				Name:          name,
-				CapacityRange: stdCapRange,
-				VolumeCapabilities: []*csi.VolumeCapability{
-					{
-						AccessType: &csi.VolumeCapability_Mount{
-							Mount: &csi.VolumeCapability_MountVolume{},
-						},
-						AccessMode: &csi.VolumeCapability_AccessMode{
-							Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY,
-						},
-					},
-				},
-				Parameters: map[string]string{
-					common.ParameterKeyType: "hyperdisk-balanced",
-				},
-			},
-			expErrCode: codes.InvalidArgument,
-		},
-		{
-			name: "success empty HdML ROX single-zone disk no content source",
-			req: &csi.CreateVolumeRequest{
-				Name:          name,
-				CapacityRange: stdCapRange,
-				VolumeCapabilities: []*csi.VolumeCapability{
-					{
-						AccessType: &csi.VolumeCapability_Mount{
-							Mount: &csi.VolumeCapability_MountVolume{},
-						},
-						AccessMode: &csi.VolumeCapability_AccessMode{
-							Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY,
-						},
-					},
-				},
-				Parameters: map[string]string{
-					common.ParameterKeyType: "hyperdisk-ml",
-				},
-			},
-			expVol: &csi.Volume{
-				CapacityBytes:      common.GbToBytes(20),
-				VolumeId:           testVolumeID,
-				VolumeContext:      nil,
-				AccessibleTopology: stdTopology,
-			},
-			expErrCode: codes.OK,
-		},
 	}
 
 	// Run test cases
@@ -1366,7 +1318,6 @@ func TestCreateVolumeArguments(t *testing.T) {
 			}
 			continue
 		}
-		t.Logf("ErroCode: %v", err)
 		if tc.expErrCode != codes.OK {
 			t.Fatalf("Expected error: %v, got no error", tc.expErrCode)
 		}
@@ -1553,7 +1504,7 @@ func TestMultiZoneVolumeCreation(t *testing.T) {
 			expZones: []string{"us-central1-a", "us-central1-b", "us-central1-c"},
 		},
 		{
-			name: "success empty HdML ROX multi-zone disk no content source",
+			name: "err single ROX multi-zone no topology",
 			req: &csi.CreateVolumeRequest{
 				Name:          "test-name",
 				CapacityRange: stdCapRange,
@@ -1571,26 +1522,18 @@ func TestMultiZoneVolumeCreation(t *testing.T) {
 					common.ParameterKeyType:                        "hyperdisk-ml",
 					common.ParameterKeyEnableMultiZoneProvisioning: "true",
 				},
-				AccessibilityRequirements: &csi.TopologyRequirement{
-					Requisite: []*csi.Topology{
-						{
-							Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"},
-						},
-					},
-					Preferred: []*csi.Topology{
-						{
-							Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"},
-						},
-						{
-							Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"},
+				VolumeContentSource: &csi.VolumeContentSource{
+					Type: &csi.VolumeContentSource_Snapshot{
+						Snapshot: &csi.VolumeContentSource_SnapshotSource{
+							SnapshotId: testSnapshotID,
 						},
 					},
 				},
 			},
-			expZones: []string{"us-central1-a", "us-central1-b"},
+			expErrCode: codes.InvalidArgument,
 		},
 		{
-			name: "error empty HdB ROX multi-zone disk no content source",
+			name: "err rwo access mode",
 			req: &csi.CreateVolumeRequest{
 				Name:          "test-name",
 				CapacityRange: stdCapRange,
@@ -1600,14 +1543,21 @@ func TestMultiZoneVolumeCreation(t *testing.T) {
 							Mount: &csi.VolumeCapability_MountVolume{},
 						},
 						AccessMode: &csi.VolumeCapability_AccessMode{
-							Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY,
+							Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER,
 						},
 					},
 				},
 				Parameters: map[string]string{
-					common.ParameterKeyType:                        "hyperdisk-balanced",
+					common.ParameterKeyType:                        "hyperdisk-ml",
 					common.ParameterKeyEnableMultiZoneProvisioning: "true",
 				},
+				VolumeContentSource: &csi.VolumeContentSource{
+					Type: &csi.VolumeContentSource_Snapshot{
+						Snapshot: &csi.VolumeContentSource_SnapshotSource{
+							SnapshotId: testSnapshotID,
+						},
+					},
+				},
 				AccessibilityRequirements: &csi.TopologyRequirement{
 					Requisite: []*csi.Topology{
 						{
@@ -1618,16 +1568,13 @@ func TestMultiZoneVolumeCreation(t *testing.T) {
 						{
 							Segments: map[string]string{common.TopologyKeyZone: "us-central1-a"},
 						},
-						{
-							Segments: map[string]string{common.TopologyKeyZone: "us-central1-b"},
-						},
 					},
 				},
 			},
 			expErrCode: codes.InvalidArgument,
 		},
 		{
-			name: "err single ROX multi-zone no topology",
+			name: "err no content source",
 			req: &csi.CreateVolumeRequest{
 				Name:          "test-name",
 				CapacityRange: stdCapRange,
@@ -1645,42 +1592,6 @@ func TestMultiZoneVolumeCreation(t *testing.T) {
 					common.ParameterKeyType:                        "hyperdisk-ml",
 					common.ParameterKeyEnableMultiZoneProvisioning: "true",
 				},
-				VolumeContentSource: &csi.VolumeContentSource{
-					Type: &csi.VolumeContentSource_Snapshot{
-						Snapshot: &csi.VolumeContentSource_SnapshotSource{
-							SnapshotId: testSnapshotID,
-						},
-					},
-				},
-			},
-			expErrCode: codes.InvalidArgument,
-		},
-		{
-			name: "err rwo access mode",
-			req: &csi.CreateVolumeRequest{
-				Name:          "test-name",
-				CapacityRange: stdCapRange,
-				VolumeCapabilities: []*csi.VolumeCapability{
-					{
-						AccessType: &csi.VolumeCapability_Mount{
-							Mount: &csi.VolumeCapability_MountVolume{},
-						},
-						AccessMode: &csi.VolumeCapability_AccessMode{
-							Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER,
-						},
-					},
-				},
-				Parameters: map[string]string{
-					common.ParameterKeyType:                        "hyperdisk-ml",
-					common.ParameterKeyEnableMultiZoneProvisioning: "true",
-				},
-				VolumeContentSource: &csi.VolumeContentSource{
-					Type: &csi.VolumeContentSource_Snapshot{
-						Snapshot: &csi.VolumeContentSource_SnapshotSource{
-							SnapshotId: testSnapshotID,
-						},
-					},
-				},
 				AccessibilityRequirements: &csi.TopologyRequirement{
 					Requisite: []*csi.Topology{
 						{
diff --git a/test/e2e/tests/multi_zone_e2e_test.go b/test/e2e/tests/multi_zone_e2e_test.go
index c9b7fa6b..4a20b756 100644
--- a/test/e2e/tests/multi_zone_e2e_test.go
+++ b/test/e2e/tests/multi_zone_e2e_test.go
@@ -95,12 +95,14 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 	It("Should attach ROX 'multi-zone' PV instances to two separate VMs", func() {
 		checkSkipMultiZoneTests()
 
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
+		// Create new driver and client
+
+		Expect(testContexts).NotTo(BeEmpty())
 
 		zoneToContext := map[string]*remote.TestContext{}
 		zones := []string{}
 
-		for _, tc := range hyperdiskTestContexts {
+		for _, tc := range testContexts {
 			_, z, _ := tc.Instance.GetIdentity()
 			// Zone hasn't been seen before
 			if _, ok := zoneToContext[z]; !ok {
@@ -187,12 +189,14 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 	It("Should create RWO 'multi-zone' PV instances from a previously created disk", func() {
 		checkSkipMultiZoneTests()
 
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
+		// Create new driver and client
+
+		Expect(testContexts).NotTo(BeEmpty())
 
 		zoneToContext := map[string]*remote.TestContext{}
 		zones := []string{}
 
-		for _, tc := range hyperdiskTestContexts {
+		for _, tc := range testContexts {
 			_, z, _ := tc.Instance.GetIdentity()
 			// Zone hasn't been seen before
 			if _, ok := zoneToContext[z]; !ok {
@@ -285,13 +289,12 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 
 	It("Should create ROX 'multi-zone' PV from existing snapshot", func() {
 		checkSkipMultiZoneTests()
-
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
+		Expect(testContexts).NotTo(BeEmpty())
 
 		zoneToContext := map[string]*remote.TestContext{}
 		zones := []string{}
 
-		for _, tc := range hyperdiskTestContexts {
+		for _, tc := range testContexts {
 			_, z, _ := tc.Instance.GetIdentity()
 			// Zone hasn't been seen before
 			if _, ok := zoneToContext[z]; !ok {
@@ -314,7 +317,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 		tc0 := zoneToContext[zones[0]]
 		tc1 := zoneToContext[zones[1]]
 
-		snapshotVolName, snapshotVolID := createAndValidateUniqueZonalDisk(controllerClient, p, zones[0], ssdDiskType)
+		snapshotVolName, snapshotVolID := createAndValidateUniqueZonalDisk(controllerClient, p, zones[0], standardDiskType)
 
 		underSpecifiedID := common.GenerateUnderspecifiedVolumeID(snapshotVolName, true /* isZonal */)
 
@@ -433,13 +436,12 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 
 	It("Should create ROX 'multi-zone' PV from existing snapshot with no topology", func() {
 		checkSkipMultiZoneTests()
-
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
+		Expect(testContexts).NotTo(BeEmpty())
 
 		zoneToContext := map[string]*remote.TestContext{}
 		zones := []string{}
 
-		for _, tc := range hyperdiskTestContexts {
+		for _, tc := range testContexts {
 			_, z, _ := tc.Instance.GetIdentity()
 			// Zone hasn't been seen before
 			if _, ok := zoneToContext[z]; !ok {
@@ -462,7 +464,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 		tc0 := zoneToContext[zones[0]]
 		tc1 := zoneToContext[zones[1]]
 
-		snapshotVolName, snapshotVolID := createAndValidateUniqueZonalDisk(controllerClient, p, zones[0], ssdDiskType)
+		snapshotVolName, snapshotVolID := createAndValidateUniqueZonalDisk(controllerClient, p, zones[0], standardDiskType)
 
 		underSpecifiedID := common.GenerateUnderspecifiedVolumeID(snapshotVolName, true /* isZonal */)
 
@@ -572,13 +574,12 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 
 	It("Should create ROX 'multi-zone' PV from existing disk image", func() {
 		checkSkipMultiZoneTests()
-
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
+		Expect(testContexts).NotTo(BeEmpty())
 
 		zoneToContext := map[string]*remote.TestContext{}
 		zones := []string{}
 
-		for _, tc := range hyperdiskTestContexts {
+		for _, tc := range testContexts {
 			_, z, _ := tc.Instance.GetIdentity()
 			// Zone hasn't been seen before
 			if _, ok := zoneToContext[z]; !ok {
@@ -601,7 +602,7 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 		tc0 := zoneToContext[zones[0]]
 		tc1 := zoneToContext[zones[1]]
 
-		snapshotVolName, snapshotVolID := createAndValidateUniqueZonalDisk(controllerClient, p, zones[0], ssdDiskType)
+		snapshotVolName, snapshotVolID := createAndValidateUniqueZonalDisk(controllerClient, p, zones[0], standardDiskType)
 
 		underSpecifiedID := common.GenerateUnderspecifiedVolumeID(snapshotVolName, true /* isZonal */)
 
@@ -716,14 +717,13 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 
 	It("Should create RWO 'multi-zone' PV that has empty disks", func() {
 		checkSkipMultiZoneTests()
-
 		// Create new driver and client
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
+		Expect(testContexts).NotTo(BeEmpty())
 
 		zoneToContext := map[string]*remote.TestContext{}
 		zones := []string{}
 
-		for _, tc := range hyperdiskTestContexts {
+		for _, tc := range testContexts {
 			_, z, _ := tc.Instance.GetIdentity()
 			// Zone hasn't been seen before
 			if _, ok := zoneToContext[z]; !ok {
@@ -831,207 +831,6 @@ var _ = Describe("GCE PD CSI Driver Multi-Zone", func() {
 
 	})
 
-	It("Should create ROX 'multi-zone' PV that has empty disks in RWO mode", func() {
-		checkSkipMultiZoneTests()
-
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
-
-		zoneToContext := map[string]*remote.TestContext{}
-		zones := []string{}
-
-		for _, tc := range hyperdiskTestContexts {
-			_, z, _ := tc.Instance.GetIdentity()
-			// Zone hasn't been seen before
-			if _, ok := zoneToContext[z]; !ok {
-				zoneToContext[z] = tc
-				zones = append(zones, z)
-			}
-			if len(zoneToContext) == 2 {
-				break
-			}
-		}
-
-		Expect(len(zoneToContext)).To(Equal(2), "Must have instances in 2 zones")
-
-		controllerContext := zoneToContext[zones[0]]
-		controllerClient := controllerContext.Client
-		controllerInstance := controllerContext.Instance
-
-		p, _, _ := controllerInstance.GetIdentity()
-
-		// Attach disk to instance in the first zone.
-		tc0 := zoneToContext[zones[0]]
-		tc1 := zoneToContext[zones[1]]
-
-		// Create Disk
-		volName := testNamePrefix + string(uuid.NewUUID())
-		_, err := controllerClient.CreateVolumeWithCaps(volName, map[string]string{
-			common.ParameterKeyEnableMultiZoneProvisioning: "true",
-			common.ParameterKeyType:                        "hyperdisk-ml",
-		}, defaultHdmlSizeGb,
-			&csi.TopologyRequirement{
-				Requisite: []*csi.Topology{
-					{
-						Segments: map[string]string{common.TopologyKeyZone: zones[0]},
-					},
-					{
-						Segments: map[string]string{common.TopologyKeyZone: zones[1]},
-					},
-				},
-			},
-			[]*csi.VolumeCapability{
-				{
-					AccessType: &csi.VolumeCapability_Mount{
-						Mount: &csi.VolumeCapability_MountVolume{},
-					},
-					AccessMode: &csi.VolumeCapability_AccessMode{
-						Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY,
-					},
-				},
-			},
-			nil)
-		Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err)
-
-		volID := fmt.Sprintf("projects/%s/zones/multi-zone/disks/%s", p, volName)
-		defer func() {
-			// Delete Disk
-			err := controllerClient.DeleteVolume(volID)
-			Expect(err).To(BeNil(), "DeleteVolume failed")
-
-			// Validate Disk Deleted
-			_, err = computeService.Disks.Get(p, zones[0], volName).Do()
-			Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found. Err: %v", err)
-			_, err = computeService.Disks.Get(p, zones[1], volName).Do()
-			Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found. Err: %v", err)
-		}()
-
-		disk1, err := computeService.Disks.Get(p, zones[0], volName).Do()
-		Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[0], volName)
-		disk2, err := computeService.Disks.Get(p, zones[1], volName).Do()
-		Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[1], volName)
-
-		// Validate disks have multi-zone labels
-		Expect(disk1.Labels[common.MultiZoneLabel]).To(Equal("true"))
-		Expect(disk2.Labels[common.MultiZoneLabel]).To(Equal("true"))
-
-		// Validate disks are RWO
-		Expect(disk1.AccessMode).To(Equal("READ_WRITE_SINGLE"))
-		Expect(disk2.AccessMode).To(Equal("READ_WRITE_SINGLE"))
-
-		// Validate underlying disks can be used
-		volID0 := fmt.Sprintf("projects/%s/zones/%s/disks/%s", p, zones[0], volName)
-		volID1 := fmt.Sprintf("projects/%s/zones/%s/disks/%s", p, zones[1], volName)
-
-		err = testAttachWriteReadDetach(volID0, volName, tc0.Instance, tc0.Client, false /* readonly */, false /* detachAndReattach */, false /* setupDataCache */)
-		Expect(err).To(BeNil(), "Failed to attach/write/read/detach on vol1")
-
-		err = testAttachWriteReadDetach(volID1, volName, tc1.Instance, tc1.Client, false /* readonly */, false /* detachAndReattach */, false /* setupDataCache */)
-		Expect(err).To(BeNil(), "Failed to attach/write/read/detach on vol2")
-
-		// Validate disks can be used in multi-zone mode on both nodes
-		volIDMultiZone := fmt.Sprintf("projects/%s/zones/multi-zone/disks/%s", p, volName)
-		err = testAttachWriteReadDetach(volIDMultiZone, volName, tc0.Instance, tc0.Client, true /* readonly */, false /* detachAndReattach */, false /* setupDataCache */)
-		Expect(err).To(BeNil(), "Failed to attach/read/detach on vol1")
-
-		err = testAttachWriteReadDetach(volIDMultiZone, volName, tc1.Instance, tc1.Client, true /* readonly */, false /* detachAndReattach */, false /* setupDataCache */)
-		Expect(err).To(BeNil(), "Failed to attach/read/detach on vol2")
-
-		// Validate disks are ROX now
-		disk1, err = computeService.Disks.Get(p, zones[0], volName).Do()
-		Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[0], volName)
-		disk2, err = computeService.Disks.Get(p, zones[1], volName).Do()
-		Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[1], volName)
-
-		Expect(disk1.AccessMode).To(Equal("READ_ONLY_MANY"))
-		Expect(disk2.AccessMode).To(Equal("READ_ONLY_MANY"))
-	})
-
-	It("Should create ROX 'single-zone' PV that has empty disks in RWO mode", func() {
-		Expect(hyperdiskTestContexts).NotTo(BeEmpty())
-
-		zoneToContext := map[string]*remote.TestContext{}
-		zones := []string{}
-
-		for _, tc := range hyperdiskTestContexts {
-			_, z, _ := tc.Instance.GetIdentity()
-			// Zone hasn't been seen before
-			if _, ok := zoneToContext[z]; !ok {
-				zoneToContext[z] = tc
-				zones = append(zones, z)
-			}
-			if len(zoneToContext) == 2 {
-				break
-			}
-		}
-
-		controllerContext := zoneToContext[zones[0]]
-		controllerClient := controllerContext.Client
-		controllerInstance := controllerContext.Instance
-
-		p, _, _ := controllerInstance.GetIdentity()
-
-		// Attach disk to instance in the first zone.
-		tc0 := zoneToContext[zones[0]]
-
-		// Create Disk
-		volName := testNamePrefix + string(uuid.NewUUID())
-		_, err := controllerClient.CreateVolumeWithCaps(volName, map[string]string{
-			common.ParameterKeyType: "hyperdisk-ml",
-		}, defaultHdmlSizeGb,
-			&csi.TopologyRequirement{
-				Requisite: []*csi.Topology{
-					{
-						Segments: map[string]string{common.TopologyKeyZone: zones[0]},
-					},
-				},
-			},
-			[]*csi.VolumeCapability{
-				{
-					AccessType: &csi.VolumeCapability_Mount{
-						Mount: &csi.VolumeCapability_MountVolume{},
-					},
-					AccessMode: &csi.VolumeCapability_AccessMode{
-						Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY,
-					},
-				},
-			},
-			nil)
-		Expect(err).To(BeNil(), "CreateVolume failed with error: %v", err)
-
-		volID := fmt.Sprintf("projects/%s/zones/%s/disks/%s", p, zones[0], volName)
-		defer func() {
-			// Delete Disk
-			err := controllerClient.DeleteVolume(volID)
-			Expect(err).To(BeNil(), "DeleteVolume failed")
-
-			// Validate Disk Deleted
-			_, err = computeService.Disks.Get(p, zones[0], volName).Do()
-			Expect(gce.IsGCEError(err, "notFound")).To(BeTrue(), "Expected disk to not be found. Err: %v", err)
-		}()
-
-		disk1, err := computeService.Disks.Get(p, zones[0], volName).Do()
-		Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[0], volName)
-
-		// Validate disks are RWO
-		Expect(disk1.AccessMode).To(Equal("READ_WRITE_SINGLE"))
-
-		// Validate underlying disks can be used
-		volID1 := fmt.Sprintf("projects/%s/zones/%s/disks/%s", p, zones[0], volName)
-
-		err = testAttachWriteReadDetach(volID1, volName, tc0.Instance, tc0.Client, false /* readonly */, false /* detachAndReattach */, false /* setupDataCache */)
-		Expect(err).To(BeNil(), "Failed to attach/write/read/detach on vol1")
-
-		// Validate disks can be used in single-zone mode on both nodes
-		err = testAttachWriteReadDetach(volID1, volName, tc0.Instance, tc0.Client, true /* readonly */, false /* detachAndReattach */, false /* setupDataCache */)
-		Expect(err).To(BeNil(), "Failed to attach/read/detach on vol1")
-
-		// Validate disk is ROX now
-		disk1, err = computeService.Disks.Get(p, zones[0], volName).Do()
-		Expect(err).To(BeNil(), "Failed to get disk %v/%v", zones[0], volName)
-
-		Expect(disk1.AccessMode).To(Equal("READ_ONLY_MANY"))
-	})
-
 	It("Should successfully run through entire lifecycle of an RePD volume on instances in 2 zones", func() {
 		// Create new driver and client
 
diff --git a/test/k8s-integration/cluster.go b/test/k8s-integration/cluster.go
index 289d24d0..b411dd00 100644
--- a/test/k8s-integration/cluster.go
+++ b/test/k8s-integration/cluster.go
@@ -219,13 +219,8 @@ func clusterUpGKE(gceZone, gceRegion string, numNodes int, numWindowsNodes int,
 		cmdParams = append(cmdParams, "--cluster-version", *gkeClusterVer)
 	} else {
 		cmdParams = append(cmdParams, "--release-channel", *gkeReleaseChannel)
-		// Release channel based GKE clusters require autorepair to be enabled.
+		// release channel based GKE clusters require autorepair to be enabled.
 		cmdParams = append(cmdParams, "--enable-autorepair")
-
-		// Extended channel clusters require autoupgrade to be enabled.
-		if *gkeReleaseChannel == "extended" {
-			cmdParams = append(cmdParams, "--enable-autoupgrade")
-		}
 	}
 
 	if isVariableSet(gkeNodeVersion) {
diff --git a/test/k8s-integration/main.go b/test/k8s-integration/main.go
index 55e64fca..a3d82668 100644
--- a/test/k8s-integration/main.go
+++ b/test/k8s-integration/main.go
@@ -51,7 +51,7 @@ var (
 	numNodes             = flag.Int("num-nodes", 0, "the number of nodes in the test cluster")
 	numWindowsNodes      = flag.Int("num-windows-nodes", 0, "the number of Windows nodes in the test cluster")
 	imageType            = flag.String("image-type", "cos_containerd", "the image type to use for the cluster")
-	gkeReleaseChannel    = flag.String("gke-release-channel", "", "GKE release channel to be used for cluster deploy. One of 'rapid', 'stable', 'regular' or 'extended'")
+	gkeReleaseChannel    = flag.String("gke-release-channel", "", "GKE release channel to be used for cluster deploy. One of 'rapid', 'stable' or 'regular'")
 	gkeTestClusterPrefix = flag.String("gke-cluster-prefix", "pdcsi", "Prefix of GKE cluster names. A random suffix will be appended to form the full name.")
 	gkeTestClusterName   = flag.String("gke-cluster-name", "", "Name of existing cluster")
 	gkeNodeVersion       = flag.String("gke-node-version", "", "GKE cluster worker node version")