Skip to content

Commit f39dbcd

Browse files
caoxianfei1Wine93
authored andcommitted
Feature: podman can be an alternative container engine.
Signed-off-by: caoxianfei1 <[email protected]>
1 parent 11064cd commit f39dbcd

File tree

18 files changed

+102
-156
lines changed

18 files changed

+102
-156
lines changed

cli/cli/cli.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ func (curveadm *CurveAdm) LogPath() string { return curveadm.l
255255
func (curveadm *CurveAdm) Config() *configure.CurveAdmConfig { return curveadm.config }
256256
func (curveadm *CurveAdm) SudoAlias() string { return curveadm.config.GetSudoAlias() }
257257
func (curveadm *CurveAdm) SSHTimeout() int { return curveadm.config.GetSSHTimeout() }
258+
func (curveadm *CurveAdm) Engine() string { return curveadm.config.GetEngine() }
258259
func (curveadm *CurveAdm) In() io.Reader { return curveadm.in }
259260
func (curveadm *CurveAdm) Out() io.Writer { return curveadm.out }
260261
func (curveadm *CurveAdm) Err() io.Writer { return curveadm.err }
@@ -374,6 +375,7 @@ func (curveadm *CurveAdm) ExecOptions() module.ExecOptions {
374375
ExecInLocal: false,
375376
ExecSudoAlias: curveadm.config.GetSudoAlias(),
376377
ExecTimeoutSec: curveadm.config.GetTimeout(),
378+
ExecWithEngine: curveadm.config.GetEngine(),
377379
}
378380
}
379381

