From 434cf8e91dd048c446098c1f985e85a31b91e557 Mon Sep 17 00:00:00 2001 From: iwilltry42 Date: Tue, 26 May 2020 14:47:21 +0200 Subject: [PATCH] overall: pass context from top to bottom --- cmd/start/startNode.go | 2 +- cmd/stop/stopNode.go | 2 +- pkg/cluster/cluster.go | 22 +++++++------- pkg/cluster/kubeconfig.go | 4 +-- pkg/cluster/loadbalancer.go | 2 +- pkg/cluster/node.go | 10 +++--- pkg/runtimes/containerd/kubeconfig.go | 3 +- pkg/runtimes/containerd/network.go | 6 ++-- pkg/runtimes/containerd/node.go | 18 +++++------ pkg/runtimes/containerd/volume.go | 6 ++-- pkg/runtimes/docker/container.go | 9 ++---- pkg/runtimes/docker/kubeconfig.go | 5 ++- pkg/runtimes/docker/network.go | 9 ++---- pkg/runtimes/docker/node.go | 44 ++++++++++++--------------- pkg/runtimes/docker/translate.go | 3 +- pkg/runtimes/docker/volume.go | 6 ++-- pkg/runtimes/runtime.go | 27 ++++++++-------- pkg/tools/tools.go | 10 +++--- 18 files changed, 89 insertions(+), 99 deletions(-) diff --git a/cmd/start/startNode.go b/cmd/start/startNode.go index 179770d9..9afb2c97 100644 --- a/cmd/start/startNode.go +++ b/cmd/start/startNode.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) } }, diff --git a/cmd/stop/stopNode.go b/cmd/stop/stopNode.go index be69f0a0..f47af9f3 100644 --- a/cmd/stop/stopNode.go +++ b/cmd/stop/stopNode.go @@ -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) } }, diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index b115bb93..9ffb25ad 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -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 diff --git a/pkg/cluster/kubeconfig.go b/pkg/cluster/kubeconfig.go index a71c9a4a..5681f2d4 100644 --- a/pkg/cluster/kubeconfig.go +++ b/pkg/cluster/kubeconfig.go @@ -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 diff --git a/pkg/cluster/loadbalancer.go b/pkg/cluster/loadbalancer.go index 57ed95a0..bd7442ed 100644 --- a/pkg/cluster/loadbalancer.go +++ b/pkg/cluster/loadbalancer.go @@ -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 } diff --git a/pkg/cluster/node.go b/pkg/cluster/node.go index 49a80422..230d4ed4 100644 --- a/pkg/cluster/node.go +++ b/pkg/cluster/node.go @@ -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() diff --git a/pkg/runtimes/containerd/kubeconfig.go b/pkg/runtimes/containerd/kubeconfig.go index 805ea5ee..2faa3e96 100644 --- a/pkg/runtimes/containerd/kubeconfig.go +++ b/pkg/runtimes/containerd/kubeconfig.go @@ -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 } diff --git a/pkg/runtimes/containerd/network.go b/pkg/runtimes/containerd/network.go index 1caa532c..64634e64 100644 --- a/pkg/runtimes/containerd/network.go +++ b/pkg/runtimes/containerd/network.go @@ -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 } diff --git a/pkg/runtimes/containerd/node.go b/pkg/runtimes/containerd/node.go index b1884f25..324efbf4 100644 --- a/pkg/runtimes/containerd/node.go +++ b/pkg/runtimes/containerd/node.go @@ -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 } diff --git a/pkg/runtimes/containerd/volume.go b/pkg/runtimes/containerd/volume.go index 7dc49dcf..8d647047 100644 --- a/pkg/runtimes/containerd/volume.go +++ b/pkg/runtimes/containerd/volume.go @@ -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 } diff --git a/pkg/runtimes/docker/container.go b/pkg/runtimes/docker/container.go index 9aab8faa..b397cf18 100644 --- a/pkg/runtimes/docker/container.go +++ b/pkg/runtimes/docker/container.go @@ -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") diff --git a/pkg/runtimes/docker/kubeconfig.go b/pkg/runtimes/docker/kubeconfig.go index 6bdc16cd..ad7cc85d 100644 --- a/pkg/runtimes/docker/kubeconfig.go +++ b/pkg/runtimes/docker/kubeconfig.go @@ -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 } diff --git a/pkg/runtimes/docker/network.go b/pkg/runtimes/docker/network.go index aacaeb05..63ccd6e7 100644 --- a/pkg/runtimes/docker/network.go +++ b/pkg/runtimes/docker/network.go @@ -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") diff --git a/pkg/runtimes/docker/node.go b/pkg/runtimes/docker/node.go index 840be3ef..5443aa99 100644 --- a/pkg/runtimes/docker/node.go +++ b/pkg/runtimes/docker/node.go @@ -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") diff --git a/pkg/runtimes/docker/translate.go b/pkg/runtimes/docker/translate.go index 0020b14b..7f13be74 100644 --- a/pkg/runtimes/docker/translate.go +++ b/pkg/runtimes/docker/translate.go @@ -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) diff --git a/pkg/runtimes/docker/volume.go b/pkg/runtimes/docker/volume.go index b64ece54..b1dfda0b 100644 --- a/pkg/runtimes/docker/volume.go +++ b/pkg/runtimes/docker/volume.go @@ -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") diff --git a/pkg/runtimes/runtime.go b/pkg/runtimes/runtime.go index 93997583..91da0e42 100644 --- a/pkg/runtimes/runtime.go +++ b/pkg/runtimes/runtime.go @@ -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 diff --git a/pkg/tools/tools.go b/pkg/tools/tools.go index e7c915e2..ddb8fdc4 100644 --- a/pkg/tools/tools.go +++ b/pkg/tools/tools.go @@ -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 }