-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
runtimes.go
125 lines (105 loc) · 2.77 KB
/
runtimes.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
117
118
119
120
121
122
123
124
125
package debug
import (
"os"
"strings"
"github.com/mintoolkit/mint/pkg/docker/dockerclient"
)
const (
AutoRuntime = "auto" //auto-select by detecting runtimes
AutoRuntimeDesc = "Auto-select based on detected runtimes"
DockerRuntime = "docker"
DockerRuntimeDesc = "Docker runtime - debug a container running in Docker"
ContainerdRuntime = "containerd"
ContainerdRuntimeDesc = "ContainerD runtime"
KubernetesRuntime = "k8s"
KubernetesRuntimeDesc = "Kubernetes runtime - debug a container running in Kubernetes"
KubeconfigDefault = "${HOME}/.kube/config"
NamespaceDefault = "default"
PodmanRuntime = "podman"
PodmanRuntimeDesc = "Podman runtime"
)
//todo: refactor when the "debuggers" are refactored in their own packages
const (
ContainerdRuntimeSocket = "/var/run/containerd/containerd.sock"
DockerRuntimeSocket = "/var/run/docker.sock"
PodmanRuntimeSocket = "/var/run/podman/podman.sock"
)
type RuntimeInfo struct {
Name string
Description string
Socket string
}
var runtimeDefaultConnections = []RuntimeInfo{
{
Socket: ContainerdRuntimeSocket,
Name: ContainerdRuntime,
Description: ContainerdRuntimeDesc,
},
{
Socket: dockerclient.UserDockerSocket(),
Name: DockerRuntime,
Description: DockerRuntimeDesc,
},
{
Socket: dockerclient.UnixSocketPath,
Name: DockerRuntime,
Description: DockerRuntimeDesc,
},
{
Socket: PodmanRuntimeSocket,
Name: PodmanRuntime,
Description: PodmanRuntimeDesc,
},
{
Socket: getPodmanSocketPath(),
Name: PodmanRuntime,
Description: PodmanRuntimeDesc,
},
{
Socket: getPodmanRemotePath(), //only reads configs (no REST calls)
Name: PodmanRuntime,
Description: PodmanRuntimeDesc,
},
}
func AvailableRuntimes() []string {
usable := map[string]struct{}{}
for _, info := range runtimeDefaultConnections {
if info.Socket == "" {
continue
}
if strings.HasPrefix(info.Socket, "/") {
if hasSocket(info.Socket) {
usable[info.Name] = struct{}{}
}
} else {
//adding remote paths (for podman and others; without checking, for now)
usable[info.Name] = struct{}{}
}
}
var available []string
//need to preserve the order from 'runtimes'
saved := map[string]struct{}{}
for _, info := range runtimeDefaultConnections {
_, ufound := usable[info.Name]
_, sfound := saved[info.Name]
if ufound && !sfound {
available = append(available, info.Name)
saved[info.Name] = struct{}{}
}
}
return available
}
func AutoSelectRuntime() string {
available := AvailableRuntimes()
if len(available) > 0 {
return available[0]
}
return DockerRuntime
}
func hasSocket(name string) bool {
_, err := os.Stat(name)
if err == nil || !os.IsNotExist(err) {
return true
}
return false
}