-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclient.go
116 lines (96 loc) · 2.42 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package stereoscope
import (
"fmt"
"io/ioutil"
"os"
"github.com/nextlinux/stereoscope/internal/bus"
"github.com/nextlinux/stereoscope/internal/log"
"github.com/nextlinux/stereoscope/pkg/image"
"github.com/nextlinux/stereoscope/pkg/image/docker"
"github.com/nextlinux/stereoscope/pkg/logger"
"github.com/hashicorp/go-multierror"
"github.com/nextlinux/gopartybus"
)
const (
NoActionOption Option = iota
ReadImageOption
)
type Option uint
var trackerInstance *tracker
func init() {
trackerInstance = &tracker{
tempDir: make([]string, 0),
}
}
type tracker struct {
tempDir []string
}
// newTempDir creates an empty dir in the platform temp dir
func (t *tracker) newTempDir() string {
dir, err := ioutil.TempDir("", "stereoscope-cache")
if err != nil {
log.Errorf("could not create temp dir: %w", err)
panic(err)
}
t.tempDir = append(t.tempDir, dir)
return dir
}
func (t *tracker) cleanup() error {
var allErrors error
for _, dir := range t.tempDir {
err := os.RemoveAll(dir)
if err != nil {
allErrors = multierror.Append(allErrors, err)
}
}
return allErrors
}
// GetImage parses the user provided image string and provides an image object
func GetImage(userStr string, options ...Option) (*image.Image, error) {
var provider image.Provider
source, imgStr := image.ParseImageSpec(userStr)
var processingOption = NoActionOption
if len(options) == 0 {
processingOption = ReadImageOption
} else {
for _, o := range options {
if o > processingOption {
processingOption = o
}
}
}
log.Debugf("image: source=%+v location=%+v processingOption=%+v", source, imgStr, processingOption)
switch source {
case image.DockerTarballSource:
// note: the imgStr is the path on disk to the tar file
provider = docker.NewProviderFromTarball(imgStr)
case image.DockerDaemonSource:
cacheDir := trackerInstance.newTempDir()
provider = docker.NewProviderFromDaemon(imgStr, cacheDir)
default:
return nil, fmt.Errorf("unable determine image source")
}
img, err := provider.Provide()
if err != nil {
return nil, err
}
if processingOption >= ReadImageOption {
err = img.Read()
if err != nil {
return nil, fmt.Errorf("could not read image: %+v", err)
}
}
return img, nil
}
func SetLogger(logger logger.Logger) {
log.Log = logger
}
func SetBus(b *partybus.Bus) {
bus.SetPublisher(b)
}
func Cleanup() {
err := trackerInstance.cleanup()
if err != nil {
log.Errorf("failed to cleanup: %w", err)
}
}