Skip to content

Commit

Permalink
dialWithDeadline
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidGOrtega committed Jun 19, 2022
1 parent 2372271 commit 9aaac5d
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 45 deletions.
57 changes: 13 additions & 44 deletions iterative/resource_runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"context"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"log"
"net"
Expand Down Expand Up @@ -248,10 +247,21 @@ func resourceRunnerCreate(ctx context.Context, d *schema.ResourceData, m interfa

var logError error
var logEvents string

cloud := d.Get("cloud").(string)
ip := d.Get("instance_ip").(string)
err = resource.Retry(d.Timeout(schema.TimeoutCreate)-time.Minute, func() *resource.RetryError {

logEvents, logError = resourceLogsTimed(ctx, d, m)
switch cloud {
case "kubernetes":
logEvents, logError = resourceMachineLogs(ctx, d, m)
default:
logEvents, logError = utils.RunCommand("journalctl --unit cml --no-pager",
2*time.Second,
net.JoinHostPort(ip, "22"),
"ubuntu",
d.Get("ssh_private").(string))
}

if logError != nil {
log.Printf("[DEBUG] Connection errors: %#v", logError)
} else {
Expand Down Expand Up @@ -281,47 +291,6 @@ func resourceRunnerCreate(ctx context.Context, d *schema.ResourceData, m interfa
return diags
}

type resourceLogsResult struct {
logEvents string
logError error
}

func resourceLogsTimed(ctx context.Context, d *schema.ResourceData, m interface{}) (string, error) {
result := make(chan resourceLogsResult, 1)
go func() {
result <- resourceLogs(ctx, d, m)
}()
select {
case <-time.After(20 * time.Second):
return "", errors.New("Resource Logs Timed Out")
case result := <-result:
return result.logEvents, result.logError
}
}

func resourceLogs(ctx context.Context, d *schema.ResourceData, m interface{}) resourceLogsResult {
var logError error
var logEvents string
cloud := d.Get("cloud").(string)
ip := d.Get("instance_ip").(string)

switch cloud {
case "kubernetes":
logEvents, logError = resourceMachineLogs(ctx, d, m)
default:
logEvents, logError = utils.RunCommand("journalctl --unit cml --no-pager",
2*time.Second,
net.JoinHostPort(ip, "22"),
"ubuntu",
d.Get("ssh_private").(string))
}

return resourceLogsResult{
logEvents: logEvents,
logError: logError,
}
}

func resourceRunnerDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
return resourceMachineDelete(ctx, d, m)
}
Expand Down
21 changes: 20 additions & 1 deletion iterative/utils/ssh.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"crypto/x509"
"encoding/pem"
"fmt"
"net"
"strings"
"time"

Expand Down Expand Up @@ -64,7 +65,7 @@ func RunCommand(command string, timeout time.Duration, hostAddress string, userN
Timeout: timeout,
}

client, err := ssh.Dial("tcp", hostAddress, configuration)
client, err := dialWithDeadline("tcp", hostAddress, configuration)
if err != nil {
return "", err
}
Expand All @@ -83,3 +84,21 @@ func RunCommand(command string, timeout time.Duration, hostAddress string, userN

return string(output), nil
}

func dialWithDeadline(network string, addr string, config *ssh.ClientConfig) (*ssh.Client, error) {
conn, err := net.DialTimeout(network, addr, config.Timeout)
if err != nil {
return nil, err
}
if config.Timeout > 0 {
conn.SetReadDeadline(time.Now().Add(config.Timeout))
}
c, chans, reqs, err := ssh.NewClientConn(conn, addr, config)
if err != nil {
return nil, err
}
if config.Timeout > 0 {
conn.SetReadDeadline(time.Time{})
}
return ssh.NewClient(c, chans, reqs), nil
}

0 comments on commit 9aaac5d

Please sign in to comment.