Skip to content

Commit

Permalink
Try scaling down services
Browse files Browse the repository at this point in the history
  • Loading branch information
m90 committed Jan 25, 2024
1 parent 4b79a05 commit 27017e6
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 15 deletions.
63 changes: 48 additions & 15 deletions cmd/backup/script.go
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,12 @@ func (s *script) stopContainersAndServices() (func() error, error) {
return noop, nil
}

dockerInfo, err := s.cli.Info(context.Background())
if err != nil {
return noop, fmt.Errorf("stopContainers: error getting docker info: %w", err)
}
isDockerSwarm := dockerInfo.Swarm.LocalNodeState != "inactive"

matchLabel := fmt.Sprintf(
"docker-volume-backup.stop-during-backup=%s",
s.c.BackupStopContainerLabel,
Expand All @@ -345,18 +351,22 @@ func (s *script) stopContainersAndServices() (func() error, error) {
return noop, fmt.Errorf("stopContainers: error querying for containers to stop: %w", err)
}

allServices, err := s.cli.ServiceList(context.Background(), types.ServiceListOptions{})
if err != nil {
return noop, fmt.Errorf("stopContainers: error querying for services: %w", err)
}
servicesToScaleDown, err := s.cli.ServiceList(context.Background(), types.ServiceListOptions{
Filters: filters.NewArgs(filters.KeyValuePair{
Key: "label",
Value: matchLabel,
}),
})
if err != nil {
return noop, fmt.Errorf("stopContainers: error querying for services to scale down: %w", err)
var allServices []swarm.Service
var servicesToScaleDown []swarm.Service
if isDockerSwarm {
allServices, err = s.cli.ServiceList(context.Background(), types.ServiceListOptions{})
if err != nil {
return noop, fmt.Errorf("stopContainers: error querying for services: %w", err)
}
servicesToScaleDown, err = s.cli.ServiceList(context.Background(), types.ServiceListOptions{
Filters: filters.NewArgs(filters.KeyValuePair{
Key: "label",
Value: matchLabel,
}),
})
if err != nil {
return noop, fmt.Errorf("stopContainers: error querying for services to scale down: %w", err)
}
}

if len(containersToStop) == 0 && len(servicesToScaleDown) == 0 {
Expand Down Expand Up @@ -393,10 +403,33 @@ func (s *script) stopContainersAndServices() (func() error, error) {
)
}

var scaledDownServices []swarm.Service
var scaleDownErrors []error
if isDockerSwarm {
for _, service := range servicesToScaleDown {
var zero uint64
service.Spec.Mode.Replicated.Replicas = &zero
service.Spec.TaskTemplate.ForceUpdate += 1
if _, err := s.cli.ServiceUpdate(context.Background(), service.ID, service.Version, service.Spec, types.ServiceUpdateOptions{}); err != nil {
scaleDownErrors = append(scaleDownErrors, err)
} else {
scaledDownServices = append(scaledDownServices, service)
}
}
}

s.stats.Containers = ContainersStats{
All: uint(len(allContainers)),
ToStop: uint(len(containersToStop)),
Stopped: uint(len(stoppedContainers)),
All: uint(len(allContainers)),
ToStop: uint(len(containersToStop)),
Stopped: uint(len(stoppedContainers)),
StopErrors: uint(len(stopErrors)),
}

s.stats.Services = ServicesStats{
All: uint(len(allServices)),
ToScaleDown: uint(len(servicesToScaleDown)),
ScaledDown: uint(len(scaledDownServices)),
ScaleDownErrors: uint(len(scaleDownErrors)),
}

return func() error {
Expand Down
10 changes: 10 additions & 0 deletions cmd/backup/stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ type ContainersStats struct {
StopErrors uint
}

// ServicesStats contains info about Swarm services that have been
// operated upon
type ServicesStats struct {
All uint
ToScaleDown uint
ScaledDown uint
ScaleDownErrors uint
}

// BackupFileStats stats about the created backup file
type BackupFileStats struct {
Name string
Expand All @@ -40,6 +49,7 @@ type Stats struct {
LockedTime time.Duration
LogOutput *bytes.Buffer
Containers ContainersStats
Services ServicesStats
BackupFile BackupFileStats
Storages map[string]StorageStats
}

0 comments on commit 27017e6

Please sign in to comment.