69 lines
1.9 KiB
Go
69 lines
1.9 KiB
Go
package tests_test
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"runtime"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/avast/retry-go/v5"
|
|
"github.com/cirruslabs/orchard/internal/tests/devcontroller"
|
|
"github.com/cirruslabs/orchard/internal/tests/platformdependent"
|
|
"github.com/cirruslabs/orchard/internal/tests/wait"
|
|
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
|
|
"github.com/stretchr/testify/require"
|
|
"golang.org/x/crypto/ssh"
|
|
"golang.org/x/text/cases"
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
func TestIPEndpoint(t *testing.T) {
|
|
// Run the Controller
|
|
devClient, _, _ := devcontroller.StartIntegrationTestEnvironment(t)
|
|
|
|
// Create a VM to which we'll connect via Controller's SSH server
|
|
err := devClient.VMs().Create(context.Background(), platformdependent.VM("test-vm"))
|
|
require.NoError(t, err)
|
|
|
|
// Wait for the VM to start
|
|
require.True(t, wait.Wait(2*time.Minute, func() bool {
|
|
vm, err := devClient.VMs().Get(context.Background(), "test-vm")
|
|
require.NoError(t, err)
|
|
|
|
return vm.Status == v1.VMStatusRunning
|
|
}), "failed to wait for the VM to start")
|
|
|
|
// Retrieve the VM's IP
|
|
ip, err := devClient.VMs().IP(context.Background(), "test-vm", 30)
|
|
require.NoError(t, err)
|
|
|
|
// Connect to the VM over SSH to make sure the provided IP is valid
|
|
sshClient, err := retry.NewWithData[*ssh.Client](
|
|
retry.Context(t.Context()),
|
|
retry.DelayType(retry.FixedDelay),
|
|
retry.Delay(time.Second),
|
|
retry.Attempts(0),
|
|
).Do(func() (*ssh.Client, error) {
|
|
return ssh.Dial("tcp", ip+":22", &ssh.ClientConfig{
|
|
User: "admin",
|
|
Auth: []ssh.AuthMethod{
|
|
ssh.Password("admin"),
|
|
},
|
|
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
|
|
return nil
|
|
},
|
|
})
|
|
})
|
|
require.NoError(t, err)
|
|
defer sshClient.Close()
|
|
|
|
sshSession, err := sshClient.NewSession()
|
|
require.NoError(t, err)
|
|
defer sshSession.Close()
|
|
|
|
output, err := sshSession.CombinedOutput("uname -a")
|
|
require.NoError(t, err)
|
|
require.Contains(t, string(output), cases.Title(language.English).String(runtime.GOOS))
|
|
}
|