Path: blob/master/pkg/imgutil/proxyimgutil/proxyimgutil.go
2609 views
// SPDX-FileCopyrightText: Copyright The Lima Authors1// SPDX-License-Identifier: Apache-2.023package proxyimgutil45import (6"context"7"errors"8"os"9"os/exec"1011"github.com/lima-vm/go-qcow2reader/image"12"github.com/lima-vm/go-qcow2reader/image/raw"1314"github.com/lima-vm/lima/v2/pkg/imgutil"15"github.com/lima-vm/lima/v2/pkg/imgutil/nativeimgutil"16"github.com/lima-vm/lima/v2/pkg/qemuimgutil"17)1819// ImageDiskManager is a proxy implementation of imgutil.ImageDiskManager that uses both QEMU and native image utilities.20type ImageDiskManager struct {21qemu imgutil.ImageDiskManager22native imgutil.ImageDiskManager23}2425// NewDiskUtil returns a new instance of ImageDiskManager that uses both QEMU and native image utilities.26func NewDiskUtil(_ context.Context) imgutil.ImageDiskManager {27return &ImageDiskManager{28qemu: &qemuimgutil.QemuImageUtil{DefaultFormat: qemuimgutil.QemuImgFormat},29native: &nativeimgutil.NativeImageUtil{},30}31}3233// CreateDisk creates a new disk image with the specified size.34func (p *ImageDiskManager) CreateDisk(ctx context.Context, disk string, size int64) error {35err := p.qemu.CreateDisk(ctx, disk, size)36if err == nil {37return nil38}39if errors.Is(err, exec.ErrNotFound) {40return p.native.CreateDisk(ctx, disk, size)41}42return err43}4445// ResizeDisk resizes an existing disk image to the specified size.46func (p *ImageDiskManager) ResizeDisk(ctx context.Context, disk string, size int64) error {47err := p.qemu.ResizeDisk(ctx, disk, size)48if err == nil {49return nil50}51if errors.Is(err, exec.ErrNotFound) {52return p.native.ResizeDisk(ctx, disk, size)53}54return err55}5657// Convert converts a disk image to the specified format.58// Currently supported formats are raw.Type and asif.Type.59func (p *ImageDiskManager) Convert(ctx context.Context, imageType image.Type, source, dest string, size *int64, allowSourceWithBackingFile bool) error {60if imageType == raw.Type {61err := p.qemu.Convert(ctx, imageType, source, dest, size, allowSourceWithBackingFile)62if err == nil {63return nil64}65if errors.Is(err, exec.ErrNotFound) {66return p.native.Convert(ctx, imageType, source, dest, size, allowSourceWithBackingFile)67}68return err69}70return p.native.Convert(ctx, imageType, source, dest, size, allowSourceWithBackingFile)71}7273func (p *ImageDiskManager) MakeSparse(ctx context.Context, f *os.File, offset int64) error {74err := p.qemu.MakeSparse(ctx, f, offset)75if err == nil {76return nil77}78if errors.Is(err, exec.ErrNotFound) {79return p.native.MakeSparse(ctx, f, offset)80}81return err82}838485