93 lines
2.8 KiB
Go
93 lines
2.8 KiB
Go
package run
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/filters"
|
|
"github.com/docker/docker/api/types/volume"
|
|
"github.com/docker/docker/client"
|
|
)
|
|
|
|
// createImageVolume will create a new docker volume used for storing image tarballs that can be loaded into the clusters
|
|
func createImageVolume(clusterName string) (types.Volume, error) {
|
|
|
|
var vol types.Volume
|
|
|
|
ctx := context.Background()
|
|
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
|
|
if err != nil {
|
|
return vol, fmt.Errorf("ERROR: couldn't create docker client\n%+v", err)
|
|
}
|
|
|
|
volName := fmt.Sprintf("k3d-%s-images", clusterName)
|
|
|
|
volumeCreateOptions := volume.VolumeCreateBody{
|
|
Name: volName,
|
|
Labels: map[string]string{
|
|
"app": "k3d",
|
|
"cluster": clusterName,
|
|
},
|
|
Driver: "local", //TODO: allow setting driver + opts
|
|
DriverOpts: map[string]string{},
|
|
}
|
|
vol, err = docker.VolumeCreate(ctx, volumeCreateOptions)
|
|
if err != nil {
|
|
return vol, fmt.Errorf("ERROR: failed to create image volume [%s] for cluster [%s]\n%+v", volName, clusterName, err)
|
|
}
|
|
|
|
return vol, nil
|
|
}
|
|
|
|
// deleteImageVolume will delete the volume we created for sharing images with this cluster
|
|
func deleteImageVolume(clusterName string) error {
|
|
|
|
ctx := context.Background()
|
|
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
|
|
if err != nil {
|
|
return fmt.Errorf("ERROR: couldn't create docker client\n%+v", err)
|
|
}
|
|
|
|
volName := fmt.Sprintf("k3d-%s-images", clusterName)
|
|
|
|
if err = docker.VolumeRemove(ctx, volName, true); err != nil {
|
|
return fmt.Errorf("ERROR: couldn't remove volume [%s] for cluster [%s]\n%+v", volName, clusterName, err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// getImageVolume returns the docker volume object representing the imagevolume for the cluster
|
|
func getImageVolume(clusterName string) (types.Volume, error) {
|
|
var vol types.Volume
|
|
volName := fmt.Sprintf("k3d-%s-images", clusterName)
|
|
|
|
ctx := context.Background()
|
|
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
|
|
if err != nil {
|
|
return vol, fmt.Errorf("ERROR: couldn't create docker client\n%+v", err)
|
|
}
|
|
|
|
filters := filters.NewArgs()
|
|
filters.Add("label", "app=k3d")
|
|
filters.Add("label", fmt.Sprintf("cluster=%s", clusterName))
|
|
volumeList, err := docker.VolumeList(ctx, filters)
|
|
if err != nil {
|
|
return vol, fmt.Errorf("ERROR: couldn't get volumes for cluster [%s]\n%+v ", clusterName, err)
|
|
}
|
|
volFound := false
|
|
for _, volume := range volumeList.Volumes {
|
|
if volume.Name == volName {
|
|
vol = *volume
|
|
volFound = true
|
|
break
|
|
}
|
|
}
|
|
if !volFound {
|
|
return vol, fmt.Errorf("ERROR: didn't find volume [%s] in list of volumes returned for cluster [%s]", volName, clusterName)
|
|
}
|
|
|
|
return vol, nil
|
|
}
|