overall: pass context from top to bottom

pull/244/head
iwilltry42 4 years ago
parent 639daef7fb
commit 434cf8e91d
No known key found for this signature in database
GPG Key ID: 7BA57AD1CFF16110
  1. 2
      cmd/start/startNode.go
  2. 2
      cmd/stop/stopNode.go
  3. 22
      pkg/cluster/cluster.go
  4. 4
      pkg/cluster/kubeconfig.go
  5. 2
      pkg/cluster/loadbalancer.go
  6. 10
      pkg/cluster/node.go
  7. 3
      pkg/runtimes/containerd/kubeconfig.go
  8. 6
      pkg/runtimes/containerd/network.go
  9. 18
      pkg/runtimes/containerd/node.go
  10. 6
      pkg/runtimes/containerd/volume.go
  11. 9
      pkg/runtimes/docker/container.go
  12. 5
      pkg/runtimes/docker/kubeconfig.go
  13. 9
      pkg/runtimes/docker/network.go
  14. 44
      pkg/runtimes/docker/node.go
  15. 3
      pkg/runtimes/docker/translate.go
  16. 6
      pkg/runtimes/docker/volume.go
  17. 27
      pkg/runtimes/runtime.go
  18. 10
      pkg/tools/tools.go

@ -40,7 +40,7 @@ func NewCmdStartNode() *cobra.Command {
Run: func(cmd *cobra.Command, args []string) {
log.Debugln("start node called")
node := parseStartNodeCmd(cmd, args)
if err := runtimes.SelectedRuntime.StartNode(node); err != nil {
if err := runtimes.SelectedRuntime.StartNode(cmd.Context(), node); err != nil {
log.Fatalln(err)
}
},

@ -41,7 +41,7 @@ func NewCmdStopNode() *cobra.Command {
Run: func(cmd *cobra.Command, args []string) {
log.Debugln("stop node called")
node := parseStopNodeCmd(cmd, args)
if err := runtimes.SelectedRuntime.StopNode(node); err != nil {
if err := runtimes.SelectedRuntime.StopNode(cmd.Context(), node); err != nil {
log.Fatalln(err)
}
},

@ -70,7 +70,7 @@ func CreateCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus
}
// create cluster network or use an existing one
networkID, networkExists, err := runtime.CreateNetworkIfNotPresent(cluster.Network.Name)
networkID, networkExists, err := runtime.CreateNetworkIfNotPresent(ctx, cluster.Network.Name)
if err != nil {
log.Errorln("Failed to create cluster network")
return err
@ -98,7 +98,7 @@ func CreateCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus
*/
if !cluster.CreateClusterOpts.DisableImageVolume {
imageVolumeName := fmt.Sprintf("%s-%s-images", k3d.DefaultObjectNamePrefix, cluster.Name)
if err := runtime.CreateVolume(imageVolumeName, map[string]string{"k3d.cluster": cluster.Name}); err != nil {
if err := runtime.CreateVolume(ctx, imageVolumeName, map[string]string{"k3d.cluster": cluster.Name}); err != nil {
log.Errorln("Failed to create image volume '%s' for cluster '%s'", imageVolumeName, cluster.Name)
return err
}
@ -191,7 +191,7 @@ func CreateCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus
default:
}
log.Debugln("Waiting for initializing master node...")
logreader, err := runtime.GetNodeLogs(cluster.InitNode)
logreader, err := runtime.GetNodeLogs(ctx, cluster.InitNode)
if err != nil {
if logreader != nil {
logreader.Close()
@ -324,7 +324,7 @@ func DeleteCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus
failed := 0
for _, node := range cluster.Nodes {
if err := runtime.DeleteNode(node); err != nil {
if err := runtime.DeleteNode(ctx, node); err != nil {
log.Warningf("Failed to delete node '%s': Try to delete it manually", node.Name)
failed++
continue
@ -335,7 +335,7 @@ func DeleteCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus
if cluster.Network.Name != "" {
if !cluster.Network.External {
log.Infof("Deleting cluster network '%s'", cluster.Network.Name)
if err := runtime.DeleteNetwork(cluster.Network.Name); err != nil {
if err := runtime.DeleteNetwork(ctx, cluster.Network.Name); err != nil {
if strings.HasSuffix(err.Error(), "active endpoints") {
log.Warningf("Failed to delete cluster network '%s' because it's still in use: is there another cluster using it?", cluster.Network.Name)
} else {
@ -350,7 +350,7 @@ func DeleteCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus
// delete image volume
if cluster.ImageVolume != "" {
log.Infof("Deleting image volume '%s'", cluster.ImageVolume)
if err := runtime.DeleteVolume(cluster.ImageVolume); err != nil {
if err := runtime.DeleteVolume(ctx, cluster.ImageVolume); err != nil {
log.Warningf("Failed to delete image volume '%s' of cluster '%s': Try to delete it manually", cluster.ImageVolume, cluster.Name)
}
}
@ -364,7 +364,7 @@ func DeleteCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clus
// GetClusters returns a list of all existing clusters
func GetClusters(ctx context.Context, runtime k3drt.Runtime) ([]*k3d.Cluster, error) {
nodes, err := runtime.GetNodesByLabel(k3d.DefaultObjectLabels)
nodes, err := runtime.GetNodesByLabel(ctx, k3d.DefaultObjectLabels)
if err != nil {
log.Errorln("Failed to get clusters")
return nil, err
@ -439,7 +439,7 @@ func populateClusterFieldsFromLabels(cluster *k3d.Cluster) error {
// GetCluster returns an existing cluster with all fields and node lists populated
func GetCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Cluster) (*k3d.Cluster, error) {
// get nodes that belong to the selected cluster
nodes, err := runtime.GetNodesByLabel(map[string]string{"k3d.cluster": cluster.Name})
nodes, err := runtime.GetNodesByLabel(ctx, map[string]string{"k3d.cluster": cluster.Name})
if err != nil {
log.Errorf("Failed to get nodes for cluster '%s'", cluster.Name)
}
@ -485,7 +485,7 @@ func StartCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clust
}
// start node
if err := runtime.StartNode(node); err != nil {
if err := runtime.StartNode(ctx, node); err != nil {
log.Warningf("Failed to start node '%s': Try to start it manually", node.Name)
failed++
continue
@ -495,7 +495,7 @@ func StartCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Clust
// start masterlb
if masterlb != nil {
log.Debugln("Starting masterlb...")
if err := runtime.StartNode(masterlb); err != nil { // FIXME: we could run into a nullpointer exception here
if err := runtime.StartNode(ctx, masterlb); err != nil { // FIXME: we could run into a nullpointer exception here
log.Warningf("Failed to start masterlb '%s': Try to start it manually", masterlb.Name)
failed++
}
@ -513,7 +513,7 @@ func StopCluster(ctx context.Context, runtime k3drt.Runtime, cluster *k3d.Cluste
failed := 0
for _, node := range cluster.Nodes {
if err := runtime.StopNode(node); err != nil {
if err := runtime.StopNode(ctx, node); err != nil {
log.Warningf("Failed to stop node '%s': Try to stop it manually", node.Name)
failed++
continue

@ -113,7 +113,7 @@ func GetAndWriteKubeConfig(ctx context.Context, runtime runtimes.Runtime, cluste
func GetKubeconfig(ctx context.Context, runtime runtimes.Runtime, cluster *k3d.Cluster) (*clientcmdapi.Config, error) {
// get all master nodes for the selected cluster
// TODO: getKubeconfig: we should make sure, that the master node we're trying to fetch from is actually running
masterNodes, err := runtime.GetNodesByLabel(map[string]string{"k3d.cluster": cluster.Name, "k3d.role": string(k3d.MasterRole)})
masterNodes, err := runtime.GetNodesByLabel(ctx, map[string]string{"k3d.cluster": cluster.Name, "k3d.role": string(k3d.MasterRole)})
if err != nil {
log.Errorln("Failed to get master nodes")
return nil, err
@ -143,7 +143,7 @@ func GetKubeconfig(ctx context.Context, runtime runtimes.Runtime, cluster *k3d.C
chosenMaster = masterNodes[0]
}
// get the kubeconfig from the first master node
reader, err := runtime.GetKubeconfig(chosenMaster)
reader, err := runtime.GetKubeconfig(ctx, chosenMaster)
if err != nil {
log.Errorf("Failed to get kubeconfig from node '%s'", chosenMaster.Name)
return nil, err

@ -50,7 +50,7 @@ func AddMasterToLoadBalancer(ctx context.Context, runtime runtimes.Runtime, clus
log.Debugf("SERVERS=%s", masterNodes)
command := fmt.Sprintf("SERVERS=%s %s", masterNodes, "confd -onetime -backend env && nginx -s reload")
if err := runtime.ExecInNode(loadbalancer, []string{"sh", "-c", command}); err != nil {
if err := runtime.ExecInNode(ctx, loadbalancer, []string{"sh", "-c", command}); err != nil {
log.Errorln("Failed to update loadbalancer configuration")
return err
}

@ -168,7 +168,7 @@ func CreateNode(ctx context.Context, runtime runtimes.Runtime, node *k3d.Node) e
/*
* CREATION
*/
if err := runtime.CreateNode(node); err != nil {
if err := runtime.CreateNode(ctx, node); err != nil {
return err
}
@ -178,7 +178,7 @@ func CreateNode(ctx context.Context, runtime runtimes.Runtime, node *k3d.Node) e
// DeleteNode deletes an existing node
func DeleteNode(ctx context.Context, runtime runtimes.Runtime, node *k3d.Node) error {
if err := runtime.DeleteNode(node); err != nil {
if err := runtime.DeleteNode(ctx, node); err != nil {
log.Error(err)
}
return nil
@ -213,7 +213,7 @@ func patchMasterSpec(node *k3d.Node) error {
// GetNodes returns a list of all existing clusters
func GetNodes(ctx context.Context, runtime runtimes.Runtime) ([]*k3d.Node, error) {
nodes, err := runtime.GetNodesByLabel(k3d.DefaultObjectLabels)
nodes, err := runtime.GetNodesByLabel(ctx, k3d.DefaultObjectLabels)
if err != nil {
log.Errorln("Failed to get nodes")
return nil, err
@ -225,7 +225,7 @@ func GetNodes(ctx context.Context, runtime runtimes.Runtime) ([]*k3d.Node, error
// GetNode returns a node matching the specified node fields
func GetNode(ctx context.Context, runtime runtimes.Runtime, node *k3d.Node) (*k3d.Node, error) {
// get node
node, err := runtime.GetNode(node)
node, err := runtime.GetNode(ctx, node)
if err != nil {
log.Errorf("Failed to get node '%s'", node.Name)
}
@ -243,7 +243,7 @@ func WaitForNodeLogMessage(ctx context.Context, runtime runtimes.Runtime, node *
}
// read the logs
out, err := runtime.GetNodeLogs(node)
out, err := runtime.GetNodeLogs(ctx, node)
if err != nil {
if out != nil {
out.Close()

@ -23,12 +23,13 @@ THE SOFTWARE.
package containerd
import (
"context"
"io"
k3d "github.com/rancher/k3d/pkg/types"
)
// GetKubeconfig grabs the kubeconfig from inside a k3d node
func (d Containerd) GetKubeconfig(node *k3d.Node) (io.ReadCloser, error) {
func (d Containerd) GetKubeconfig(ctx context.Context, node *k3d.Node) (io.ReadCloser, error) {
return nil, nil
}

@ -21,12 +21,14 @@ THE SOFTWARE.
*/
package containerd
import "context"
// CreateNetworkIfNotPresent creates a new docker network
func (d Containerd) CreateNetworkIfNotPresent(name string) (string, bool, error) {
func (d Containerd) CreateNetworkIfNotPresent(ctx context.Context, name string) (string, bool, error) {
return "", false, nil
}
// DeleteNetwork deletes a network
func (d Containerd) DeleteNetwork(ID string) error {
func (d Containerd) DeleteNetwork(ctx context.Context, ID string) error {
return nil
}

@ -33,11 +33,10 @@ import (
)
// CreateNode creates a new k3d node
func (d Containerd) CreateNode(node *k3d.Node) error {
func (d Containerd) CreateNode(ctx context.Context, node *k3d.Node) error {
log.Debugln("containerd.CreateNode...")
// create containerd client
ctx := context.Background()
clientOpts := []containerd.ClientOpt{
containerd.WithDefaultNamespace("k3d"),
}
@ -77,9 +76,8 @@ func (d Containerd) CreateNode(node *k3d.Node) error {
}
// DeleteNode deletes an existing k3d node
func (d Containerd) DeleteNode(node *k3d.Node) error {
func (d Containerd) DeleteNode(ctx context.Context, node *k3d.Node) error {
log.Debugln("containerd.DeleteNode...")
ctx := context.Background()
clientOpts := []containerd.ClientOpt{
containerd.WithDefaultNamespace("k3d"),
}
@ -103,30 +101,30 @@ func (d Containerd) DeleteNode(node *k3d.Node) error {
}
// StartNode starts an existing node
func (d Containerd) StartNode(node *k3d.Node) error {
func (d Containerd) StartNode(ctx context.Context, node *k3d.Node) error {
return nil // TODO: fill
}
// StopNode stops an existing node
func (d Containerd) StopNode(node *k3d.Node) error {
func (d Containerd) StopNode(ctx context.Context, node *k3d.Node) error {
return nil // TODO: fill
}
func (d Containerd) GetNodesByLabel(labels map[string]string) ([]*k3d.Node, error) {
func (d Containerd) GetNodesByLabel(ctx context.Context, labels map[string]string) ([]*k3d.Node, error) {
return nil, nil
}
// GetNode tries to get a node container by its name
func (d Containerd) GetNode(node *k3d.Node) (*k3d.Node, error) {
func (d Containerd) GetNode(ctx context.Context, node *k3d.Node) (*k3d.Node, error) {
return nil, nil
}
// GetNodeLogs returns the logs from a given node
func (d Containerd) GetNodeLogs(node *k3d.Node) (io.ReadCloser, error) {
func (d Containerd) GetNodeLogs(ctx context.Context, node *k3d.Node) (io.ReadCloser, error) {
return nil, nil
}
// ExecInNode execs a command inside a node
func (d Containerd) ExecInNode(node *k3d.Node, cmd []string) error {
func (d Containerd) ExecInNode(ctx context.Context, node *k3d.Node, cmd []string) error {
return nil
}

@ -21,12 +21,14 @@ THE SOFTWARE.
*/
package containerd
import "context"
// CreateVolume creates a new named volume
func (d Containerd) CreateVolume(name string, labels map[string]string) error {
func (d Containerd) CreateVolume(ctx context.Context, name string, labels map[string]string) error {
return nil
}
// DeleteVolume creates a new named volume
func (d Containerd) DeleteVolume(name string) error {
func (d Containerd) DeleteVolume(ctx context.Context, name string) error {
return nil
}

@ -38,12 +38,11 @@ import (
)
// createContainer creates a new docker container from translated specs
func createContainer(dockerNode *NodeInDocker, name string) error {
func createContainer(ctx context.Context, dockerNode *NodeInDocker, name string) error {
log.Debugf("Creating docker container with translated config\n%+v\n", dockerNode) // TODO: remove?
// initialize docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")
@ -80,10 +79,9 @@ func createContainer(dockerNode *NodeInDocker, name string) error {
}
// removeContainer deletes a running container (like docker rm -f)
func removeContainer(ID string) error {
func removeContainer(ctx context.Context, ID string) error {
// (0) create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")
@ -135,9 +133,8 @@ func pullImage(ctx *context.Context, docker *client.Client, image string) error
}
func getNodeContainer(node *k3d.Node) (*types.Container, error) {
func getNodeContainer(ctx context.Context, node *k3d.Node) (*types.Container, error) {
// (0) create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")

@ -32,8 +32,7 @@ import (
)
// GetKubeconfig grabs the kubeconfig from inside a k3d node
func (d Docker) GetKubeconfig(node *k3d.Node) (io.ReadCloser, error) {
ctx := context.Background()
func (d Docker) GetKubeconfig(ctx context.Context, node *k3d.Node) (io.ReadCloser, error) {
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")
@ -41,7 +40,7 @@ func (d Docker) GetKubeconfig(node *k3d.Node) (io.ReadCloser, error) {
}
defer docker.Close()
container, err := getNodeContainer(node)
container, err := getNodeContainer(ctx, node)
if err != nil {
return nil, err
}

@ -34,10 +34,9 @@ import (
// CreateNetworkIfNotPresent creates a new docker network
// @return: network name, exists, error
func (d Docker) CreateNetworkIfNotPresent(name string) (string, bool, error) {
func (d Docker) CreateNetworkIfNotPresent(ctx context.Context, name string) (string, bool, error) {
// (0) create new docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")
@ -82,9 +81,8 @@ func (d Docker) CreateNetworkIfNotPresent(name string) (string, bool, error) {
}
// DeleteNetwork deletes a network
func (d Docker) DeleteNetwork(ID string) error {
func (d Docker) DeleteNetwork(ctx context.Context, ID string) error {
// (0) create new docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")
@ -97,8 +95,7 @@ func (d Docker) DeleteNetwork(ID string) error {
}
// GetNetwork gets information about a network by its ID
func GetNetwork(ID string) (types.NetworkResource, error) {
ctx := context.Background()
func GetNetwork(ctx context.Context, ID string) (types.NetworkResource, error) {
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")

@ -37,7 +37,7 @@ import (
)
// CreateNode creates a new container
func (d Docker) CreateNode(node *k3d.Node) error {
func (d Docker) CreateNode(ctx context.Context, node *k3d.Node) error {
// translate node spec to docker container specs
dockerNode, err := TranslateNodeToContainer(node)
@ -47,7 +47,7 @@ func (d Docker) CreateNode(node *k3d.Node) error {
}
// create node
if err := createContainer(dockerNode, node.Name); err != nil {
if err := createContainer(ctx, dockerNode, node.Name); err != nil {
log.Errorln("Failed to create k3d node")
return err
}
@ -56,16 +56,16 @@ func (d Docker) CreateNode(node *k3d.Node) error {
}
// DeleteNode deletes a node
func (d Docker) DeleteNode(nodeSpec *k3d.Node) error {
func (d Docker) DeleteNode(ctx context.Context, nodeSpec *k3d.Node) error {
log.Debugln("docker.DeleteNode...")
return removeContainer(nodeSpec.Name)
return removeContainer(ctx, nodeSpec.Name)
}
// GetNodesByLabel returns a list of existing nodes
func (d Docker) GetNodesByLabel(labels map[string]string) ([]*k3d.Node, error) {
func (d Docker) GetNodesByLabel(ctx context.Context, labels map[string]string) ([]*k3d.Node, error) {
// (0) get containers
containers, err := getContainersByLabel(labels)
containers, err := getContainersByLabel(ctx, labels)
if err != nil {
return nil, err
}
@ -85,9 +85,8 @@ func (d Docker) GetNodesByLabel(labels map[string]string) ([]*k3d.Node, error) {
}
// StartNode starts an existing node
func (d Docker) StartNode(node *k3d.Node) error {
func (d Docker) StartNode(ctx context.Context, node *k3d.Node) error {
// (0) create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return fmt.Errorf("Failed to create docker client. %+v", err)
@ -95,7 +94,7 @@ func (d Docker) StartNode(node *k3d.Node) error {
defer docker.Close()
// get container which represents the node
nodeContainer, err := getNodeContainer(node)
nodeContainer, err := getNodeContainer(ctx, node)
if err != nil {
log.Errorf("Failed to get container for node '%s'", node.Name)
return err
@ -116,9 +115,8 @@ func (d Docker) StartNode(node *k3d.Node) error {
}
// StopNode stops an existing node
func (d Docker) StopNode(node *k3d.Node) error {
func (d Docker) StopNode(ctx context.Context, node *k3d.Node) error {
// (0) create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return fmt.Errorf("Failed to create docker client. %+v", err)
@ -126,7 +124,7 @@ func (d Docker) StopNode(node *k3d.Node) error {
defer docker.Close()
// get container which represents the node
nodeContainer, err := getNodeContainer(node)
nodeContainer, err := getNodeContainer(ctx, node)
if err != nil {
log.Errorf("Failed to get container for node '%s'", node.Name)
return err
@ -145,9 +143,8 @@ func (d Docker) StopNode(node *k3d.Node) error {
return nil
}
func getContainersByLabel(labels map[string]string) ([]types.Container, error) {
func getContainersByLabel(ctx context.Context, labels map[string]string) ([]types.Container, error) {
// (0) create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return nil, fmt.Errorf("Failed to create docker client. %+v", err)
@ -176,9 +173,8 @@ func getContainersByLabel(labels map[string]string) ([]types.Container, error) {
}
// getContainer details returns the containerjson with more details
func getContainerDetails(containerID string) (types.ContainerJSON, error) {
func getContainerDetails(ctx context.Context, containerID string) (types.ContainerJSON, error) {
// (0) create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return types.ContainerJSON{}, fmt.Errorf("Failed to create docker client. %+v", err)
@ -196,14 +192,14 @@ func getContainerDetails(containerID string) (types.ContainerJSON, error) {
}
// GetNode tries to get a node container by its name
func (d Docker) GetNode(node *k3d.Node) (*k3d.Node, error) {
container, err := getNodeContainer(node)
func (d Docker) GetNode(ctx context.Context, node *k3d.Node) (*k3d.Node, error) {
container, err := getNodeContainer(ctx, node)
if err != nil {
log.Errorf("Failed to get container for node '%s'", node.Name)
return nil, err
}
containerDetails, err := getContainerDetails(container.ID)
containerDetails, err := getContainerDetails(ctx, container.ID)
if err != nil {
return nil, err
}
@ -219,15 +215,14 @@ func (d Docker) GetNode(node *k3d.Node) (*k3d.Node, error) {
}
// GetNodeLogs returns the logs from a given node
func (d Docker) GetNodeLogs(node *k3d.Node) (io.ReadCloser, error) {
func (d Docker) GetNodeLogs(ctx context.Context, node *k3d.Node) (io.ReadCloser, error) {
// get the container for the given node
container, err := getNodeContainer(node)
container, err := getNodeContainer(ctx, node)
if err != nil {
return nil, err
}
// create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")
@ -255,18 +250,17 @@ func (d Docker) GetNodeLogs(node *k3d.Node) (io.ReadCloser, error) {
}
// ExecInNode execs a command inside a node
func (d Docker) ExecInNode(node *k3d.Node, cmd []string) error {
func (d Docker) ExecInNode(ctx context.Context, node *k3d.Node, cmd []string) error {
log.Debugf("Exec cmds '%+v' in node '%s'", cmd, node.Name)
// get the container for the given node
container, err := getNodeContainer(node)
container, err := getNodeContainer(ctx, node)
if err != nil {
return err
}
// create docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")

@ -23,6 +23,7 @@ THE SOFTWARE.
package docker
import (
"context"
"fmt"
"strings"
@ -92,7 +93,7 @@ func TranslateNodeToContainer(node *k3d.Node) (*NodeInDocker, error) {
networkingConfig.EndpointsConfig = map[string]*network.EndpointSettings{
node.Network: {},
}
netInfo, err := GetNetwork(node.Network)
netInfo, err := GetNetwork(context.Background(), node.Network)
if err != nil {
log.Warnln("Failed to get network information")
log.Warnln(err)

@ -32,9 +32,8 @@ import (
)
// CreateVolume creates a new named volume
func (d Docker) CreateVolume(name string, labels map[string]string) error {
func (d Docker) CreateVolume(ctx context.Context, name string, labels map[string]string) error {
// (0) create new docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")
@ -63,9 +62,8 @@ func (d Docker) CreateVolume(name string, labels map[string]string) error {
}
// DeleteVolume creates a new named volume
func (d Docker) DeleteVolume(name string) error {
func (d Docker) DeleteVolume(ctx context.Context, name string) error {
// (0) create new docker client
ctx := context.Background()
docker, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Errorln("Failed to create docker client")

@ -22,6 +22,7 @@ THE SOFTWARE.
package runtimes
import (
"context"
"fmt"
"io"
@ -41,21 +42,21 @@ var Runtimes = map[string]Runtime{
// Runtime defines an interface that can be implemented for various container runtime environments (docker, containerd, etc.)
type Runtime interface {
CreateNode(*k3d.Node) error
DeleteNode(*k3d.Node) error
GetNodesByLabel(map[string]string) ([]*k3d.Node, error)
GetNode(*k3d.Node) (*k3d.Node, error)
CreateNetworkIfNotPresent(name string) (string, bool, error) // @return NETWORK_NAME, EXISTS, ERROR
GetKubeconfig(*k3d.Node) (io.ReadCloser, error)
DeleteNetwork(ID string) error
StartNode(*k3d.Node) error
StopNode(*k3d.Node) error
CreateVolume(string, map[string]string) error
DeleteVolume(string) error
CreateNode(context.Context, *k3d.Node) error
DeleteNode(context.Context, *k3d.Node) error
GetNodesByLabel(context.Context, map[string]string) ([]*k3d.Node, error)
GetNode(context.Context, *k3d.Node) (*k3d.Node, error)
CreateNetworkIfNotPresent(context.Context, string) (string, bool, error) // @return NETWORK_NAME, EXISTS, ERROR
GetKubeconfig(context.Context, *k3d.Node) (io.ReadCloser, error)
DeleteNetwork(context.Context, string) error
StartNode(context.Context, *k3d.Node) error
StopNode(context.Context, *k3d.Node) error
CreateVolume(context.Context, string, map[string]string) error
DeleteVolume(context.Context, string) error
GetRuntimePath() string // returns e.g. '/var/run/docker.sock' for a default docker setup
ExecInNode(*k3d.Node, []string) error
ExecInNode(context.Context, *k3d.Node, []string) error
// DeleteContainer() error
GetNodeLogs(*k3d.Node) (io.ReadCloser, error)
GetNodeLogs(context.Context, *k3d.Node) (io.ReadCloser, error)
}
// GetRuntime checks, if a given name is represented by an implemented k3d runtime and returns it

@ -79,7 +79,7 @@ func LoadImagesIntoCluster(ctx context.Context, runtime runtimes.Runtime, images
// save image to tarfile in shared volume
log.Infoln("Saving images...")
tarName := fmt.Sprintf("%s/k3d-%s-images-%s.tar", k3d.DefaultImageVolumeMountPath, cluster.Name, time.Now().Format("20060102150405")) // FIXME: change
if err := runtime.ExecInNode(toolsNode, append([]string{"./k3d-tools", "save-image", "-d", tarName}, images...)); err != nil {
if err := runtime.ExecInNode(ctx, toolsNode, append([]string{"./k3d-tools", "save-image", "-d", tarName}, images...)); err != nil {
log.Errorf("Failed to save images in tools container for cluster '%s'", cluster.Name)
return err
}
@ -93,7 +93,7 @@ func LoadImagesIntoCluster(ctx context.Context, runtime runtimes.Runtime, images
importWaitgroup.Add(1)
go func(node *k3d.Node, wg *sync.WaitGroup) {
log.Infof("Importing images into node '%s'...", node.Name)
if err := runtime.ExecInNode(node, []string{"ctr", "image", "import", tarName}); err != nil {
if err := runtime.ExecInNode(ctx, node, []string{"ctr", "image", "import", tarName}); err != nil {
log.Errorf("Failed to import images in node '%s'", node.Name)
log.Errorln(err)
}
@ -106,7 +106,7 @@ func LoadImagesIntoCluster(ctx context.Context, runtime runtimes.Runtime, images
// remove tarball
if !keepTarball {
log.Infoln("Removing the tarball...")
if err := runtime.ExecInNode(cluster.Nodes[0], []string{"rm", "-f", tarName}); err != nil { // TODO: do this in tools node (requires rm)
if err := runtime.ExecInNode(ctx, cluster.Nodes[0], []string{"rm", "-f", tarName}); err != nil { // TODO: do this in tools node (requires rm)
log.Errorf("Failed to delete tarball '%s'", tarName)
log.Errorln(err)
}
@ -114,7 +114,7 @@ func LoadImagesIntoCluster(ctx context.Context, runtime runtimes.Runtime, images
// delete tools container
log.Infoln("Removing k3d-tools node...")
if err := runtime.DeleteNode(toolsNode); err != nil {
if err := runtime.DeleteNode(ctx, toolsNode); err != nil {
log.Errorln("Failed to delete tools node '%s': Try to delete it manually", toolsNode.Name)
}
@ -135,7 +135,7 @@ func startToolsNode(ctx context.Context, runtime runtimes.Runtime, cluster *k3d.
Cmd: []string{},
Args: []string{"noop"},
}
if err := runtime.CreateNode(node); err != nil {
if err := runtime.CreateNode(ctx, node); err != nil {
log.Errorf("Failed to create tools container for cluster '%s'", cluster.Name)
return node, err
}

Loading…
Cancel
Save