63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/docker/docker/api/types/filters"
|
|
"github.com/docker/docker/api/types/volume"
|
|
"github.com/docker/docker/client"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func GetVolumes(cl *client.Client, ctx context.Context, server string, fs filters.Args) ([]*volume.Volume, error) {
|
|
volumeListOKBody, err := cl.VolumeList(ctx, volume.ListOptions{Filters: fs})
|
|
volumeList := volumeListOKBody.Volumes
|
|
if err != nil {
|
|
return volumeList, err
|
|
}
|
|
|
|
return volumeList, nil
|
|
}
|
|
|
|
func GetVolumeNames(volumes []*volume.Volume) []string {
|
|
var volumeNames []string
|
|
|
|
for _, vol := range volumes {
|
|
volumeNames = append(volumeNames, vol.Name)
|
|
}
|
|
|
|
return volumeNames
|
|
}
|
|
|
|
func RemoveVolumes(cl *client.Client, ctx context.Context, volumeNames []string, force bool, retries int) error {
|
|
for _, volName := range volumeNames {
|
|
err := retryFunc(5, func() error {
|
|
return cl.VolumeRemove(context.Background(), volName, force)
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("volume %s: %s", volName, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// retryFunc retries the given function for the given retries. After the nth
|
|
// retry it waits (n + 1)^2 seconds before the next retry (starting with n=0).
|
|
// It returns an error if the function still failed after the last retry.
|
|
func retryFunc(retries int, fn func() error) error {
|
|
for i := 0; i < retries; i++ {
|
|
err := fn()
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
if i+1 < retries {
|
|
sleep := time.Duration(i+1) * time.Duration(i+1)
|
|
logrus.Infof("%s: waiting %d seconds before next retry", err, sleep)
|
|
time.Sleep(sleep * time.Second)
|
|
}
|
|
}
|
|
return fmt.Errorf("%d retries failed", retries)
|
|
}
|