overall: pass context from top to bottom
This commit is contained in:
parent
639daef7fb
commit
434cf8e91d
@ -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…
Reference in New Issue
Block a user