Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/imgutil/proxyimgutil/proxyimgutil.go
2609 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package proxyimgutil
5
6
import (
7
"context"
8
"errors"
9
"os"
10
"os/exec"
11
12
"github.com/lima-vm/go-qcow2reader/image"
13
"github.com/lima-vm/go-qcow2reader/image/raw"
14
15
"github.com/lima-vm/lima/v2/pkg/imgutil"
16
"github.com/lima-vm/lima/v2/pkg/imgutil/nativeimgutil"
17
"github.com/lima-vm/lima/v2/pkg/qemuimgutil"
18
)
19
20
// ImageDiskManager is a proxy implementation of imgutil.ImageDiskManager that uses both QEMU and native image utilities.
21
type ImageDiskManager struct {
22
qemu imgutil.ImageDiskManager
23
native imgutil.ImageDiskManager
24
}
25
26
// NewDiskUtil returns a new instance of ImageDiskManager that uses both QEMU and native image utilities.
27
func NewDiskUtil(_ context.Context) imgutil.ImageDiskManager {
28
return &ImageDiskManager{
29
qemu: &qemuimgutil.QemuImageUtil{DefaultFormat: qemuimgutil.QemuImgFormat},
30
native: &nativeimgutil.NativeImageUtil{},
31
}
32
}
33
34
// CreateDisk creates a new disk image with the specified size.
35
func (p *ImageDiskManager) CreateDisk(ctx context.Context, disk string, size int64) error {
36
err := p.qemu.CreateDisk(ctx, disk, size)
37
if err == nil {
38
return nil
39
}
40
if errors.Is(err, exec.ErrNotFound) {
41
return p.native.CreateDisk(ctx, disk, size)
42
}
43
return err
44
}
45
46
// ResizeDisk resizes an existing disk image to the specified size.
47
func (p *ImageDiskManager) ResizeDisk(ctx context.Context, disk string, size int64) error {
48
err := p.qemu.ResizeDisk(ctx, disk, size)
49
if err == nil {
50
return nil
51
}
52
if errors.Is(err, exec.ErrNotFound) {
53
return p.native.ResizeDisk(ctx, disk, size)
54
}
55
return err
56
}
57
58
// Convert converts a disk image to the specified format.
59
// Currently supported formats are raw.Type and asif.Type.
60
func (p *ImageDiskManager) Convert(ctx context.Context, imageType image.Type, source, dest string, size *int64, allowSourceWithBackingFile bool) error {
61
if imageType == raw.Type {
62
err := p.qemu.Convert(ctx, imageType, source, dest, size, allowSourceWithBackingFile)
63
if err == nil {
64
return nil
65
}
66
if errors.Is(err, exec.ErrNotFound) {
67
return p.native.Convert(ctx, imageType, source, dest, size, allowSourceWithBackingFile)
68
}
69
return err
70
}
71
return p.native.Convert(ctx, imageType, source, dest, size, allowSourceWithBackingFile)
72
}
73
74
func (p *ImageDiskManager) MakeSparse(ctx context.Context, f *os.File, offset int64) error {
75
err := p.qemu.MakeSparse(ctx, f, offset)
76
if err == nil {
77
return nil
78
}
79
if errors.Is(err, exec.ErrNotFound) {
80
return p.native.MakeSparse(ctx, f, offset)
81
}
82
return err
83
}
84
85