diff --git a/pkg/cloudprovider/providers/aws/BUILD b/pkg/cloudprovider/providers/aws/BUILD index 01b55fcd3ca..07371824f9f 100644 --- a/pkg/cloudprovider/providers/aws/BUILD +++ b/pkg/cloudprovider/providers/aws/BUILD @@ -28,7 +28,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/aws", deps = [ "//pkg/credentialprovider/aws:go_default_library", - "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -45,6 +44,7 @@ go_library( "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", "//staging/src/k8s.io/cloud-provider/volume:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/credentials:go_default_library", diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 98ec2d7fe3e..da7787285a5 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -62,7 +62,7 @@ import ( servicehelpers "k8s.io/cloud-provider/service/helpers" cloudvolume "k8s.io/cloud-provider/volume" volerr "k8s.io/cloud-provider/volume/errors" - volumeutil "k8s.io/kubernetes/pkg/volume/util" + volumehelpers "k8s.io/cloud-provider/volume/helpers" ) // NLBHealthCheckRuleDescription is the comment used on a security group rule to @@ -2604,7 +2604,7 @@ func (c *Cloud) ResizeDisk( return oldSize, descErr } // AWS resizes in chunks of GiB (not GB) - requestGiB := volumeutil.RoundUpToGiB(newSize) + requestGiB := volumehelpers.RoundUpToGiB(newSize) newSizeQuant := resource.MustParse(fmt.Sprintf("%dGi", requestGiB)) // If disk already if of greater or equal size than requested we return diff --git a/pkg/cloudprovider/providers/azure/BUILD b/pkg/cloudprovider/providers/azure/BUILD index bf805343e80..bd97289989d 100644 --- a/pkg/cloudprovider/providers/azure/BUILD +++ b/pkg/cloudprovider/providers/azure/BUILD @@ -37,7 +37,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/azure", deps = [ "//pkg/cloudprovider/providers/azure/auth:go_default_library", - "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", @@ -58,6 +57,7 @@ go_library( "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", "//staging/src/k8s.io/cloud-provider/volume:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2018-10-01/compute:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2018-07-01/storage:go_default_library", diff --git a/pkg/cloudprovider/providers/azure/azure_managedDiskController.go b/pkg/cloudprovider/providers/azure/azure_managedDiskController.go index 200ff94bc48..efdbb67275e 100644 --- a/pkg/cloudprovider/providers/azure/azure_managedDiskController.go +++ b/pkg/cloudprovider/providers/azure/azure_managedDiskController.go @@ -31,7 +31,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" kwait "k8s.io/apimachinery/pkg/util/wait" cloudvolume "k8s.io/cloud-provider/volume" - "k8s.io/kubernetes/pkg/volume/util" + volumehelpers "k8s.io/cloud-provider/volume/helpers" ) const ( @@ -238,9 +238,8 @@ func (c *ManagedDiskController) ResizeDisk(diskURI string, oldSize resource.Quan return oldSize, fmt.Errorf("DiskProperties of disk(%s) is nil", diskName) } - requestBytes := newSize.Value() // Azure resizes in chunks of GiB (not GB) - requestGiB := int32(util.RoundUpSize(requestBytes, 1024*1024*1024)) + requestGiB := int32(volumehelpers.RoundUpToGiB(newSize)) newSizeQuant := resource.MustParse(fmt.Sprintf("%dGi", requestGiB)) klog.V(2).Infof("azureDisk - begin to resize disk(%s) with new size(%d), old size(%v)", diskName, requestGiB, oldSize) diff --git a/pkg/cloudprovider/providers/gce/BUILD b/pkg/cloudprovider/providers/gce/BUILD index 0548c0078d0..8875dd9b93e 100644 --- a/pkg/cloudprovider/providers/gce/BUILD +++ b/pkg/cloudprovider/providers/gce/BUILD @@ -41,7 +41,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/gce", visibility = ["//visibility:public"], deps = [ - "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/cloudprovider/providers/gce/gce_disks.go b/pkg/cloudprovider/providers/gce/gce_disks.go index 43a1cc20d91..1503409044e 100644 --- a/pkg/cloudprovider/providers/gce/gce_disks.go +++ b/pkg/cloudprovider/providers/gce/gce_disks.go @@ -32,7 +32,6 @@ import ( cloudvolume "k8s.io/cloud-provider/volume" volerr "k8s.io/cloud-provider/volume/errors" volumehelpers "k8s.io/cloud-provider/volume/helpers" - volumeutil "k8s.io/kubernetes/pkg/volume/util" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud" "github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/meta" @@ -749,7 +748,7 @@ func (g *Cloud) ResizeDisk(diskToResize string, oldSize resource.Quantity, newSi } // GCE resizes in chunks of GiBs - requestGIB := volumeutil.RoundUpToGiB(newSize) + requestGIB := volumehelpers.RoundUpToGiB(newSize) newSizeQuant := resource.MustParse(fmt.Sprintf("%dGi", requestGIB)) // If disk is already of size equal or greater than requested size, we simply return diff --git a/pkg/cloudprovider/providers/openstack/BUILD b/pkg/cloudprovider/providers/openstack/BUILD index a0a96dece6a..934af2f7502 100644 --- a/pkg/cloudprovider/providers/openstack/BUILD +++ b/pkg/cloudprovider/providers/openstack/BUILD @@ -21,7 +21,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack", deps = [ "//pkg/util/mount:go_default_library", - "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", @@ -34,6 +33,7 @@ go_library( "//staging/src/k8s.io/cloud-provider/service/helpers:go_default_library", "//staging/src/k8s.io/cloud-provider/volume:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/volumeactions:go_default_library", diff --git a/pkg/cloudprovider/providers/openstack/openstack_volumes.go b/pkg/cloudprovider/providers/openstack/openstack_volumes.go index 410b985c6fa..dd7636175a5 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_volumes.go +++ b/pkg/cloudprovider/providers/openstack/openstack_volumes.go @@ -32,7 +32,7 @@ import ( cloudprovider "k8s.io/cloud-provider" cloudvolume "k8s.io/cloud-provider/volume" volerr "k8s.io/cloud-provider/volume/errors" - volumeutil "k8s.io/kubernetes/pkg/volume/util" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "github.com/gophercloud/gophercloud" volumeexpand "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/volumeactions" @@ -413,7 +413,7 @@ func (os *OpenStack) ExpandVolume(volumeID string, oldSize resource.Quantity, ne } // Cinder works with gigabytes, convert to GiB with rounding up - volSizeGiB, err := volumeutil.RoundUpToGiBInt(newSize) + volSizeGiB, err := volumehelpers.RoundUpToGiBInt(newSize) if err != nil { return oldSize, err } diff --git a/pkg/volume/azure_file/BUILD b/pkg/volume/azure_file/BUILD index bfa63a9b61b..aa15bf7ec9c 100644 --- a/pkg/volume/azure_file/BUILD +++ b/pkg/volume/azure_file/BUILD @@ -26,6 +26,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/cloud-provider:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2018-07-01/storage:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/strings:go_default_library", diff --git a/pkg/volume/azure_file/azure_file.go b/pkg/volume/azure_file/azure_file.go index 92984f8f039..32a849612c4 100644 --- a/pkg/volume/azure_file/azure_file.go +++ b/pkg/volume/azure_file/azure_file.go @@ -27,6 +27,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" cloudprovider "k8s.io/cloud-provider" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" "k8s.io/kubernetes/pkg/cloudprovider/providers/azure" "k8s.io/kubernetes/pkg/util/mount" @@ -173,7 +174,7 @@ func (plugin *azureFilePlugin) ExpandVolumeDevice( return oldSize, err } - if err := azure.ResizeFileShare(accountName, accountKey, shareName, int(volutil.RoundUpToGiB(newSize))); err != nil { + if err := azure.ResizeFileShare(accountName, accountKey, shareName, int(volumehelpers.RoundUpToGiB(newSize))); err != nil { return oldSize, err } diff --git a/pkg/volume/azure_file/azure_provision.go b/pkg/volume/azure_file/azure_provision.go index dab5ff341ac..dd687c72f99 100644 --- a/pkg/volume/azure_file/azure_provision.go +++ b/pkg/volume/azure_file/azure_provision.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" cloudprovider "k8s.io/cloud-provider" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/kubernetes/pkg/cloudprovider/providers/azure" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" @@ -147,8 +148,7 @@ func (a *azureFileProvisioner) Provision(selectedNode *v1.Node, allowedTopologie name := util.GenerateVolumeName(a.options.ClusterName, a.options.PVName, 63) name = strings.Replace(name, "--", "-", -1) capacity := a.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] - requestBytes := capacity.Value() - requestGiB := int(util.RoundUpSize(requestBytes, 1024*1024*1024)) + requestGiB := int(volumehelpers.RoundUpToGiB(capacity)) secretNamespace := a.options.PVC.Namespace // Apply ProvisionerParameters (case-insensitive). We leave validation of // the values to the cloud provider. diff --git a/pkg/volume/cinder/cinder_util.go b/pkg/volume/cinder/cinder_util.go index 61dc4ffcd56..7c461473178 100644 --- a/pkg/volume/cinder/cinder_util.go +++ b/pkg/volume/cinder/cinder_util.go @@ -30,7 +30,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" clientset "k8s.io/client-go/kubernetes" - cloudvolumehelpers "k8s.io/cloud-provider/volume/helpers" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/kubernetes/pkg/volume" volutil "k8s.io/kubernetes/pkg/volume/util" "k8s.io/utils/exec" @@ -170,7 +170,7 @@ func (util *DiskUtil) CreateVolume(c *cinderVolumeProvisioner, node *v1.Node, al capacity := c.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] // Cinder works with gigabytes, convert to GiB with rounding up - volSizeGiB, err := volutil.RoundUpToGiBInt(capacity) + volSizeGiB, err := volumehelpers.RoundUpToGiBInt(capacity) if err != nil { return "", 0, nil, "", err } @@ -207,7 +207,7 @@ func (util *DiskUtil) CreateVolume(c *cinderVolumeProvisioner, node *v1.Node, al // if we did not get any zones, lets leave it blank and gophercloud will // use zone "nova" as default if len(zones) > 0 { - availability, err = cloudvolumehelpers.SelectZoneForVolume(false, false, "", nil, zones, node, allowedTopologies, c.options.PVC.Name) + availability, err = volumehelpers.SelectZoneForVolume(false, false, "", nil, zones, node, allowedTopologies, c.options.PVC.Name) if err != nil { klog.V(2).Infof("error selecting zone for volume: %v", err) return "", 0, nil, "", err diff --git a/pkg/volume/flocker/BUILD b/pkg/volume/flocker/BUILD index d58059aa58b..2f6c2b70a21 100644 --- a/pkg/volume/flocker/BUILD +++ b/pkg/volume/flocker/BUILD @@ -25,6 +25,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/clusterhq/flocker-go:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/strings:go_default_library", diff --git a/pkg/volume/flocker/flocker_util.go b/pkg/volume/flocker/flocker_util.go index e753da9acd0..529a9e4c168 100644 --- a/pkg/volume/flocker/flocker_util.go +++ b/pkg/volume/flocker/flocker_util.go @@ -22,7 +22,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/rand" - volutil "k8s.io/kubernetes/pkg/volume/util" + volumehelpers "k8s.io/cloud-provider/volume/helpers" flockerapi "github.com/clusterhq/flocker-go" "k8s.io/klog" @@ -72,7 +72,7 @@ func (util *flockerUtil) CreateVolume(c *flockerVolumeProvisioner) (datasetUUID capacity := c.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] requestBytes := capacity.Value() - volumeSizeGiB, err = volutil.RoundUpToGiBInt(capacity) + volumeSizeGiB, err = volumehelpers.RoundUpToGiBInt(capacity) if err != nil { return } diff --git a/pkg/volume/gcepd/BUILD b/pkg/volume/gcepd/BUILD index f3e9f90b7c7..cd4489dc075 100644 --- a/pkg/volume/gcepd/BUILD +++ b/pkg/volume/gcepd/BUILD @@ -53,7 +53,6 @@ go_test( "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/volume/gcepd/gce_pd_test.go b/pkg/volume/gcepd/gce_pd_test.go index b1724f7f69c..be7aaa217aa 100644 --- a/pkg/volume/gcepd/gce_pd_test.go +++ b/pkg/volume/gcepd/gce_pd_test.go @@ -33,7 +33,6 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumetest "k8s.io/kubernetes/pkg/volume/testing" - "k8s.io/kubernetes/pkg/volume/util" ) func TestCanSupport(t *testing.T) { diff --git a/pkg/volume/glusterfs/BUILD b/pkg/volume/glusterfs/BUILD index bc684f32846..5774416506f 100644 --- a/pkg/volume/glusterfs/BUILD +++ b/pkg/volume/glusterfs/BUILD @@ -29,6 +29,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/heketi/heketi/client/api/go-client:go_default_library", "//vendor/github.com/heketi/heketi/pkg/glusterfs/api:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/pkg/volume/glusterfs/glusterfs.go b/pkg/volume/glusterfs/glusterfs.go index d7bf9242209..47a10cf6f90 100644 --- a/pkg/volume/glusterfs/glusterfs.go +++ b/pkg/volume/glusterfs/glusterfs.go @@ -37,6 +37,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/util/mount" @@ -811,7 +812,7 @@ func (p *glusterfsVolumeProvisioner) CreateVolume(gid int) (r *v1.GlusterfsPersi capacity := p.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] // GlusterFS/heketi creates volumes in units of GiB. - sz, err := volutil.RoundUpToGiBInt(capacity) + sz, err := volumehelpers.RoundUpToGiBInt(capacity) if err != nil { return nil, 0, "", err } @@ -1240,11 +1241,11 @@ func (plugin *glusterfsPlugin) ExpandVolumeDevice(spec *volume.Spec, newSize res } // Find out delta size - expansionSize := (newSize.Value() - oldSize.Value()) - expansionSizeGiB := int(volutil.RoundUpSize(expansionSize, volutil.GIB)) + expansionSize := resource.NewScaledQuantity((newSize.Value() - oldSize.Value()), 0) + expansionSizeGiB := int(volumehelpers.RoundUpToGiB(*expansionSize)) // Find out requested Size - requestGiB := volutil.RoundUpToGiB(newSize) + requestGiB := volumehelpers.RoundUpToGiB(newSize) //Check the existing volume size currentVolumeInfo, err := cli.VolumeInfo(volumeID) diff --git a/pkg/volume/photon_pd/BUILD b/pkg/volume/photon_pd/BUILD index 97ee8e7fd96..4f5ddfbde1a 100644 --- a/pkg/volume/photon_pd/BUILD +++ b/pkg/volume/photon_pd/BUILD @@ -24,6 +24,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/cloud-provider:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/strings:go_default_library", ], diff --git a/pkg/volume/photon_pd/photon_util.go b/pkg/volume/photon_pd/photon_util.go index 23ebf92d033..b9865d24472 100644 --- a/pkg/volume/photon_pd/photon_util.go +++ b/pkg/volume/photon_pd/photon_util.go @@ -25,6 +25,7 @@ import ( "k8s.io/api/core/v1" cloudprovider "k8s.io/cloud-provider" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" "k8s.io/kubernetes/pkg/cloudprovider/providers/photon" "k8s.io/kubernetes/pkg/util/mount" @@ -90,7 +91,7 @@ func (util *PhotonDiskUtil) CreateVolume(p *photonPersistentDiskProvisioner) (pd capacity := p.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] // PhotonController works with GiB, convert to GiB with rounding up - volSizeGB, err := volumeutil.RoundUpToGiBInt(capacity) + volSizeGB, err := volumehelpers.RoundUpToGiBInt(capacity) if err != nil { return "", 0, "", err } diff --git a/pkg/volume/portworx/BUILD b/pkg/volume/portworx/BUILD index 63053513b77..6925d5f355e 100644 --- a/pkg/volume/portworx/BUILD +++ b/pkg/volume/portworx/BUILD @@ -38,6 +38,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/libopenstorage/openstorage/api:go_default_library", "//vendor/github.com/libopenstorage/openstorage/api/client:go_default_library", "//vendor/github.com/libopenstorage/openstorage/api/client/volume:go_default_library", diff --git a/pkg/volume/portworx/portworx_util.go b/pkg/volume/portworx/portworx_util.go index 7ac5522dac1..6c4cec1b395 100644 --- a/pkg/volume/portworx/portworx_util.go +++ b/pkg/volume/portworx/portworx_util.go @@ -27,10 +27,10 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/volume" - volutil "k8s.io/kubernetes/pkg/volume/util" ) const ( @@ -59,7 +59,7 @@ func (util *portworxVolumeUtil) CreateVolume(p *portworxVolumeProvisioner) (stri capacity := p.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] // Portworx Volumes are specified in GiB - requestGiB := volutil.RoundUpToGiB(capacity) + requestGiB := volumehelpers.RoundUpToGiB(capacity) // Perform a best-effort parsing of parameters. Portworx 1.2.9 and later parses volume parameters from // spec.VolumeLabels. So even if below SpecFromOpts() fails to parse certain parameters or @@ -79,7 +79,7 @@ func (util *portworxVolumeUtil) CreateVolume(p *portworxVolumeProvisioner) (stri } // Update the requested size in the spec - spec.Size = uint64(requestGiB * volutil.GIB) + spec.Size = uint64(requestGiB * volumehelpers.GiB) // Change the Portworx Volume name to PV name if locator == nil { @@ -208,7 +208,7 @@ func (util *portworxVolumeUtil) ResizeVolume(spec *volume.Spec, newSize resource } vol := vols[0] - newSizeInBytes := uint64(volutil.RoundUpToGiB(newSize) * volutil.GIB) + newSizeInBytes := uint64(volumehelpers.RoundUpToGiB(newSize) * volumehelpers.GiB) if vol.Spec.Size >= newSizeInBytes { klog.Infof("Portworx volume: %s already at size: %d greater than or equal to new "+ "requested size: %d. Skipping resize.", spec.Name(), vol.Spec.Size, newSizeInBytes) diff --git a/pkg/volume/quobyte/BUILD b/pkg/volume/quobyte/BUILD index fe0c047f720..f194dfe9e1b 100644 --- a/pkg/volume/quobyte/BUILD +++ b/pkg/volume/quobyte/BUILD @@ -22,6 +22,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/pborman/uuid:go_default_library", "//vendor/github.com/quobyte/api:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/pkg/volume/quobyte/quobyte_util.go b/pkg/volume/quobyte/quobyte_util.go index 107c1454bed..69925b4c7c1 100644 --- a/pkg/volume/quobyte/quobyte_util.go +++ b/pkg/volume/quobyte/quobyte_util.go @@ -23,7 +23,7 @@ import ( "strings" "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/volume/util" + volumehelpers "k8s.io/cloud-provider/volume/helpers" quobyteapi "github.com/quobyte/api" "k8s.io/klog" @@ -35,7 +35,7 @@ type quobyteVolumeManager struct { func (manager *quobyteVolumeManager) createVolume(provisioner *quobyteVolumeProvisioner, createQuota bool) (quobyte *v1.QuobyteVolumeSource, size int, err error) { capacity := provisioner.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] - volumeSize, err := util.RoundUpToGiBInt(capacity) + volumeSize, err := volumehelpers.RoundUpToGiBInt(capacity) if err != nil { return nil, 0, err } diff --git a/pkg/volume/rbd/BUILD b/pkg/volume/rbd/BUILD index d50005da483..94917607158 100644 --- a/pkg/volume/rbd/BUILD +++ b/pkg/volume/rbd/BUILD @@ -33,6 +33,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/path:go_default_library", "//vendor/k8s.io/utils/strings:go_default_library", diff --git a/pkg/volume/rbd/rbd_util.go b/pkg/volume/rbd/rbd_util.go index 613987279f5..e16327bf323 100644 --- a/pkg/volume/rbd/rbd_util.go +++ b/pkg/volume/rbd/rbd_util.go @@ -36,11 +36,11 @@ import ( "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/wait" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/node" "k8s.io/kubernetes/pkg/volume" - volutil "k8s.io/kubernetes/pkg/volume/util" utilpath "k8s.io/utils/path" ) @@ -580,9 +580,8 @@ func (util *RBDUtil) cleanOldRBDFile(plugin *rbdPlugin, rbdFile string) error { func (util *RBDUtil) CreateImage(p *rbdVolumeProvisioner) (r *v1.RBDPersistentVolumeSource, size int, err error) { var output []byte capacity := p.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] - volSizeBytes := capacity.Value() // Convert to MB that rbd defaults on. - sz, err := volutil.RoundUpSizeInt(volSizeBytes, 1024*1024) + sz, err := volumehelpers.RoundUpToMiBInt(capacity) if err != nil { return nil, 0, err } @@ -641,9 +640,9 @@ func (util *RBDUtil) DeleteImage(p *rbdVolumeDeleter) error { func (util *RBDUtil) ExpandImage(rbdExpander *rbdVolumeExpander, oldSize resource.Quantity, newSize resource.Quantity) (resource.Quantity, error) { var output []byte var err error - volSizeBytes := newSize.Value() + // Convert to MB that rbd defaults on. - sz := int(volutil.RoundUpSize(volSizeBytes, 1024*1024)) + sz := int(volumehelpers.RoundUpToMiB(newSize)) newVolSz := fmt.Sprintf("%d", sz) newSizeQuant := resource.MustParse(fmt.Sprintf("%dMi", sz)) diff --git a/pkg/volume/scaleio/BUILD b/pkg/volume/scaleio/BUILD index a5c98810a21..cc6c67f4f31 100644 --- a/pkg/volume/scaleio/BUILD +++ b/pkg/volume/scaleio/BUILD @@ -48,6 +48,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/codedellemc/goscaleio:go_default_library", "//vendor/github.com/codedellemc/goscaleio/types/v1:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/pkg/volume/scaleio/sio_volume.go b/pkg/volume/scaleio/sio_volume.go index 926005cbd77..767450aba53 100644 --- a/pkg/volume/scaleio/sio_volume.go +++ b/pkg/volume/scaleio/sio_volume.go @@ -28,6 +28,7 @@ import ( meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/uuid" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" @@ -265,19 +266,20 @@ func (v *sioVolume) Provision(selectedNode *api.Node, allowedTopologies []api.To // setup volume attrributes genName := v.generateName("k8svol", 11) - var oneGig int64 = 1024 * 1024 * 1024 - eightGig := 8 * oneGig + eightGig := int64(8 * volumehelpers.GiB) capacity := v.options.PVC.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)] + volSizeBytes := capacity.Value() - volSizeGB := int64(util.RoundUpSize(volSizeBytes, oneGig)) + volSizeGB := int64(volumehelpers.RoundUpToGiB(capacity)) if volSizeBytes == 0 { return nil, fmt.Errorf("invalid volume size of 0 specified") } if volSizeBytes < eightGig { - volSizeGB = int64(util.RoundUpSize(eightGig, oneGig)) + eightGiBCapacity := resource.NewQuantity(eightGig, resource.BinarySI) + volSizeGB = int64(volumehelpers.RoundUpToGiB(*eightGiBCapacity)) klog.V(4).Info(log("capacity less than 8Gi found, adjusted to %dGi", volSizeGB)) } diff --git a/pkg/volume/storageos/BUILD b/pkg/volume/storageos/BUILD index ebfc86e0b3d..db9aeeb6dec 100644 --- a/pkg/volume/storageos/BUILD +++ b/pkg/volume/storageos/BUILD @@ -23,6 +23,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/github.com/storageos/go-api:go_default_library", "//vendor/github.com/storageos/go-api/types:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/pkg/volume/storageos/storageos.go b/pkg/volume/storageos/storageos.go index b2619b07b07..d7aece10b8f 100644 --- a/pkg/volume/storageos/storageos.go +++ b/pkg/volume/storageos/storageos.go @@ -29,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" clientset "k8s.io/client-go/kubernetes" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" @@ -606,7 +607,7 @@ func (c *storageosProvisioner) Provision(selectedNode *v1.Node, allowedTopologie } capacity := c.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] var err error - c.sizeGB, err = util.RoundUpToGiBInt(capacity) + c.sizeGB, err = volumehelpers.RoundUpToGiBInt(capacity) if err != nil { return nil, err } diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go index 5417616272c..2565c6b07f4 100644 --- a/pkg/volume/util/util.go +++ b/pkg/volume/util/util.go @@ -47,11 +47,6 @@ import ( ) const ( - // GB - GigaByte size - GB = 1000 * 1000 * 1000 - // GIB - GibiByte size - GIB = 1024 * 1024 * 1024 - readyFileName = "ready" // ControllerManagedAttachAnnotation is the key of the annotation on Node @@ -219,57 +214,6 @@ func CalculateTimeoutForVolume(minimumTimeout, timeoutIncrement int, pv *v1.Pers return timeout } -// RoundUpSize calculates how many allocation units are needed to accommodate -// a volume of given size. E.g. when user wants 1500MiB volume, while AWS EBS -// allocates volumes in gibibyte-sized chunks, -// RoundUpSize(1500 * 1024*1024, 1024*1024*1024) returns '2' -// (2 GiB is the smallest allocatable volume that can hold 1500MiB) -func RoundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 { - roundedUp := volumeSizeBytes / allocationUnitBytes - if volumeSizeBytes%allocationUnitBytes > 0 { - roundedUp++ - } - return roundedUp -} - -// RoundUpToGB rounds up given quantity to chunks of GB -func RoundUpToGB(size resource.Quantity) int64 { - requestBytes := size.Value() - return RoundUpSize(requestBytes, GB) -} - -// RoundUpToGiB rounds up given quantity upto chunks of GiB -func RoundUpToGiB(size resource.Quantity) int64 { - requestBytes := size.Value() - return RoundUpSize(requestBytes, GIB) -} - -// RoundUpSizeInt calculates how many allocation units are needed to accommodate -// a volume of given size. It returns an int instead of an int64 and an error if -// there's overflow -func RoundUpSizeInt(volumeSizeBytes int64, allocationUnitBytes int64) (int, error) { - roundedUp := RoundUpSize(volumeSizeBytes, allocationUnitBytes) - roundedUpInt := int(roundedUp) - if int64(roundedUpInt) != roundedUp { - return 0, fmt.Errorf("capacity %v is too great, casting results in integer overflow", roundedUp) - } - return roundedUpInt, nil -} - -// RoundUpToGBInt rounds up given quantity to chunks of GB. It returns an -// int instead of an int64 and an error if there's overflow -func RoundUpToGBInt(size resource.Quantity) (int, error) { - requestBytes := size.Value() - return RoundUpSizeInt(requestBytes, GB) -} - -// RoundUpToGiBInt rounds up given quantity upto chunks of GiB. It returns an -// int instead of an int64 and an error if there's overflow -func RoundUpToGiBInt(size resource.Quantity) (int, error) { - requestBytes := size.Value() - return RoundUpSizeInt(requestBytes, GIB) -} - // GenerateVolumeName returns a PV name with clusterName prefix. The function // should be used to generate a name of GCE PD or Cinder volume. It basically // adds "-dynamic-" before the PV name, making sure the resulting diff --git a/pkg/volume/vsphere_volume/BUILD b/pkg/volume/vsphere_volume/BUILD index bbdbdd4e471..660ee835a6d 100644 --- a/pkg/volume/vsphere_volume/BUILD +++ b/pkg/volume/vsphere_volume/BUILD @@ -29,6 +29,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/cloud-provider:go_default_library", + "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/keymutex:go_default_library", "//vendor/k8s.io/utils/strings:go_default_library", diff --git a/pkg/volume/vsphere_volume/vsphere_volume_util.go b/pkg/volume/vsphere_volume/vsphere_volume_util.go index 4c87623326c..921789b651b 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume_util.go +++ b/pkg/volume/vsphere_volume/vsphere_volume_util.go @@ -25,6 +25,7 @@ import ( "k8s.io/api/core/v1" cloudprovider "k8s.io/cloud-provider" + volumehelpers "k8s.io/cloud-provider/volume/helpers" "k8s.io/klog" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib" @@ -92,9 +93,8 @@ func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (volSpec } capacity := v.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] - volSizeBytes := capacity.Value() // vSphere works with kilobytes, convert to KiB with rounding up - volSizeKiB, err := volumeutil.RoundUpSizeInt(volSizeBytes, 1024) + volSizeKiB, err := volumehelpers.RoundUpToKiBInt(capacity) if err != nil { return nil, err } diff --git a/staging/src/k8s.io/cloud-provider/volume/helpers/BUILD b/staging/src/k8s.io/cloud-provider/volume/helpers/BUILD index 9f2f2dcb2a6..4066602df1d 100644 --- a/staging/src/k8s.io/cloud-provider/volume/helpers/BUILD +++ b/staging/src/k8s.io/cloud-provider/volume/helpers/BUILD @@ -2,12 +2,16 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", - srcs = ["zones.go"], + srcs = [ + "rounding.go", + "zones.go", + ], importmap = "k8s.io/kubernetes/vendor/k8s.io/cloud-provider/volume/helpers", importpath = "k8s.io/cloud-provider/volume/helpers", visibility = ["//visibility:public"], deps = [ "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/cloud-provider/volume:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/staging/src/k8s.io/cloud-provider/volume/helpers/rounding.go b/staging/src/k8s.io/cloud-provider/volume/helpers/rounding.go new file mode 100644 index 00000000000..a4ccaa03480 --- /dev/null +++ b/staging/src/k8s.io/cloud-provider/volume/helpers/rounding.go @@ -0,0 +1,143 @@ +/* +Copyright 2019 The Kubernetes Authors. + +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 helpers + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/api/resource" +) + +const ( + // GB - GigaByte size + GB = 1000 * 1000 * 1000 + // GiB - GibiByte size + GiB = 1024 * 1024 * 1024 + + // MB - MegaByte size + MB = 1000 * 1000 + // MiB - MebiByte size + MiB = 1024 * 1024 + + // KB - KiloByte size + KB = 1000 + // KiB - KibiByte size + KiB = 1024 +) + +// RoundUpToGB rounds up given quantity to chunks of GB +func RoundUpToGB(size resource.Quantity) int64 { + requestBytes := size.Value() + return roundUpSize(requestBytes, GB) +} + +// RoundUpToGiB rounds up given quantity upto chunks of GiB +func RoundUpToGiB(size resource.Quantity) int64 { + requestBytes := size.Value() + return roundUpSize(requestBytes, GiB) +} + +// RoundUpToMB rounds up given quantity to chunks of MB +func RoundUpToMB(size resource.Quantity) int64 { + requestBytes := size.Value() + return roundUpSize(requestBytes, MB) +} + +// RoundUpToMiB rounds up given quantity upto chunks of MiB +func RoundUpToMiB(size resource.Quantity) int64 { + requestBytes := size.Value() + return roundUpSize(requestBytes, MiB) +} + +// RoundUpToKB rounds up given quantity to chunks of KB +func RoundUpToKB(size resource.Quantity) int64 { + requestBytes := size.Value() + return roundUpSize(requestBytes, KB) +} + +// RoundUpToKiB rounds up given quantity upto chunks of KiB +func RoundUpToKiB(size resource.Quantity) int64 { + requestBytes := size.Value() + return roundUpSize(requestBytes, KiB) +} + +// RoundUpToGBInt rounds up given quantity to chunks of GB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToGBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return roundUpSizeInt(requestBytes, GB) +} + +// RoundUpToGiBInt rounds up given quantity upto chunks of GiB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToGiBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return roundUpSizeInt(requestBytes, GiB) +} + +// RoundUpToMBInt rounds up given quantity to chunks of MB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToMBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return roundUpSizeInt(requestBytes, MB) +} + +// RoundUpToMiBInt rounds up given quantity upto chunks of MiB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToMiBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return roundUpSizeInt(requestBytes, MiB) +} + +// RoundUpToKBInt rounds up given quantity to chunks of KB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToKBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return roundUpSizeInt(requestBytes, KB) +} + +// RoundUpToKiBInt rounds up given quantity upto chunks of KiB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToKiBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return roundUpSizeInt(requestBytes, KiB) +} + +// roundUpSizeInt calculates how many allocation units are needed to accommodate +// a volume of given size. It returns an int instead of an int64 and an error if +// there's overflow +func roundUpSizeInt(volumeSizeBytes int64, allocationUnitBytes int64) (int, error) { + roundedUp := roundUpSize(volumeSizeBytes, allocationUnitBytes) + roundedUpInt := int(roundedUp) + if int64(roundedUpInt) != roundedUp { + return 0, fmt.Errorf("capacity %v is too great, casting results in integer overflow", roundedUp) + } + return roundedUpInt, nil +} + +// roundUpSize calculates how many allocation units are needed to accommodate +// a volume of given size. E.g. when user wants 1500MiB volume, while AWS EBS +// allocates volumes in gibibyte-sized chunks, +// RoundUpSize(1500 * 1024*1024, 1024*1024*1024) returns '2' +// (2 GiB is the smallest allocatable volume that can hold 1500MiB) +func roundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 { + roundedUp := volumeSizeBytes / allocationUnitBytes + if volumeSizeBytes%allocationUnitBytes > 0 { + roundedUp++ + } + return roundedUp +}