podman

Форк
0
114 строк · 2.3 Кб
1
package ocipull
2

3
import (
4
	"fmt"
5
	"os"
6
	"path/filepath"
7
	"strings"
8

9
	"github.com/blang/semver/v4"
10
	"github.com/containers/image/v5/pkg/compression"
11
	"github.com/containers/image/v5/types"
12
	"github.com/containers/podman/v5/pkg/machine/define"
13
	"github.com/containers/podman/v5/version"
14
	"github.com/containers/storage/pkg/archive"
15
	"github.com/sirupsen/logrus"
16
)
17

18
type OSVersion struct {
19
	*semver.Version
20
}
21

22
type Disker interface {
23
	Get() error
24
}
25

26
type OCIOpts struct {
27
	Scheme *OCIKind
28
	Dir    *string
29
}
30

31
type OCIKind string
32

33
var (
34
	OCIDir      OCIKind = "oci-dir"
35
	OCIRegistry OCIKind = "docker"
36
	OCIUnknown  OCIKind = "unknown"
37
)
38

39
func (o OCIKind) String() string {
40
	switch o {
41
	case OCIDir:
42
		return string(OCIDir)
43
	case OCIRegistry:
44
		return string(OCIRegistry)
45
	}
46
	return string(OCIUnknown)
47
}
48

49
func (o OCIKind) IsOCIDir() bool {
50
	return o == OCIDir
51
}
52

53
func StripOCIReference(input string) string {
54
	return strings.TrimPrefix(input, "docker://")
55
}
56

57
func getVersion() *OSVersion {
58
	v := version.Version
59
	return &OSVersion{&v}
60
}
61

62
func (o *OSVersion) majorMinor() string {
63
	return fmt.Sprintf("%d.%d", o.Major, o.Minor)
64
}
65

66
func unpackOCIDir(ociTb, machineImageDir string) (*define.VMFile, error) {
67
	imageFileName, err := findTarComponent(ociTb)
68
	if err != nil {
69
		return nil, err
70
	}
71

72
	unpackedFileName := filepath.Join(machineImageDir, imageFileName)
73

74
	f, err := os.Open(ociTb)
75
	if err != nil {
76
		return nil, err
77
	}
78
	defer func() {
79
		if err := f.Close(); err != nil {
80
			logrus.Error(err)
81
		}
82
	}()
83

84
	uncompressedReader, _, err := compression.AutoDecompress(f)
85
	if err != nil {
86
		return nil, err
87
	}
88

89
	defer func() {
90
		if err := uncompressedReader.Close(); err != nil {
91
			logrus.Error(err)
92
		}
93
	}()
94

95
	logrus.Debugf("untarring %q to %q", ociTb, machineImageDir)
96
	if err := archive.Untar(uncompressedReader, machineImageDir, &archive.TarOptions{
97
		NoLchown: true,
98
	}); err != nil {
99
		return nil, err
100
	}
101

102
	return define.NewMachineFile(unpackedFileName, nil)
103
}
104

105
func localOCIDiskImageDir(blobDirPath string, localBlob *types.BlobInfo) string {
106
	return filepath.Join(blobDirPath, "blobs", "sha256", localBlob.Digest.Hex())
107
}
108

109
func finalFQImagePathName(vmName, imageName string) string {
110
	// imageName here is fully qualified. we need to break
111
	// it apart and add the vmname
112
	baseDir, filename := filepath.Split(imageName)
113
	return filepath.Join(baseDir, fmt.Sprintf("%s-%s", vmName, filename))
114
}
115

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.