mirror of
https://github.com/offen/docker-volume-backup.git
synced 2024-11-23 05:30:33 +01:00
Try scaling down services
This commit is contained in:
parent
270ca65efa
commit
8ef7fa0d5d
@ -326,6 +326,12 @@ func (s *script) stopContainersAndServices() (func() error, error) {
|
|||||||
return noop, nil
|
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(
|
matchLabel := fmt.Sprintf(
|
||||||
"docker-volume-backup.stop-during-backup=%s",
|
"docker-volume-backup.stop-during-backup=%s",
|
||||||
s.c.BackupStopContainerLabel,
|
s.c.BackupStopContainerLabel,
|
||||||
@ -345,18 +351,22 @@ func (s *script) stopContainersAndServices() (func() error, error) {
|
|||||||
return noop, fmt.Errorf("stopContainers: error querying for containers to stop: %w", err)
|
return noop, fmt.Errorf("stopContainers: error querying for containers to stop: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
allServices, err := s.cli.ServiceList(context.Background(), types.ServiceListOptions{})
|
var allServices []swarm.Service
|
||||||
if err != nil {
|
var servicesToScaleDown []swarm.Service
|
||||||
return noop, fmt.Errorf("stopContainers: error querying for services: %w", err)
|
if isDockerSwarm {
|
||||||
}
|
allServices, err = s.cli.ServiceList(context.Background(), types.ServiceListOptions{})
|
||||||
servicesToScaleDown, err := s.cli.ServiceList(context.Background(), types.ServiceListOptions{
|
if err != nil {
|
||||||
Filters: filters.NewArgs(filters.KeyValuePair{
|
return noop, fmt.Errorf("stopContainers: error querying for services: %w", err)
|
||||||
Key: "label",
|
}
|
||||||
Value: matchLabel,
|
servicesToScaleDown, err = s.cli.ServiceList(context.Background(), types.ServiceListOptions{
|
||||||
}),
|
Filters: filters.NewArgs(filters.KeyValuePair{
|
||||||
})
|
Key: "label",
|
||||||
if err != nil {
|
Value: matchLabel,
|
||||||
return noop, fmt.Errorf("stopContainers: error querying for services to scale down: %w", err)
|
}),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return noop, fmt.Errorf("stopContainers: error querying for services to scale down: %w", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(containersToStop) == 0 && len(servicesToScaleDown) == 0 {
|
if len(containersToStop) == 0 && len(servicesToScaleDown) == 0 {
|
||||||
@ -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{
|
s.stats.Containers = ContainersStats{
|
||||||
All: uint(len(allContainers)),
|
All: uint(len(allContainers)),
|
||||||
ToStop: uint(len(containersToStop)),
|
ToStop: uint(len(containersToStop)),
|
||||||
Stopped: uint(len(stoppedContainers)),
|
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 {
|
return func() error {
|
||||||
|
@ -17,6 +17,15 @@ type ContainersStats struct {
|
|||||||
StopErrors uint
|
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
|
// BackupFileStats stats about the created backup file
|
||||||
type BackupFileStats struct {
|
type BackupFileStats struct {
|
||||||
Name string
|
Name string
|
||||||
@ -40,6 +49,7 @@ type Stats struct {
|
|||||||
LockedTime time.Duration
|
LockedTime time.Duration
|
||||||
LogOutput *bytes.Buffer
|
LogOutput *bytes.Buffer
|
||||||
Containers ContainersStats
|
Containers ContainersStats
|
||||||
|
Services ServicesStats
|
||||||
BackupFile BackupFileStats
|
BackupFile BackupFileStats
|
||||||
Storages map[string]StorageStats
|
Storages map[string]StorageStats
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user