2022-10-13 10:03:38 -04:00
|
|
|
package integration
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2022-10-14 04:37:13 -04:00
|
|
|
"github.com/juanfont/headscale/integration/dockertestutil"
|
2022-10-13 10:03:38 -04:00
|
|
|
)
|
|
|
|
|
2022-11-08 16:33:11 -05:00
|
|
|
// This file is intended to "test the test framework", by proxy it will also test
|
2022-10-14 06:23:35 -04:00
|
|
|
// some Headcsale/Tailscale stuff, but mostly in very simple ways.
|
|
|
|
|
2022-10-14 04:37:13 -04:00
|
|
|
func IntegrationSkip(t *testing.T) {
|
|
|
|
t.Helper()
|
|
|
|
|
|
|
|
if !dockertestutil.IsRunningInContainer() {
|
|
|
|
t.Skip("not running in docker, skipping")
|
|
|
|
}
|
|
|
|
|
|
|
|
if testing.Short() {
|
|
|
|
t.Skip("skipping integration tests due to short flag")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-01 08:01:06 -05:00
|
|
|
// If subtests are parallel, then they will start before setup is run.
|
|
|
|
// This might mean we approach setup slightly wrong, but for now, ignore
|
|
|
|
// the linter
|
|
|
|
// nolint:tparallel
|
2022-10-13 10:03:38 -04:00
|
|
|
func TestHeadscale(t *testing.T) {
|
2022-10-14 04:37:13 -04:00
|
|
|
IntegrationSkip(t)
|
2022-11-22 06:05:58 -05:00
|
|
|
t.Parallel()
|
2022-10-14 06:18:28 -04:00
|
|
|
|
2022-10-13 10:03:38 -04:00
|
|
|
var err error
|
|
|
|
|
2022-10-14 06:38:34 -04:00
|
|
|
namespace := "test-space"
|
|
|
|
|
2022-10-13 10:03:38 -04:00
|
|
|
scenario, err := NewScenario()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create scenario: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Run("start-headscale", func(t *testing.T) {
|
2022-11-14 08:27:02 -05:00
|
|
|
headscale, err := scenario.Headscale()
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create start headcale: %s", err)
|
|
|
|
}
|
|
|
|
|
2022-11-14 08:27:02 -05:00
|
|
|
err = headscale.WaitForReady()
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("headscale failed to become ready: %s", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("create-namespace", func(t *testing.T) {
|
2022-10-14 06:38:34 -04:00
|
|
|
err := scenario.CreateNamespace(namespace)
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create namespace: %s", err)
|
|
|
|
}
|
|
|
|
|
2022-10-14 06:38:34 -04:00
|
|
|
if _, ok := scenario.namespaces[namespace]; !ok {
|
2022-10-13 10:03:38 -04:00
|
|
|
t.Errorf("namespace is not in scenario")
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("create-auth-key", func(t *testing.T) {
|
2022-10-14 06:38:34 -04:00
|
|
|
_, err := scenario.CreatePreAuthKey(namespace)
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create preauthkey: %s", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
err = scenario.Shutdown()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to tear down scenario: %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-01 08:01:06 -05:00
|
|
|
// If subtests are parallel, then they will start before setup is run.
|
|
|
|
// This might mean we approach setup slightly wrong, but for now, ignore
|
|
|
|
// the linter
|
|
|
|
// nolint:tparallel
|
2022-10-13 10:03:38 -04:00
|
|
|
func TestCreateTailscale(t *testing.T) {
|
2022-10-14 04:37:13 -04:00
|
|
|
IntegrationSkip(t)
|
2022-11-22 06:05:58 -05:00
|
|
|
t.Parallel()
|
2022-10-14 04:37:13 -04:00
|
|
|
|
2022-10-13 10:03:38 -04:00
|
|
|
namespace := "only-create-containers"
|
|
|
|
|
2022-10-18 05:59:28 -04:00
|
|
|
scenario, err := NewScenario()
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create scenario: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
scenario.namespaces[namespace] = &Namespace{
|
2022-10-21 07:17:54 -04:00
|
|
|
Clients: make(map[string]TailscaleClient),
|
2022-10-13 10:03:38 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
t.Run("create-tailscale", func(t *testing.T) {
|
2022-10-18 05:59:28 -04:00
|
|
|
err := scenario.CreateTailscaleNodesInNamespace(namespace, "all", 3)
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to add tailscale nodes: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if clients := len(scenario.namespaces[namespace].Clients); clients != 3 {
|
|
|
|
t.Errorf("wrong number of tailscale clients: %d != %d", clients, 3)
|
|
|
|
}
|
2022-10-18 05:59:28 -04:00
|
|
|
|
|
|
|
// TODO(kradalby): Test "all" version logic
|
2022-10-13 10:03:38 -04:00
|
|
|
})
|
|
|
|
|
|
|
|
err = scenario.Shutdown()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to tear down scenario: %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-01 08:01:06 -05:00
|
|
|
// If subtests are parallel, then they will start before setup is run.
|
|
|
|
// This might mean we approach setup slightly wrong, but for now, ignore
|
|
|
|
// the linter
|
|
|
|
// nolint:tparallel
|
2022-10-13 10:03:38 -04:00
|
|
|
func TestTailscaleNodesJoiningHeadcale(t *testing.T) {
|
2022-10-14 04:37:13 -04:00
|
|
|
IntegrationSkip(t)
|
2022-11-22 06:05:58 -05:00
|
|
|
t.Parallel()
|
2022-10-14 04:37:13 -04:00
|
|
|
|
2022-10-13 10:03:38 -04:00
|
|
|
var err error
|
|
|
|
|
|
|
|
namespace := "join-node-test"
|
|
|
|
|
2022-10-14 06:18:28 -04:00
|
|
|
count := 1
|
|
|
|
|
2022-10-13 10:03:38 -04:00
|
|
|
scenario, err := NewScenario()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create scenario: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Run("start-headscale", func(t *testing.T) {
|
2022-11-14 08:27:02 -05:00
|
|
|
headscale, err := scenario.Headscale()
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create start headcale: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = headscale.WaitForReady()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("headscale failed to become ready: %s", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("create-namespace", func(t *testing.T) {
|
|
|
|
err := scenario.CreateNamespace(namespace)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create namespace: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := scenario.namespaces[namespace]; !ok {
|
|
|
|
t.Errorf("namespace is not in scenario")
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("create-tailscale", func(t *testing.T) {
|
2022-10-14 06:18:28 -04:00
|
|
|
err := scenario.CreateTailscaleNodesInNamespace(namespace, "1.30.2", count)
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to add tailscale nodes: %s", err)
|
|
|
|
}
|
|
|
|
|
2022-10-14 06:18:28 -04:00
|
|
|
if clients := len(scenario.namespaces[namespace].Clients); clients != count {
|
|
|
|
t.Errorf("wrong number of tailscale clients: %d != %d", clients, count)
|
2022-10-13 10:03:38 -04:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("join-headscale", func(t *testing.T) {
|
|
|
|
key, err := scenario.CreatePreAuthKey(namespace)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create preauthkey: %s", err)
|
|
|
|
}
|
|
|
|
|
2022-11-14 08:27:02 -05:00
|
|
|
headscale, err := scenario.Headscale()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to create start headcale: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = scenario.RunTailscaleUp(
|
|
|
|
namespace,
|
|
|
|
headscale.GetEndpoint(),
|
|
|
|
key.GetKey(),
|
|
|
|
)
|
2022-10-13 10:03:38 -04:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to login: %s", err)
|
|
|
|
}
|
2022-10-14 06:18:28 -04:00
|
|
|
})
|
2022-10-13 10:03:38 -04:00
|
|
|
|
2022-10-14 06:18:28 -04:00
|
|
|
t.Run("get-ips", func(t *testing.T) {
|
|
|
|
ips, err := scenario.GetIPs(namespace)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to get tailscale ips: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(ips) != count*2 {
|
|
|
|
t.Errorf("got the wrong amount of tailscale ips, %d != %d", len(ips), count*2)
|
|
|
|
}
|
2022-10-13 10:03:38 -04:00
|
|
|
})
|
|
|
|
|
|
|
|
err = scenario.Shutdown()
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("failed to tear down scenario: %s", err)
|
|
|
|
}
|
|
|
|
}
|