Skip to content

Commit 57c4dde

Browse files
committed
refactor dockerDiscoverBackupTargets() to support having different kinds of producers
1 parent 1ab6e30 commit 57c4dde

2 files changed

Lines changed: 66 additions & 39 deletions

File tree

cmd/ubackup/backup.go

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,32 @@ func runBackup(ctx context.Context, logger *log.Logger) error {
7474
}
7575

7676
for _, containerTarget := range containerTargets {
77-
if err := backupOneContainer(ctx, containerTarget, *conf, logger); err != nil {
78-
handleOneFailure(containerTarget, err)
77+
if err := ubbackup.BackupAndStore(
78+
ctx,
79+
ubtypes.BackupForTarget(containerTarget.BackupTarget),
80+
*conf,
81+
containerTarget.Produce,
82+
logger,
83+
); err != nil {
84+
handleOneFailure(containerTarget.BackupTarget, err)
7985
}
8086
}
8187
}
8288

8389
for _, staticTarget := range conf.StaticTargets {
8490
staticTarget := staticTarget // pin
8591

86-
if err := ubbackup.BackupAndStore(ctx, ubtypes.BackupForTarget(staticTarget), *conf, func(backupSink io.Writer) error {
87-
return copyCommandStdout(exec.Command(staticTarget.BackupCommand[0], staticTarget.BackupCommand[1:]...), backupSink)
88-
}, logger); err != nil {
92+
if err := ubbackup.BackupAndStore(
93+
ctx,
94+
ubtypes.BackupForTarget(staticTarget),
95+
*conf,
96+
func(backupSink io.Writer) error {
97+
return copyCommandStdout(
98+
exec.Command(staticTarget.BackupCommand[0], staticTarget.BackupCommand[1:]...),
99+
backupSink)
100+
},
101+
logger,
102+
); err != nil {
89103
handleOneFailure(staticTarget, err)
90104
}
91105
}
@@ -116,25 +130,6 @@ func runBackup(ctx context.Context, logger *log.Logger) error {
116130
return nil
117131
}
118132

119-
func backupOneContainer(
120-
ctx context.Context,
121-
target ubtypes.BackupTarget,
122-
conf ubconfig.Config,
123-
logger *log.Logger,
124-
) error {
125-
return ubbackup.BackupAndStore(ctx, ubtypes.BackupForTarget(target), conf, func(backupSink io.Writer) error {
126-
dockerExecCmd := append([]string{
127-
"docker",
128-
"exec",
129-
target.TaskId,
130-
}, target.BackupCommand...)
131-
132-
return copyCommandStdout(
133-
exec.Command(dockerExecCmd[0], dockerExecCmd[1:]...),
134-
backupSink)
135-
}, logger)
136-
}
137-
138133
func copyCommandStdout(cmd *exec.Cmd, backupSink io.Writer) error {
139134
cmd.Stderr = os.Stderr
140135
stdout, err := cmd.StdoutPipe()

cmd/ubackup/dockerdiscovery.go

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,23 @@ import (
77
"github.com/function61/gokit/ezhttp"
88
"github.com/function61/gokit/udocker"
99
"github.com/function61/ubackup/pkg/ubtypes"
10+
"io"
1011
"net/http"
12+
"os/exec"
1113
"strings"
1214
)
1315

1416
const (
1517
backupCommandEnvKey = "BACKUP_COMMAND"
1618
)
1719

20+
type DockerTarget struct {
21+
BackupTarget ubtypes.BackupTarget
22+
Produce func(backupSink io.Writer) error
23+
}
24+
1825
// returns containers that have ENV var "BACKUP_COMMAND" defined
19-
func dockerDiscoverBackupTargets(ctx context.Context, dockerEndpoint string) ([]ubtypes.BackupTarget, error) {
26+
func dockerDiscoverBackupTargets(ctx context.Context, dockerEndpoint string) ([]DockerTarget, error) {
2027
dockerClient, base, err := udocker.Client(dockerEndpoint, nil, false)
2128
if err != nil {
2229
return nil, fmt.Errorf("udocker.Client: %v", err)
@@ -41,29 +48,54 @@ func dockerDiscoverBackupTargets(ctx context.Context, dockerEndpoint string) ([]
4148
return nil, err
4249
}
4350

44-
targets := []ubtypes.BackupTarget{}
51+
targets := []DockerTarget{}
4552

4653
for _, inspected := range inspecteds {
54+
foundBackupCommand := ""
55+
4756
for _, envSerialized := range inspected.Config.Env {
4857
key, value := envvar.Parse(envSerialized)
49-
if key != backupCommandEnvKey {
50-
continue
58+
if key == backupCommandEnvKey {
59+
foundBackupCommand = value
5160
}
61+
}
5262

53-
serviceName := inspected.Config.Labels[udocker.SwarmServiceNameLabelKey]
54-
if serviceName == "" {
55-
serviceName = "none"
56-
}
63+
if foundBackupCommand == "" {
64+
continue
65+
}
5766

58-
// FIXME
59-
backupCommandParsed := strings.Split(value, " ")
67+
serviceName := inspected.Config.Labels[udocker.SwarmServiceNameLabelKey]
68+
if serviceName == "" {
69+
serviceName = "none"
70+
}
71+
72+
// FIXME
73+
backupCommandParsed := strings.Split(foundBackupCommand, " ")
6074

61-
targets = append(targets, ubtypes.BackupTarget{
62-
ServiceName: serviceName,
63-
TaskId: inspected.Id[0:12], // Docker CLI truncates ids to this long. using same here to shorten filenames
64-
BackupCommand: backupCommandParsed,
65-
})
75+
target := ubtypes.BackupTarget{
76+
ServiceName: serviceName,
77+
TaskId: inspected.Id[0:12], // Docker CLI truncates ids to this long. using same here to shorten filenames
78+
BackupCommand: backupCommandParsed,
6679
}
80+
81+
producer := func(target ubtypes.BackupTarget) func(io.Writer) error {
82+
return func(backupSink io.Writer) error {
83+
dockerExecCmd := append([]string{
84+
"docker",
85+
"exec",
86+
target.TaskId,
87+
}, target.BackupCommand...)
88+
89+
return copyCommandStdout(
90+
exec.Command(dockerExecCmd[0], dockerExecCmd[1:]...),
91+
backupSink)
92+
}
93+
}(target)
94+
95+
targets = append(targets, DockerTarget{
96+
Produce: producer,
97+
BackupTarget: target,
98+
})
6799
}
68100

69101
return targets, nil

0 commit comments

Comments
 (0)