mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-31 04:57:45 +09:00 
			
		
		
		
	test embedded derp with derp updater, check client health (#2030)
This commit is contained in:
		| @@ -125,10 +125,5 @@ func GetDERPMap(cfg types.DERPConfig) *tailcfg.DERPMap { | |||||||
|  |  | ||||||
| 	log.Trace().Interface("derpMap", derpMap).Msg("DERPMap loaded") | 	log.Trace().Interface("derpMap", derpMap).Msg("DERPMap loaded") | ||||||
|  |  | ||||||
| 	if len(derpMap.Regions) == 0 { |  | ||||||
| 		log.Warn(). |  | ||||||
| 			Msg("DERP map is empty, not a single DERP map datasource was loaded correctly or contained a region") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return derpMap | 	return derpMap | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,7 +4,9 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"log" | 	"log" | ||||||
| 	"net/url" | 	"net/url" | ||||||
|  | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/juanfont/headscale/hscontrol/util" | 	"github.com/juanfont/headscale/hscontrol/util" | ||||||
| 	"github.com/juanfont/headscale/integration/dockertestutil" | 	"github.com/juanfont/headscale/integration/dockertestutil" | ||||||
| @@ -33,8 +35,7 @@ func TestDERPServerScenario(t *testing.T) { | |||||||
| 	defer scenario.Shutdown() | 	defer scenario.Shutdown() | ||||||
|  |  | ||||||
| 	spec := map[string]int{ | 	spec := map[string]int{ | ||||||
| 		"user1": 10, | 		"user1": len(MustTestVersions), | ||||||
| 		// "user1": len(MustTestVersions), |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = scenario.CreateHeadscaleEnv( | 	err = scenario.CreateHeadscaleEnv( | ||||||
| @@ -44,24 +45,75 @@ func TestDERPServerScenario(t *testing.T) { | |||||||
| 		hsic.WithEmbeddedDERPServerOnly(), | 		hsic.WithEmbeddedDERPServerOnly(), | ||||||
| 		hsic.WithTLS(), | 		hsic.WithTLS(), | ||||||
| 		hsic.WithHostnameAsServerURL(), | 		hsic.WithHostnameAsServerURL(), | ||||||
|  | 		hsic.WithConfigEnv(map[string]string{ | ||||||
|  | 			"HEADSCALE_DERP_AUTO_UPDATE_ENABLED": "true", | ||||||
|  | 			"HEADSCALE_DERP_UPDATE_FREQUENCY":    "10s", | ||||||
|  | 		}), | ||||||
| 	) | 	) | ||||||
| 	assertNoErrHeadscaleEnv(t, err) | 	assertNoErrHeadscaleEnv(t, err) | ||||||
|  |  | ||||||
| 	allClients, err := scenario.ListTailscaleClients() | 	allClients, err := scenario.ListTailscaleClients() | ||||||
| 	assertNoErrListClients(t, err) | 	assertNoErrListClients(t, err) | ||||||
|  |  | ||||||
| 	allIps, err := scenario.ListTailscaleClientsIPs() |  | ||||||
| 	assertNoErrListClientIPs(t, err) |  | ||||||
|  |  | ||||||
| 	err = scenario.WaitForTailscaleSync() | 	err = scenario.WaitForTailscaleSync() | ||||||
| 	assertNoErrSync(t, err) | 	assertNoErrSync(t, err) | ||||||
|  |  | ||||||
| 	allHostnames, err := scenario.ListTailscaleClientsFQDNs() | 	allHostnames, err := scenario.ListTailscaleClientsFQDNs() | ||||||
| 	assertNoErrListFQDN(t, err) | 	assertNoErrListFQDN(t, err) | ||||||
|  |  | ||||||
|  | 	for _, client := range allClients { | ||||||
|  | 		status, err := client.Status() | ||||||
|  | 		assertNoErr(t, err) | ||||||
|  |  | ||||||
|  | 		for _, health := range status.Health { | ||||||
|  | 			if strings.Contains(health, "could not connect to any relay server") { | ||||||
|  | 				t.Errorf("expected to be connected to derp, found: %s", health) | ||||||
|  | 			} | ||||||
|  | 			if strings.Contains(health, "could not connect to the 'Headscale Embedded DERP' relay server.") { | ||||||
|  | 				t.Errorf("expected to be connected to derp, found: %s", health) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	success := pingDerpAllHelper(t, allClients, allHostnames) | 	success := pingDerpAllHelper(t, allClients, allHostnames) | ||||||
|  |  | ||||||
| 	t.Logf("%d successful pings out of %d", success, len(allClients)*len(allIps)) | 	for _, client := range allClients { | ||||||
|  | 		status, err := client.Status() | ||||||
|  | 		assertNoErr(t, err) | ||||||
|  |  | ||||||
|  | 		for _, health := range status.Health { | ||||||
|  | 			if strings.Contains(health, "could not connect to any relay server") { | ||||||
|  | 				t.Errorf("expected to be connected to derp, found: %s", health) | ||||||
|  | 			} | ||||||
|  | 			if strings.Contains(health, "could not connect to the 'Headscale Embedded DERP' relay server.") { | ||||||
|  | 				t.Errorf("expected to be connected to derp, found: %s", health) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t.Logf("Run 1: %d successful pings out of %d", success, len(allClients)*len(allHostnames)) | ||||||
|  |  | ||||||
|  | 	// Let the DERP updater run a couple of times to ensure it does not | ||||||
|  | 	// break the DERPMap. | ||||||
|  | 	time.Sleep(30 * time.Second) | ||||||
|  |  | ||||||
|  | 	success = pingDerpAllHelper(t, allClients, allHostnames) | ||||||
|  |  | ||||||
|  | 	for _, client := range allClients { | ||||||
|  | 		status, err := client.Status() | ||||||
|  | 		assertNoErr(t, err) | ||||||
|  |  | ||||||
|  | 		for _, health := range status.Health { | ||||||
|  | 			if strings.Contains(health, "could not connect to any relay server") { | ||||||
|  | 				t.Errorf("expected to be connected to derp, found: %s", health) | ||||||
|  | 			} | ||||||
|  | 			if strings.Contains(health, "could not connect to the 'Headscale Embedded DERP' relay server.") { | ||||||
|  | 				t.Errorf("expected to be connected to derp, found: %s", health) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t.Logf("Run2: %d successful pings out of %d", success, len(allClients)*len(allHostnames)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (s *EmbeddedDERPServerScenario) CreateHeadscaleEnv( | func (s *EmbeddedDERPServerScenario) CreateHeadscaleEnv( | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user