@ -44,15 +44,13 @@ func (d Docker) CreateNode(ctx context.Context, node *k3d.Node) error {
// translate node spec to docker container specs
// translate node spec to docker container specs
dockerNode , err := TranslateNodeToContainer ( node )
dockerNode , err := TranslateNodeToContainer ( node )
if err != nil {
if err != nil {
l . Log ( ) . Errorln ( "Failed to translate k3d node specification to docker container specifications" )
return fmt . Errorf ( "failed to translate k3d node spec to docker container spec: %w" , err )
return err
}
}
// create node
// create node
_ , err = createContainer ( ctx , dockerNode , node . Name )
_ , err = createContainer ( ctx , dockerNode , node . Name )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to create node '%s'" , node . Name )
return fmt . Errorf ( "failed to create container for node '%s': %w" , node . Name , err )
return err
}
}
return nil
return nil
@ -70,7 +68,7 @@ func (d Docker) GetNodesByLabel(ctx context.Context, labels map[string]string) (
// (0) get containers
// (0) get containers
containers , err := getContainersByLabel ( ctx , labels )
containers , err := getContainersByLabel ( ctx , labels )
if err != nil {
if err != nil {
return nil , err
return nil , fmt . Errorf ( "docker failed to get containers with labels '%v': %w" , labels , err )
}
}
// (1) convert them to node structs
// (1) convert them to node structs
@ -84,12 +82,12 @@ func (d Docker) GetNodesByLabel(ctx context.Context, labels map[string]string) (
l . Log ( ) . Warnf ( "Failed to get details for container %s" , container . Names [ 0 ] )
l . Log ( ) . Warnf ( "Failed to get details for container %s" , container . Names [ 0 ] )
node , err = TranslateContainerToNode ( & container )
node , err = TranslateContainerToNode ( & container )
if err != nil {
if err != nil {
return nil , err
return nil , fmt . Errorf ( "failed to translate container '%s' to k3d node spec: %w" , container . Names [ 0 ] , err )
}
}
} else {
} else {
node , err = TranslateContainerDetailsToNode ( containerDetails )
node , err = TranslateContainerDetailsToNode ( containerDetails )
if err != nil {
if err != nil {
return nil , err
return nil , fmt . Errorf ( "failed to translate container'%s' details to k3d node spec: %w" , containerDetails . Name , err )
}
}
}
}
nodes = append ( nodes , node )
nodes = append ( nodes , node )
@ -104,15 +102,14 @@ func (d Docker) StartNode(ctx context.Context, node *k3d.Node) error {
// (0) create docker client
// (0) create docker client
docker , err := GetDockerClient ( )
docker , err := GetDockerClient ( )
if err != nil {
if err != nil {
return fmt . Errorf ( "Failed to create docker client. %+v " , err )
return fmt . Errorf ( "failed to create docker client. %w " , err )
}
}
defer docker . Close ( )
defer docker . Close ( )
// get container which represents the node
// get container which represents the node
nodeContainer , err := getNodeContainer ( ctx , node )
nodeContainer , err := getNodeContainer ( ctx , node )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to get container for node '%s'" , node . Name )
return fmt . Errorf ( "failed to get container for node '%s': %w" , node . Name , err )
return err
}
}
// check if the container is actually managed by
// check if the container is actually managed by
@ -123,7 +120,7 @@ func (d Docker) StartNode(ctx context.Context, node *k3d.Node) error {
// actually start the container
// actually start the container
l . Log ( ) . Infof ( "Starting Node '%s'" , node . Name )
l . Log ( ) . Infof ( "Starting Node '%s'" , node . Name )
if err := docker . ContainerStart ( ctx , nodeContainer . ID , types . ContainerStartOptions { } ) ; err != nil {
if err := docker . ContainerStart ( ctx , nodeContainer . ID , types . ContainerStartOptions { } ) ; err != nil {
return err
return fmt . Errorf ( "docker failed to start container for node '%s': %w" , node . Name , err )
}
}
// get container which represents the node
// get container which represents the node
@ -151,8 +148,7 @@ func (d Docker) StopNode(ctx context.Context, node *k3d.Node) error {
// get container which represents the node
// get container which represents the node
nodeContainer , err := getNodeContainer ( ctx , node )
nodeContainer , err := getNodeContainer ( ctx , node )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to get container for node '%s'" , node . Name )
return fmt . Errorf ( "failed to get container for node '%s': %w" , node . Name , err )
return err
}
}
// check if the container is actually managed by
// check if the container is actually managed by
@ -162,7 +158,7 @@ func (d Docker) StopNode(ctx context.Context, node *k3d.Node) error {
// actually stop the container
// actually stop the container
if err := docker . ContainerStop ( ctx , nodeContainer . ID , nil ) ; err != nil {
if err := docker . ContainerStop ( ctx , nodeContainer . ID , nil ) ; err != nil {
return err
return fmt . Errorf ( "docker failed to stop the container '%s': %w" , nodeContainer . ID , err )
}
}
return nil
return nil
@ -201,14 +197,13 @@ func getContainerDetails(ctx context.Context, containerID string) (types.Contain
// (0) create docker client
// (0) create docker client
docker , err := GetDockerClient ( )
docker , err := GetDockerClient ( )
if err != nil {
if err != nil {
return types . ContainerJSON { } , fmt . Errorf ( "Failed to create docker client. %+v " , err )
return types . ContainerJSON { } , fmt . Errorf ( "failed to create docker client. %w " , err )
}
}
defer docker . Close ( )
defer docker . Close ( )
containerDetails , err := docker . ContainerInspect ( ctx , containerID )
containerDetails , err := docker . ContainerInspect ( ctx , containerID )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to get details for container '%s'" , containerID )
return types . ContainerJSON { } , fmt . Errorf ( "failed to get details for container '%s': %w" , containerID , err )
return types . ContainerJSON { } , err
}
}
return containerDetails , nil
return containerDetails , nil
@ -219,18 +214,17 @@ func getContainerDetails(ctx context.Context, containerID string) (types.Contain
func ( d Docker ) GetNode ( ctx context . Context , node * k3d . Node ) ( * k3d . Node , error ) {
func ( d Docker ) GetNode ( ctx context . Context , node * k3d . Node ) ( * k3d . Node , error ) {
container , err := getNodeContainer ( ctx , node )
container , err := getNodeContainer ( ctx , node )
if err != nil {
if err != nil {
return node , err
return node , fmt . Errorf ( "failed to get container for node '%s': %w" , node . Name , err )
}
}
containerDetails , err := getContainerDetails ( ctx , container . ID )
containerDetails , err := getContainerDetails ( ctx , container . ID )
if err != nil {
if err != nil {
return node , err
return node , fmt . Errorf ( "failed to get details for container '%s': %w" , container . ID , err )
}
}
node , err = TranslateContainerDetailsToNode ( containerDetails )
node , err = TranslateContainerDetailsToNode ( containerDetails )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to translate container '%s' to node object" , containerDetails . Name )
return node , fmt . Errorf ( "failed to translate container '%s' details to node spec: %w" , containerDetails . Name , err )
return node , err
}
}
return node , nil
return node , nil
@ -246,20 +240,19 @@ func (d Docker) GetNodeStatus(ctx context.Context, node *k3d.Node) (bool, string
// get the container for the given node
// get the container for the given node
container , err := getNodeContainer ( ctx , node )
container , err := getNodeContainer ( ctx , node )
if err != nil {
if err != nil {
return running , stateString , err
return running , stateString , fmt . Errorf ( "failed to get container for node '%s': %w" , node . Name , err )
}
}
// create docker client
// create docker client
docker , err := GetDockerClient ( )
docker , err := GetDockerClient ( )
if err != nil {
if err != nil {
l . Log ( ) . Errorln ( "Failed to create docker client" )
return running , stateString , fmt . Errorf ( "failed to get docker client: %w" , err )
return running , stateString , err
}
}
defer docker . Close ( )
defer docker . Close ( )
containerInspectResponse , err := docker . ContainerInspect ( ctx , container . ID )
containerInspectResponse , err := docker . ContainerInspect ( ctx , container . ID )
if err != nil {
if err != nil {
return running , stateString , err
return running , stateString , fmt . Errorf ( "docker failed to inspect container '%s': %w" , container . ID , err )
}
}
running = containerInspectResponse . ContainerJSONBase . State . Running
running = containerInspectResponse . ContainerJSONBase . State . Running
@ -272,7 +265,7 @@ func (d Docker) GetNodeStatus(ctx context.Context, node *k3d.Node) (bool, string
func ( d Docker ) NodeIsRunning ( ctx context . Context , node * k3d . Node ) ( bool , error ) {
func ( d Docker ) NodeIsRunning ( ctx context . Context , node * k3d . Node ) ( bool , error ) {
isRunning , _ , err := d . GetNodeStatus ( ctx , node )
isRunning , _ , err := d . GetNodeStatus ( ctx , node )
if err != nil {
if err != nil {
return false , err
return false , fmt . Errorf ( "failed to get status for node '%s': %w" , node . Name , err )
}
}
return isRunning , nil
return isRunning , nil
}
}
@ -282,25 +275,23 @@ func (d Docker) GetNodeLogs(ctx context.Context, node *k3d.Node, since time.Time
// get the container for the given node
// get the container for the given node
container , err := getNodeContainer ( ctx , node )
container , err := getNodeContainer ( ctx , node )
if err != nil {
if err != nil {
return nil , err
return nil , fmt . Errorf ( "failed to get container for node '%s': %w" , node . Name , err )
}
}
// create docker client
// create docker client
docker , err := GetDockerClient ( )
docker , err := GetDockerClient ( )
if err != nil {
if err != nil {
l . Log ( ) . Errorln ( "Failed to create docker client" )
return nil , fmt . Errorf ( "failed to get docker client; %w" , err )
return nil , err
}
}
defer docker . Close ( )
defer docker . Close ( )
containerInspectResponse , err := docker . ContainerInspect ( ctx , container . ID )
containerInspectResponse , err := docker . ContainerInspect ( ctx , container . ID )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to inspect node '%s'(ID %s)" , node . Name , container . ID )
return nil , fmt . Errorf ( "failed ton inspect container '%s': %w" , container . ID , err )
return nil , err
}
}
if ! containerInspectResponse . ContainerJSONBase . State . Running {
if ! containerInspectResponse . ContainerJSONBase . State . Running {
return nil , fmt . Errorf ( "N ode '%s' (container '%s') not running" , node . Name , containerInspectResponse . ID )
return nil , fmt . Errorf ( "n ode '%s' (container '%s') not running" , node . Name , containerInspectResponse . ID )
}
}
sinceStr := ""
sinceStr := ""
@ -309,8 +300,7 @@ func (d Docker) GetNodeLogs(ctx context.Context, node *k3d.Node, since time.Time
}
}
logreader , err := docker . ContainerLogs ( ctx , container . ID , types . ContainerLogsOptions { ShowStdout : true , ShowStderr : true , Since : sinceStr } )
logreader , err := docker . ContainerLogs ( ctx , container . ID , types . ContainerLogsOptions { ShowStdout : true , ShowStderr : true , Since : sinceStr } )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to get logs from node '%s' (container '%s')" , node . Name , container . ID )
return nil , fmt . Errorf ( "docker failed to get logs from node '%s' (container '%s'): %w" , node . Name , container . ID , err )
return nil , err
}
}
return logreader , nil
return logreader , nil
@ -335,8 +325,7 @@ func (d Docker) ExecInNode(ctx context.Context, node *k3d.Node, cmd []string) er
if execConnection != nil && execConnection . Reader != nil {
if execConnection != nil && execConnection . Reader != nil {
logs , err := ioutil . ReadAll ( execConnection . Reader )
logs , err := ioutil . ReadAll ( execConnection . Reader )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to get logs from errored exec process in node '%s'" , node . Name )
return fmt . Errorf ( "failed to get logs from errored exec process in node '%s': %w" , node . Name , err )
return err
}
}
err = fmt . Errorf ( "%w: Logs from failed access process:\n%s" , err , string ( logs ) )
err = fmt . Errorf ( "%w: Logs from failed access process:\n%s" , err , string ( logs ) )
}
}
@ -351,14 +340,13 @@ func executeInNode(ctx context.Context, node *k3d.Node, cmd []string) (*types.Hi
// get the container for the given node
// get the container for the given node
container , err := getNodeContainer ( ctx , node )
container , err := getNodeContainer ( ctx , node )
if err != nil {
if err != nil {
return nil , err
return nil , fmt . Errorf ( "failed to get container for node '%s': %w" , node . Name , err )
}
}
// create docker client
// create docker client
docker , err := GetDockerClient ( )
docker , err := GetDockerClient ( )
if err != nil {
if err != nil {
l . Log ( ) . Errorln ( "Failed to create docker client" )
return nil , fmt . Errorf ( "failed to get docker client: %w" , err )
return nil , err
}
}
defer docker . Close ( )
defer docker . Close ( )
@ -371,28 +359,25 @@ func executeInNode(ctx context.Context, node *k3d.Node, cmd []string) (*types.Hi
Cmd : cmd ,
Cmd : cmd ,
} )
} )
if err != nil {
if err != nil {
return nil , fmt . Errorf ( "F ailed to create exec config for node '%s': %+v" , node . Name , err )
return nil , fmt . Errorf ( "docker f ailed to create exec config for node '%s': %+v" , node . Name , err )
}
}
execConnection , err := docker . ContainerExecAttach ( ctx , exec . ID , types . ExecStartCheck {
execConnection , err := docker . ContainerExecAttach ( ctx , exec . ID , types . ExecStartCheck {
Tty : true ,
Tty : true ,
} )
} )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to connect to exec process in node '%s'" , node . Name )
return nil , fmt . Errorf ( "docker failed to attach to exec process in node '%s': %w" , node . Name , err )
return nil , err
}
}
if err := docker . ContainerExecStart ( ctx , exec . ID , types . ExecStartCheck { Tty : true } ) ; err != nil {
if err := docker . ContainerExecStart ( ctx , exec . ID , types . ExecStartCheck { Tty : true } ) ; err != nil {
l . Log ( ) . Errorf ( "Failed to start exec process in node '%s'" , node . Name )
return nil , fmt . Errorf ( "docker failed to start exec process in node '%s': %w" , node . Name , err )
return nil , err
}
}
for {
for {
// get info about exec process inside container
// get info about exec process inside container
execInfo , err := docker . ContainerExecInspect ( ctx , exec . ID )
execInfo , err := docker . ContainerExecInspect ( ctx , exec . ID )
if err != nil {
if err != nil {
l . Log ( ) . Errorf ( "Failed to inspect exec process in node '%s'" , node . Name )
return & execConnection , fmt . Errorf ( "docker failed to inspect exec process in node '%s': %w" , node . Name , err )
return & execConnection , err
}
}
// if still running, continue loop
// if still running, continue loop
@ -416,14 +401,13 @@ func (d Docker) GetNodesInNetwork(ctx context.Context, network string) ([]*k3d.N
// create docker client
// create docker client
docker , err := GetDockerClient ( )
docker , err := GetDockerClient ( )
if err != nil {
if err != nil {
l . Log ( ) . Errorln ( "Failed to create docker client" )
return nil , fmt . Errorf ( "failed to create docker client: %w" , err )
return nil , err
}
}
defer docker . Close ( )
defer docker . Close ( )
net , err := GetNetwork ( ctx , network )
net , err := GetNetwork ( ctx , network )
if err != nil {
if err != nil {
return nil , err
return nil , fmt . Errorf ( "failed to get network '%s': %w" , network , err )
}
}
connectedNodes := [ ] * k3d . Node { }
connectedNodes := [ ] * k3d . Node { }
@ -432,7 +416,7 @@ func (d Docker) GetNodesInNetwork(ctx context.Context, network string) ([]*k3d.N
for cID := range net . Containers {
for cID := range net . Containers {
containerDetails , err := getContainerDetails ( ctx , cID )
containerDetails , err := getContainerDetails ( ctx , cID )
if err != nil {
if err != nil {
return nil , err
return nil , fmt . Errorf ( "docker failed to get details of container '%s': %w" , cID , err )
}
}
node , err := TranslateContainerDetailsToNode ( containerDetails )
node , err := TranslateContainerDetailsToNode ( containerDetails )
if err != nil {
if err != nil {
@ -440,7 +424,7 @@ func (d Docker) GetNodesInNetwork(ctx context.Context, network string) ([]*k3d.N
l . Log ( ) . Tracef ( "GetNodesInNetwork: inspected non-k3d-managed container %s" , containerDetails . Name )
l . Log ( ) . Tracef ( "GetNodesInNetwork: inspected non-k3d-managed container %s" , containerDetails . Name )
continue
continue
}
}
return nil , err
return nil , fmt . Errorf ( "failed to translate container '%s' details to node spec: %w" , containerDetails . Name , err )
}
}
connectedNodes = append ( connectedNodes , node )
connectedNodes = append ( connectedNodes , node )
}
}
@ -452,14 +436,13 @@ func (d Docker) RenameNode(ctx context.Context, node *k3d.Node, newName string)
// get the container for the given node
// get the container for the given node
container , err := getNodeContainer ( ctx , node )
container , err := getNodeContainer ( ctx , node )
if err != nil {
if err != nil {
return err
return fmt . Errorf ( "failed to get container for node '%s': %w" , node . Name , err )
}
}
// create docker client
// create docker client
docker , err := GetDockerClient ( )
docker , err := GetDockerClient ( )
if err != nil {
if err != nil {
l . Log ( ) . Errorln ( "Failed to create docker client" )
return fmt . Errorf ( "failed to get docker client: %w" , err )
return err
}
}
defer docker . Close ( )
defer docker . Close ( )