internal/configure/curveadm/curveadm.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
const (
5252
KEY_LOG_LEVEL = "log_level"
5353
KEY_SUDO_ALIAS = "sudo_alias"
54+
KEY_ENGINE = "engine"
5455
KEY_TIMEOUT = "timeout"
5556
KEY_AUTO_UPGRADE = "auto_upgrade"
5657
KEY_SSH_RETRIES = "retries"
@@ -70,6 +71,7 @@ type (
7071
CurveAdmConfig struct {
7172
LogLevel string
7273
SudoAlias string
74+
Engine string
7375
Timeout int
7476
AutoUpgrade bool
7577
SSHRetries int
@@ -104,6 +106,7 @@ func newDefault() *CurveAdmConfig {
104106
cfg := &CurveAdmConfig{
105107
LogLevel: "error",
106108
SudoAlias: "sudo",
109+
Engine: "docker",
107110
Timeout: 180,
108111
AutoUpgrade: true,
109112
SSHRetries: 3,
@@ -154,6 +157,10 @@ func parseDefaultsSection(cfg *CurveAdmConfig, defaults map[string]interface{})
154157
case KEY_SUDO_ALIAS:
155158
cfg.SudoAlias = v.(string)
156159

160+
// container engine
161+
case KEY_ENGINE:
162+
cfg.Engine = v.(string)
163+
157164
// timeout
158165
case KEY_TIMEOUT:
159166
num, err := requirePositiveInt(KEY_TIMEOUT, v)
@@ -285,6 +292,7 @@ func (cfg *CurveAdmConfig) GetTimeout() int { return cfg.Timeout }
285292
func (cfg *CurveAdmConfig) GetAutoUpgrade() bool { return cfg.AutoUpgrade }
286293
func (cfg *CurveAdmConfig) GetSSHRetries() int { return cfg.SSHRetries }
287294
func (cfg *CurveAdmConfig) GetSSHTimeout() int { return cfg.SSHTimeout }
295+
func (cfg *CurveAdmConfig) GetEngine() string { return cfg.Engine }
288296
func (cfg *CurveAdmConfig) GetSudoAlias() string {
289297
if len(cfg.SudoAlias) == 0 {
290298
return WITHOUT_SUDO

internal/errno/errno.go

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,15 @@ func (e *ErrorCode) F(format string, a ...interface{}) *ErrorCode {
107107
return e
108108
}
109109

110+
func (e *ErrorCode) FD(format string, s ...interface{}) *ErrorCode {
111+
newEC := &ErrorCode{
112+
code: e.code,
113+
description: e.description,
114+
}
115+
newEC.description = fmt.Sprintf(newEC.description+" "+format, s...)
116+
return newEC
117+
}
118+
110119
func (e *ErrorCode) Error() string {
111120
if e.code == CODE_CANCEL_OPERATION {
112121
return ""
@@ -430,10 +439,10 @@ var (
430439
ERR_SSH_CONNECT_FAILED = EC(510000, "SSH connect failed")
431440

432441
// 520: checker (permission)
433-
ERR_USER_NOT_FOUND = EC(520000, "user not found")
434-
ERR_HOSTNAME_NOT_RESOLVED = EC(520001, "hostname not resolved")
435-
ERR_CREATE_DIRECOTRY_PERMISSION_DENIED = EC(520002, "create direcotry permission denied")
436-
ERR_EXECUTE_DOCKER_COMMAND_PERMISSION_DENIED = EC(520003, "execute docker command permission denied")
442+
ERR_USER_NOT_FOUND = EC(520000, "user not found")
443+
ERR_HOSTNAME_NOT_RESOLVED = EC(520001, "hostname not resolved")
444+
ERR_CREATE_DIRECOTRY_PERMISSION_DENIED = EC(520002, "create direcotry permission denied")
445+
ERR_EXECUTE_CONTAINER_ENGINE_COMMAND_PERMISSION_DENIED = EC(520003, "execute docker/podman command permission denied")
437446

438447
// 530: checker (kernel)
439448
ERR_UNRECOGNIZED_KERNEL_VERSION = EC(530000, "unrecognized kernel version")
@@ -460,9 +469,9 @@ var (
460469
ERR_INVALID_CURVEFS_CLIENT_S3_BUCKET_NAME = EC(570003, "invalid curvefs client S3 bucket name")
461470

462471
// 590: checker (others)
463-
ERR_DOCKER_NOT_INSTALLED = EC(590000, "docker not installed")
464-
ERR_DOCKER_DAEMON_IS_NOT_RUNNING = EC(590001, "docker daemon is not running")
465-
ERR_NO_SPACE_LEFT_ON_DEVICE = EC(590002, "no space left on device")
472+
ERR_CONTAINER_ENGINE_NOT_INSTALLED = EC(590000, "container engine docker/podman not installed")
473+
ERR_DOCKER_DAEMON_IS_NOT_RUNNING = EC(590001, "docker daemon is not running")
474+
ERR_NO_SPACE_LEFT_ON_DEVICE = EC(590002, "no space left on device")
466475

467476
// 600: exeute task (common)
468477
ERR_EXECUTE_COMMAND_TIMED_OUT = EC(600000, "execute command timed out")
@@ -509,21 +518,22 @@ var (
509518
ERR_RUN_SCRIPT_FAILED = EC(620998, "run script failed (bash script.sh)")
510519
ERR_RUN_A_BASH_COMMAND_FAILED = EC(620999, "run a bash command failed (bash -c)")
511520

512-
// 630: execute task (docker command)
513-
ERR_GET_DOCKER_INFO_FAILED = EC(630000, "get docker info failed (docker info)")
514-
ERR_PULL_IMAGE_FAILED = EC(630001, "pull image failed (docker pull IMAGE)")
515-
ERR_CREATE_CONTAINER_FAILED = EC(630002, "create container failed (docker create IMAGE)")
516-
ERR_START_CONTAINER_FAILED = EC(630003, "start container failed (docker start CONTAINER)")
517-
ERR_STOP_CONTAINER_FAILED = EC(630004, "stop container failed (docker stop CONTAINER)")
518-
ERR_RESTART_CONTAINER_FAILED = EC(630005, "restart container failed (docker restart CONTAINER)")
519-
ERR_WAIT_CONTAINER_STOP_FAILED = EC(630006, "wait container stop failed (docker wait CONTAINER)")
520-
ERR_REMOVE_CONTAINER_FAILED = EC(630007, "remove container failed (docker rm CONTAINER)")
521-
ERR_LIST_CONTAINERS_FAILED = EC(630008, "list containers failed (docker ps)")
522-
ERR_RUN_COMMAND_IN_CONTAINER_FAILED = EC(630009, "run a command in container failed (docker exec CONTAINER COMMAND)")
523-
ERR_COPY_FROM_CONTAINER_FAILED = EC(630010, "copy file from container failed (docker cp CONTAINER:SRC_PATH DEST_PATH)")
524-
ERR_COPY_INTO_CONTAINER_FAILED = EC(630011, "copy file into container failed (docker cp SRC_PATH CONTAINER:DEST_PATH)")
525-
ERR_INSPECT_CONTAINER_FAILED = EC(630012, "get container low-level information failed (docker inspect ID)")
526-
ERR_GET_CONTAINER_LOGS_FAILED = EC(630013, "get container logs failed (docker logs ID)")
521+
// 630: execute task (docker/podman command)
522+
ERR_GET_CONTAINER_ENGINE_INFO_FAILED = EC(630000, "get container engine info failed")
523+
ERR_PULL_IMAGE_FAILED = EC(630001, "pull image failed")
524+
ERR_CREATE_CONTAINER_FAILED = EC(630002, "create container failed")
525+
ERR_START_CONTAINER_FAILED = EC(630003, "start container failed")
526+
ERR_STOP_CONTAINER_FAILED = EC(630004, "stop container failed")
527+
ERR_RESTART_CONTAINER_FAILED = EC(630005, "restart container failed")
528+
ERR_WAIT_CONTAINER_STOP_FAILED = EC(630006, "wait container stop failed")
529+
ERR_REMOVE_CONTAINER_FAILED = EC(630007, "remove container failed")
530+
ERR_LIST_CONTAINERS_FAILED = EC(630008, "list containers failed")
531+
ERR_RUN_COMMAND_IN_CONTAINER_FAILED = EC(630009, "run a command in container failed")
532+
ERR_COPY_FROM_CONTAINER_FAILED = EC(630010, "copy file from container failed")
533+
ERR_COPY_INTO_CONTAINER_FAILED = EC(630011, "copy file into container failed")
534+
ERR_INSPECT_CONTAINER_FAILED = EC(630012, "get container low-level information failed")
535+
ERR_GET_CONTAINER_LOGS_FAILED = EC(630013, "get container logs failed")
536+
ERR_UPDATE_CONTAINER_FAILED = EC(630014, "update container failed")
527537

528538
// 690: execuetr task (others)
529539
ERR_START_CRONTAB_IN_CONTAINER_FAILED = EC(690000, "start crontab in container failed")

internal/task/step/container.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
)
3232

3333
type (
34-
DockerInfo struct {
34+
EngineInfo struct {
3535
Success *bool
3636
Out *string
3737
module.ExecOptions
@@ -154,16 +154,16 @@ type (
154154
}
155155
)
156156

157-
func (s *DockerInfo) Execute(ctx *context.Context) error {
157+
func (s *EngineInfo) Execute(ctx *context.Context) error {
158158
cli := ctx.Module().DockerCli().DockerInfo()
159159
out, err := cli.Execute(s.ExecOptions)
160-
return PostHandle(s.Success, s.Out, out, err, errno.ERR_GET_DOCKER_INFO_FAILED)
160+
return PostHandle(s.Success, s.Out, out, err, errno.ERR_GET_CONTAINER_ENGINE_INFO_FAILED.FD("(%s info)", s.ExecWithEngine))
161161
}
162162

163163
func (s *PullImage) Execute(ctx *context.Context) error {
164164
cli := ctx.Module().DockerCli().PullImage(s.Image)
165165
out, err := cli.Execute(s.ExecOptions)
166-
return PostHandle(nil, s.Out, out, err, errno.ERR_PULL_IMAGE_FAILED)
166+
return PostHandle(nil, s.Out, out, err, errno.ERR_PULL_IMAGE_FAILED.FD("(%s pull IMAGE)", s.ExecWithEngine))
167167
}
168168

169169
func (s *CreateContainer) Execute(ctx *context.Context) error {
@@ -223,13 +223,13 @@ func (s *CreateContainer) Execute(ctx *context.Context) error {
223223
}
224224

225225
out, err := cli.Execute(s.ExecOptions)
226-
return PostHandle(nil, s.Out, out, err, errno.ERR_CREATE_CONTAINER_FAILED)
226+
return PostHandle(nil, s.Out, out, err, errno.ERR_CREATE_CONTAINER_FAILED.FD("(%s create IMAGE)", s.ExecWithEngine))
227227
}
228228

229229
func (s *StartContainer) Execute(ctx *context.Context) error {
230230
cli := ctx.Module().DockerCli().StartContainer(*s.ContainerId)
231231
out, err := cli.Execute(s.ExecOptions)
232-
return PostHandle(s.Success, s.Out, out, err, errno.ERR_START_CONTAINER_FAILED)
232+
return PostHandle(s.Success, s.Out, out, err, errno.ERR_START_CONTAINER_FAILED.FD("(%s start CONTAINER)", s.ExecWithEngine))
233233
}
234234

235235
func (s *StopContainer) Execute(ctx *context.Context) error {
@@ -239,25 +239,25 @@ func (s *StopContainer) Execute(ctx *context.Context) error {
239239
}
240240

241241
out, err := cli.Execute(s.ExecOptions)
242-
return PostHandle(nil, s.Out, out, err, errno.ERR_STOP_CONTAINER_FAILED)
242+
return PostHandle(nil, s.Out, out, err, errno.ERR_STOP_CONTAINER_FAILED.FD("(%s stop CONTAINER)", s.ExecWithEngine))
243243
}
244244

245245
func (s *RestartContainer) Execute(ctx *context.Context) error {
246246
cli := ctx.Module().DockerCli().RestartContainer(s.ContainerId)
247247
out, err := cli.Execute(s.ExecOptions)
248-
return PostHandle(nil, s.Out, out, err, errno.ERR_RESTART_CONTAINER_FAILED)
248+
return PostHandle(nil, s.Out, out, err, errno.ERR_RESTART_CONTAINER_FAILED.FD("(%s restart CONTAINER)", s.ExecWithEngine))
249249
}
250250

251251
func (s *WaitContainer) Execute(ctx *context.Context) error {
252252
cli := ctx.Module().DockerCli().WaitContainer(s.ContainerId)
253253
out, err := cli.Execute(s.ExecOptions)
254-
return PostHandle(nil, s.Out, out, err, errno.ERR_WAIT_CONTAINER_STOP_FAILED)
254+
return PostHandle(nil, s.Out, out, err, errno.ERR_WAIT_CONTAINER_STOP_FAILED.FD("(%s wait CONTAINER)", s.ExecWithEngine))
255255
}
256256

257257
func (s *RemoveContainer) Execute(ctx *context.Context) error {
258258
cli := ctx.Module().DockerCli().RemoveContainer(s.ContainerId)
259259
out, err := cli.Execute(s.ExecOptions)
260-
return PostHandle(s.Success, s.Out, out, err, errno.ERR_REMOVE_CONTAINER_FAILED)
260+
return PostHandle(s.Success, s.Out, out, err, errno.ERR_REMOVE_CONTAINER_FAILED.FD("(%s rm CONTAINER)", s.ExecWithEngine))
261261
}
262262

263263
func (s *ListContainers) Execute(ctx *context.Context) error {
@@ -276,25 +276,25 @@ func (s *ListContainers) Execute(ctx *context.Context) error {
276276
}
277277

278278
out, err := cli.Execute(s.ExecOptions)
279-
return PostHandle(nil, s.Out, out, err, errno.ERR_LIST_CONTAINERS_FAILED)
279+
return PostHandle(nil, s.Out, out, err, errno.ERR_LIST_CONTAINERS_FAILED.FD("(%s ps)", s.ExecWithEngine))
280280
}
281281

282282
func (s *ContainerExec) Execute(ctx *context.Context) error {
283283
cli := ctx.Module().DockerCli().ContainerExec(*s.ContainerId, s.Command)
284284
out, err := cli.Execute(s.ExecOptions)
285-
return PostHandle(s.Success, s.Out, out, err, errno.ERR_RUN_COMMAND_IN_CONTAINER_FAILED)
285+
return PostHandle(s.Success, s.Out, out, err, errno.ERR_RUN_COMMAND_IN_CONTAINER_FAILED.FD("(%s exec CONTAINER COMMAND)", s.ExecWithEngine))
286286
}
287287

288288
func (s *CopyFromContainer) Execute(ctx *context.Context) error {
289289
cli := ctx.Module().DockerCli().CopyFromContainer(s.ContainerId, s.ContainerSrcPath, s.HostDestPath)
290290
out, err := cli.Execute(s.ExecOptions)
291-
return PostHandle(nil, s.Out, out, err, errno.ERR_COPY_FROM_CONTAINER_FAILED)
291+
return PostHandle(nil, s.Out, out, err, errno.ERR_COPY_FROM_CONTAINER_FAILED.FD("(%s cp CONTAINER:SRC_PATH DEST_PATH)", s.ExecWithEngine))
292292
}
293293

294294
func (s *CopyIntoContainer) Execute(ctx *context.Context) error {
295295
cli := ctx.Module().DockerCli().CopyIntoContainer(s.HostSrcPath, s.ContainerId, s.ContainerDestPath)
296296
out, err := cli.Execute(s.ExecOptions)
297-
return PostHandle(nil, s.Out, out, err, errno.ERR_COPY_INTO_CONTAINER_FAILED)
297+
return PostHandle(nil, s.Out, out, err, errno.ERR_COPY_INTO_CONTAINER_FAILED.FD("(%s cp SRC_PATH CONTAINER:DEST_PATH)", s.ExecWithEngine))
298298
}
299299

300300
func (s *InspectContainer) Execute(ctx *context.Context) error {
@@ -304,11 +304,11 @@ func (s *InspectContainer) Execute(ctx *context.Context) error {
304304
}
305305

306306
out, err := cli.Execute(s.ExecOptions)
307-
return PostHandle(s.Success, s.Out, out, err, errno.ERR_INSPECT_CONTAINER_FAILED)
307+
return PostHandle(s.Success, s.Out, out, err, errno.ERR_INSPECT_CONTAINER_FAILED.FD("(%s inspect ID)", s.ExecWithEngine))
308308
}
309309

310310
func (s *ContainerLogs) Execute(ctx *context.Context) error {
311311
cli := ctx.Module().DockerCli().ContainerLogs(s.ContainerId)
312312
out, err := cli.Execute(s.ExecOptions)
313-
return PostHandle(s.Success, s.Out, out, err, errno.ERR_GET_CONTAINER_LOGS_FAILED)
313+
return PostHandle(s.Success, s.Out, out, err, errno.ERR_GET_CONTAINER_LOGS_FAILED.FD("(%s logs ID)", s.ExecWithEngine))
314314
}

internal/task/step/file.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func (s *ReadFile) Execute(ctx *context.Context) error {
107107
dockerCli := ctx.Module().DockerCli().CopyFromContainer(s.ContainerId, s.ContainerSrcPath, remotePath)
108108
_, err := dockerCli.Execute(s.ExecOptions)
109109
if err != nil {
110-
return errno.ERR_COPY_FROM_CONTAINER_FAILED.E(err)
110+
return errno.ERR_COPY_FROM_CONTAINER_FAILED.FD("(%s cp CONTAINER:SRC_PATH DEST_PATH)", s.ExecWithEngine).E(err)
111111
}
112112
}
113113

@@ -172,7 +172,7 @@ func (s *InstallFile) Execute(ctx *context.Context) error {
172172
cli := ctx.Module().DockerCli().CopyIntoContainer(remotePath, *s.ContainerId, s.ContainerDestPath)
173173
_, err = cli.Execute(s.ExecOptions)
174174
if err != nil {
175-
return errno.ERR_COPY_INTO_CONTAINER_FAILED.E(err)
175+
return errno.ERR_COPY_INTO_CONTAINER_FAILED.FD(" (%scp SRC_PATH CONTAINER:DEST_PATH)", s.ExecWithEngine).E(err)
176176
}
177177
}
178178
return nil

internal/task/task/bs/start_nebd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,13 @@ func NewStartNEBDServiceTask(curveadm *cli.CurveAdm, cc *configure.ClientConfig)
164164
hostname := containerName
165165
host2addr := fmt.Sprintf("%s:%s", hostname, hc.GetHostname())
166166

167-
t.AddStep(&step.DockerInfo{
167+
t.AddStep(&step.EngineInfo{
168168
Success: &success,
169169
Out: &out,
170170
ExecOptions: curveadm.ExecOptions(),
171171
})
172172
t.AddStep(&step.Lambda{
173-
Lambda: checker.CheckDockerInfo(options.Host, &success, &out),
173+
Lambda: checker.CheckEngineInfo(options.Host, curveadm.ExecOptions().ExecWithEngine, &success, &out),
174174
})
175175
t.AddStep(&step.ListContainers{
176176
ShowAll: true,

internal/task/task/checker/permission.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,21 +87,21 @@ func checkCreateDirectory(dc *topology.DeployConfig, path string, success *bool,
8787
}
8888
}
8989

90-
func CheckDockerInfo(host string, success *bool, out *string) step.LambdaType {
90+
func CheckEngineInfo(host, engine string, success *bool, out *string) step.LambdaType {
9191
return func(ctx *context.Context) error {
9292
if *success {
9393
return nil
9494
}
9595

9696
*out = strings.ToLower(*out)
9797
if strings.Contains(*out, SIGNATURE_COMMAND_NOT_FOUND) {
98-
return errno.ERR_DOCKER_NOT_INSTALLED.
98+
return errno.ERR_CONTAINER_ENGINE_NOT_INSTALLED.
9999
F("host=%s\n%s", host, *out)
100100
} else if strings.Contains(*out, SIGNATURE_PERMISSION_DENIED) {
101-
return errno.ERR_EXECUTE_DOCKER_COMMAND_PERMISSION_DENIED.
101+
return errno.ERR_EXECUTE_CONTAINER_ENGINE_COMMAND_PERMISSION_DENIED.
102102
F("host=%s\n%s", host, *out)
103103
} else if strings.Contains(*out, SIGNATURE_PERMISSION_WITH_PASSWORD) {
104-
return errno.ERR_EXECUTE_DOCKER_COMMAND_PERMISSION_DENIED.
104+
return errno.ERR_EXECUTE_CONTAINER_ENGINE_COMMAND_PERMISSION_DENIED.
105105
F("host=%s (need password)", host)
106106
} else if strings.Contains(*out, SIGNATURE_DOCKER_DEAMON_IS_NOT_RUNNING) {
107107
return errno.ERR_DOCKER_DAEMON_IS_NOT_RUNNING.
@@ -164,14 +164,14 @@ func NewCheckPermissionTask(curveadm *cli.CurveAdm, dc *topology.DeployConfig) (
164164
Lambda: checkCreateDirectory(dc, dir.Path, &success, &out),
165165
})
166166
}
167-
// (4) check docker command {exist, permission, running}
168-
t.AddStep(&step.DockerInfo{
167+
// (4) check docker/podman engine command {exist, permission, running}
168+
t.AddStep(&step.EngineInfo{
169169
Success: &success,
170170
Out: &out,
171171
ExecOptions: curveadm.ExecOptions(),
172172
})
173173
t.AddStep(&step.Lambda{
174-
Lambda: CheckDockerInfo(dc.GetHost(), &success, &out),
174+
Lambda: CheckEngineInfo(dc.GetHost(), curveadm.ExecOptions().ExecWithEngine, &success, &out),
175175
})
176176

177177
return t, nil

0 commit comments

Comments
 (0)