123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // +build linux
- /*
- Copyright 2017 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 resizefs
- import (
- "fmt"
- "k8s.io/klog"
- "k8s.io/kubernetes/pkg/util/mount"
- )
- // ResizeFs Provides support for resizing file systems
- type ResizeFs struct {
- mounter *mount.SafeFormatAndMount
- }
- // NewResizeFs returns new instance of resizer
- func NewResizeFs(mounter *mount.SafeFormatAndMount) *ResizeFs {
- return &ResizeFs{mounter: mounter}
- }
- // Resize perform resize of file system
- func (resizefs *ResizeFs) Resize(devicePath string, deviceMountPath string) (bool, error) {
- format, err := resizefs.mounter.GetDiskFormat(devicePath)
- if err != nil {
- formatErr := fmt.Errorf("ResizeFS.Resize - error checking format for device %s: %v", devicePath, err)
- return false, formatErr
- }
- // If disk has no format, there is no need to resize the disk because mkfs.*
- // by default will use whole disk anyways.
- if format == "" {
- return false, nil
- }
- klog.V(3).Infof("ResizeFS.Resize - Expanding mounted volume %s", devicePath)
- switch format {
- case "ext3", "ext4":
- return resizefs.extResize(devicePath)
- case "xfs":
- return resizefs.xfsResize(deviceMountPath)
- }
- return false, fmt.Errorf("ResizeFS.Resize - resize of format %s is not supported for device %s mounted at %s", format, devicePath, deviceMountPath)
- }
- func (resizefs *ResizeFs) extResize(devicePath string) (bool, error) {
- output, err := resizefs.mounter.Exec.Run("resize2fs", devicePath)
- if err == nil {
- klog.V(2).Infof("Device %s resized successfully", devicePath)
- return true, nil
- }
- resizeError := fmt.Errorf("resize of device %s failed: %v. resize2fs output: %s", devicePath, err, string(output))
- return false, resizeError
- }
- func (resizefs *ResizeFs) xfsResize(deviceMountPath string) (bool, error) {
- args := []string{"-d", deviceMountPath}
- output, err := resizefs.mounter.Exec.Run("xfs_growfs", args...)
- if err == nil {
- klog.V(2).Infof("Device %s resized successfully", deviceMountPath)
- return true, nil
- }
- resizeError := fmt.Errorf("resize of device %s failed: %v. xfs_growfs output: %s", deviceMountPath, err, string(output))
- return false, resizeError
- }
|