mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	test embedded derp with derp updater, check client health (#2030)
This commit is contained in:
		
							parent
							
								
									948d53f934
								
							
						
					
					
						commit
						ece907d878
					
				@ -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(
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user