Skip to content

Commit e4a57b7

Browse files
authored
Merge pull request kubernetes#76719 from bertinatto/fix_vsphere_size
Fix Vsphere rouding up of volume size
2 parents 36e06bb + d98db30 commit e4a57b7

File tree

2 files changed

+35
-33
lines changed

2 files changed

+35
-33
lines changed

pkg/volume/vsphere_volume/vsphere_volume_util.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,12 @@ func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner, selectedZ
9494
}
9595

9696
capacity := v.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)]
97-
// vSphere works with kilobytes, convert to KiB with rounding up
98-
volSizeKiB, err := volumehelpers.RoundUpToKiBInt(capacity)
97+
// vSphere works with KiB, but its minimum allocation unit is 1 MiB
98+
volSizeMiB, err := volumehelpers.RoundUpToMiBInt(capacity)
9999
if err != nil {
100100
return nil, err
101101
}
102+
volSizeKiB := volSizeMiB * 1024
102103
name := volumeutil.GenerateVolumeName(v.options.ClusterName, v.options.PVName, 255)
103104
volumeOptions := &vclib.VolumeOptions{
104105
CapacityKB: volSizeKiB,

test/e2e/storage/vsphere/vsphere_volume_disksize.go

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@ limitations under the License.
1717
package vsphere
1818

1919
import (
20-
"fmt"
21-
"strings"
2220
"time"
2321

2422
. "github.com/onsi/ginkgo"
2523
. "github.com/onsi/gomega"
26-
"k8s.io/api/core/v1"
24+
v1 "k8s.io/api/core/v1"
25+
"k8s.io/apimachinery/pkg/api/resource"
2726
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2827
clientset "k8s.io/client-go/kubernetes"
2928
"k8s.io/kubernetes/test/e2e/framework"
@@ -35,13 +34,12 @@ const (
3534
)
3635

3736
/*
38-
Test to verify disk size specified in PVC is being honored while volume creation.
37+
Test to verify disk size specified in PVC is being rounded up correctly.
3938
4039
Steps
4140
1. Create StorageClass.
4241
2. Create PVC with invalid disk size which uses the StorageClass created in step 1.
43-
3. Expect the PVC to fail.
44-
4. Verify the error returned on PVC failure is the correct.
42+
3. Verify the provisioned PV size is correct.
4543
*/
4644

4745
var _ = utils.SIGDescribe("Volume Disk Size [Feature:vsphere]", func() {
@@ -61,35 +59,38 @@ var _ = utils.SIGDescribe("Volume Disk Size [Feature:vsphere]", func() {
6159
datastore = GetAndExpectStringEnvVar(StorageClassDatastoreName)
6260
})
6361

64-
It("verify dynamically provisioned pv using storageclass with an invalid disk size fails", func() {
65-
By("Invoking Test for invalid disk size")
62+
It("verify dynamically provisioned pv has size rounded up correctly", func() {
63+
By("Invoking Test disk size")
6664
scParameters[Datastore] = datastore
6765
scParameters[DiskFormat] = ThinDisk
6866
diskSize := "1"
69-
err := invokeInvalidDiskSizeTestNeg(client, namespace, scParameters, diskSize)
70-
Expect(err).To(HaveOccurred())
71-
errorMsg := `Failed to provision volume with StorageClass \"` + DiskSizeSCName + `\": A specified parameter was not correct`
72-
if !strings.Contains(err.Error(), errorMsg) {
73-
framework.ExpectNoError(err, errorMsg)
74-
}
75-
})
76-
})
67+
expectedDiskSize := "1Mi"
68+
69+
By("Creating Storage Class")
70+
storageclass, err := client.StorageV1().StorageClasses().Create(getVSphereStorageClassSpec(DiskSizeSCName, scParameters, nil))
71+
framework.ExpectNoError(err)
72+
defer client.StorageV1().StorageClasses().Delete(storageclass.Name, nil)
7773

78-
func invokeInvalidDiskSizeTestNeg(client clientset.Interface, namespace string, scParameters map[string]string, diskSize string) error {
79-
By("Creating Storage Class With invalid disk size")
80-
storageclass, err := client.StorageV1().StorageClasses().Create(getVSphereStorageClassSpec(DiskSizeSCName, scParameters, nil))
81-
framework.ExpectNoError(err, fmt.Sprintf("Failed to create storage class with err: %v", err))
82-
defer client.StorageV1().StorageClasses().Delete(storageclass.Name, nil)
74+
By("Creating PVC using the Storage Class")
75+
pvclaim, err := framework.CreatePVC(client, namespace, getVSphereClaimSpecWithStorageClass(namespace, diskSize, storageclass))
76+
framework.ExpectNoError(err)
77+
defer framework.DeletePersistentVolumeClaim(client, pvclaim.Name, namespace)
8378

84-
By("Creating PVC using the Storage Class")
85-
pvclaim, err := framework.CreatePVC(client, namespace, getVSphereClaimSpecWithStorageClass(namespace, diskSize, storageclass))
86-
framework.ExpectNoError(err)
87-
defer framework.DeletePersistentVolumeClaim(client, pvclaim.Name, namespace)
79+
By("Waiting for claim to be in bound phase")
80+
err = framework.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, pvclaim.Namespace, pvclaim.Name, framework.Poll, 2*time.Minute)
81+
framework.ExpectNoError(err)
8882

89-
By("Expect claim to fail provisioning volume")
90-
err = framework.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, client, pvclaim.Namespace, pvclaim.Name, framework.Poll, 2*time.Minute)
91-
Expect(err).To(HaveOccurred())
83+
By("Getting new copy of PVC")
84+
pvclaim, err = client.CoreV1().PersistentVolumeClaims(pvclaim.Namespace).Get(pvclaim.Name, metav1.GetOptions{})
85+
framework.ExpectNoError(err)
9286

93-
eventList, err := client.CoreV1().Events(pvclaim.Namespace).List(metav1.ListOptions{})
94-
return fmt.Errorf("Failure message: %+q", eventList.Items[0].Message)
95-
}
87+
By("Getting PV created")
88+
pv, err := client.CoreV1().PersistentVolumes().Get(pvclaim.Spec.VolumeName, metav1.GetOptions{})
89+
framework.ExpectNoError(err)
90+
91+
By("Verifying if provisioned PV has the correct size")
92+
expectedCapacity := resource.MustParse(expectedDiskSize)
93+
pvCapacity := pv.Spec.Capacity[v1.ResourceName(v1.ResourceStorage)]
94+
Expect(pvCapacity.Value()).To(Equal(expectedCapacity.Value()))
95+
})
96+
})

0 commit comments

Comments
 (0)