From 880b7a3bda2df4e5ae837e6086d4267c2ced3186 Mon Sep 17 00:00:00 2001 From: andyzhangx Date: Mon, 28 May 2018 05:27:25 +0000 Subject: [PATCH] azuredisk size grow feature fix comments fix comments --- pkg/cloudprovider/providers/azure/BUILD | 2 + .../azure/azure_managedDiskController.go | 42 +++++++++++++++++++ pkg/volume/azure_dd/azure_dd.go | 25 +++++++++++ .../persistentvolume/resize/admission.go | 4 ++ 4 files changed, 73 insertions(+) diff --git a/pkg/cloudprovider/providers/azure/BUILD b/pkg/cloudprovider/providers/azure/BUILD index f3eb6e938a..1adae321e6 100644 --- a/pkg/cloudprovider/providers/azure/BUILD +++ b/pkg/cloudprovider/providers/azure/BUILD @@ -42,6 +42,7 @@ go_library( "//pkg/controller:go_default_library", "//pkg/version:go_default_library", "//pkg/volume:go_default_library", + "//pkg/volume/util:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-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/2017-10-01/storage:go_default_library", @@ -55,6 +56,7 @@ go_library( "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/rubiojr/go-vhd/vhd:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/pkg/cloudprovider/providers/azure/azure_managedDiskController.go b/pkg/cloudprovider/providers/azure/azure_managedDiskController.go index 02df2fd3d2..fac548f1d2 100644 --- a/pkg/cloudprovider/providers/azure/azure_managedDiskController.go +++ b/pkg/cloudprovider/providers/azure/azure_managedDiskController.go @@ -17,13 +17,17 @@ limitations under the License. package azure import ( + "fmt" "path" "strings" "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute" "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2017-10-01/storage" "github.com/golang/glog" + + "k8s.io/apimachinery/pkg/api/resource" kwait "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/pkg/volume/util" ) //ManagedDiskController : managed disk controller struct @@ -131,3 +135,41 @@ func (c *ManagedDiskController) getDisk(diskName string) (string, string, error) return "", "", err } + +// ResizeDisk Expand the disk to new size +func (c *ManagedDiskController) ResizeDisk(diskName string, oldSize resource.Quantity, newSize resource.Quantity) (resource.Quantity, error) { + ctx, cancel := getContextWithCancel() + defer cancel() + + result, err := c.common.cloud.DisksClient.Get(ctx, c.common.resourceGroup, diskName) + if err != nil { + return oldSize, err + } + + if result.DiskProperties == nil || result.DiskProperties.DiskSizeGB == nil { + 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)) + newSizeQuant := resource.MustParse(fmt.Sprintf("%dGi", requestGiB)) + + glog.V(2).Infof("azureDisk - begin to resize disk(%s) with new size(%d), old size(%v)", diskName, requestGiB, oldSize) + // If disk already of greater or equal size than requested we return + if *result.DiskProperties.DiskSizeGB >= requestGiB { + return newSizeQuant, nil + } + + result.DiskProperties.DiskSizeGB = &requestGiB + + ctx, cancel = getContextWithCancel() + defer cancel() + if _, err := c.common.cloud.DisksClient.CreateOrUpdate(ctx, c.common.resourceGroup, diskName, result); err != nil { + return oldSize, err + } + + glog.V(2).Infof("azureDisk - resize disk(%s) with new size(%d) completed", diskName, requestGiB) + + return newSizeQuant, nil +} diff --git a/pkg/volume/azure_dd/azure_dd.go b/pkg/volume/azure_dd/azure_dd.go index 11aba03a13..5f8cd980c6 100644 --- a/pkg/volume/azure_dd/azure_dd.go +++ b/pkg/volume/azure_dd/azure_dd.go @@ -23,6 +23,7 @@ import ( "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2017-10-01/storage" "github.com/golang/glog" "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider/providers/azure" "k8s.io/kubernetes/pkg/util/mount" @@ -55,6 +56,9 @@ type DiskController interface { CreateVolume(name, storageAccount, storageAccountType, location string, requestGB int) (string, string, int, error) // Delete a VHD blob DeleteVolume(diskURI string) error + + // Expand the disk to new size + ResizeDisk(diskName string, oldSize resource.Quantity, newSize resource.Quantity) (resource.Quantity, error) } type azureDataDiskPlugin struct { @@ -67,6 +71,7 @@ var _ volume.DeletableVolumePlugin = &azureDataDiskPlugin{} var _ volume.ProvisionableVolumePlugin = &azureDataDiskPlugin{} var _ volume.AttachableVolumePlugin = &azureDataDiskPlugin{} var _ volume.VolumePluginWithAttachLimits = &azureDataDiskPlugin{} +var _ volume.ExpandableVolumePlugin = &azureDataDiskPlugin{} const ( azureDataDiskPluginName = "kubernetes.io/azure-disk" @@ -210,6 +215,26 @@ func (plugin *azureDataDiskPlugin) NewUnmounter(volName string, podUID types.UID }, nil } +func (plugin *azureDataDiskPlugin) RequiresFSResize() bool { + return true +} + +func (plugin *azureDataDiskPlugin) ExpandVolumeDevice( + spec *volume.Spec, + newSize resource.Quantity, + oldSize resource.Quantity) (resource.Quantity, error) { + if spec.PersistentVolume == nil || spec.PersistentVolume.Spec.AzureDisk == nil { + return oldSize, fmt.Errorf("invalid PV spec") + } + + diskController, err := getDiskController(plugin.host) + if err != nil { + return oldSize, err + } + + return diskController.ResizeDisk(spec.PersistentVolume.Spec.AzureDisk.DiskName, oldSize, newSize) +} + func (plugin *azureDataDiskPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { mounter := plugin.host.GetMounter(plugin.GetPluginName()) pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) diff --git a/plugin/pkg/admission/storage/persistentvolume/resize/admission.go b/plugin/pkg/admission/storage/persistentvolume/resize/admission.go index 6d6b500aa8..389e39395d 100644 --- a/plugin/pkg/admission/storage/persistentvolume/resize/admission.go +++ b/plugin/pkg/admission/storage/persistentvolume/resize/admission.go @@ -164,5 +164,9 @@ func (pvcr *persistentVolumeClaimResize) checkVolumePlugin(pv *api.PersistentVol if pv.Spec.AzureFile != nil { return true } + + if pv.Spec.AzureDisk != nil { + return true + } return false }