orchard/internal/tests/ip_endpoint_test.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))
}