-
Notifications
You must be signed in to change notification settings - Fork 332
/
client.go
180 lines (132 loc) · 3.95 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
package client
import (
"context"
"fmt"
"io"
"strings"
"github.com/loft-sh/devpod/pkg/provider"
)
type BaseClient interface {
// Provider returns the name of the provider
Provider() string
// Context returns the context of the provider
Context() string
// RefreshOptions updates the options
RefreshOptions(ctx context.Context, userOptions []string) error
// Status retrieves the workspace status
Status(ctx context.Context, options StatusOptions) (Status, error)
// Stop stops the workspace
Stop(ctx context.Context, options StopOptions) error
// Delete deletes the workspace
Delete(ctx context.Context, options DeleteOptions) error
}
type Client interface {
BaseClient
// AgentLocal returns if the agent runs locally
AgentLocal() bool
// AgentPath returns the agent path
AgentPath() string
// AgentURL returns the agent download url
AgentURL() string
// Create creates a new workspace
Create(ctx context.Context, options CreateOptions) error
// Start starts the workspace
Start(ctx context.Context, options StartOptions) error
// Command creates an SSH tunnel into the workspace
Command(ctx context.Context, options CommandOptions) error
}
type ProxyClient interface {
BaseWorkspaceClient
// Up creates a new remote workspace
Up(ctx context.Context, options UpOptions) error
// Ssh starts an ssh tunnel to the workspace container
Ssh(ctx context.Context, options SshOptions) error
}
type MachineClient interface {
Client
// Machine returns the machine of this client
Machine() string
// MachineConfig returns the machine config
MachineConfig() *provider.Machine
}
type BaseWorkspaceClient interface {
BaseClient
// Workspace returns the workspace of this provider
Workspace() string
// WorkspaceConfig returns the workspace config
WorkspaceConfig() *provider.Workspace
// Lock locks the workspace. This is a file lock, which means
// the workspace is locked across processes.
Lock(ctx context.Context) error
// Unlock unlocks the workspace.
Unlock()
}
type WorkspaceClient interface {
BaseWorkspaceClient
Client
// AgentInjectGitCredentials returns if the credentials helper should get injected
AgentInjectGitCredentials() bool
// AgentInjectDockerCredentials returns if the credentials helper should get injected
AgentInjectDockerCredentials() bool
// AgentInfo returns the info to send to the agent
AgentInfo(options provider.CLIOptions) (string, *provider.AgentWorkspaceInfo, error)
}
type InitOptions struct{}
type ValidateOptions struct{}
type StartOptions struct{}
type StopOptions struct{}
type DeleteOptions struct {
IgnoreNotFound bool `json:"ignoreNotFound,omitempty"`
Force bool `json:"force,omitempty"`
GracePeriod string `json:"gracePeriod,omitempty"`
}
type CreateOptions struct{}
type StatusOptions struct {
ContainerStatus bool `json:"containerStatus,omitempty"`
}
type CommandOptions struct {
Command string
Stdin io.Reader
Stdout io.Writer
Stderr io.Writer
}
type UpOptions struct {
provider.CLIOptions
Debug bool
Stdin io.Reader
Stdout io.Writer
}
type SshOptions struct {
User string
Stdin io.Reader
Stdout io.Writer
}
type ImportWorkspaceOptions map[string]string
type Status string
const (
StatusRunning = "Running"
StatusBusy = "Busy"
StatusStopped = "Stopped"
StatusNotFound = "NotFound"
)
func ParseStatus(in string) (Status, error) {
in = strings.ToUpper(strings.TrimSpace(in))
switch in {
case "RUNNING":
return StatusRunning, nil
case "BUSY":
return StatusBusy, nil
case "STOPPED":
return StatusStopped, nil
case "NOTFOUND":
return StatusNotFound, nil
default:
return StatusNotFound, fmt.Errorf("error parsing status: '%s' unrecognized status, needs to be one of: %s", in, []string{StatusRunning, StatusBusy, StatusStopped, StatusNotFound})
}
}
type WorkspaceStatus struct {
ID string `json:"id,omitempty"`
Context string `json:"context,omitempty"`
Provider string `json:"provider,omitempty"`
State string `json:"state,omitempty"`
}