mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	port reminder of integrationv1 test to v2
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
		
							parent
							
								
									a16f0c9f60
								
							
						
					
					
						commit
						61a2915f17
					
				
							
								
								
									
										35
									
								
								.github/workflows/test-integration-cli.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								.github/workflows/test-integration-cli.yml
									
									
									
									
										vendored
									
									
								
							@ -1,35 +0,0 @@
 | 
			
		||||
name: Integration Test CLI
 | 
			
		||||
 | 
			
		||||
on: [pull_request]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  integration-test-cli:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 2
 | 
			
		||||
 | 
			
		||||
      - name: Set Swap Space
 | 
			
		||||
        uses: pierotofy/set-swap-space@master
 | 
			
		||||
        with:
 | 
			
		||||
          swap-size-gb: 10
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@v34
 | 
			
		||||
        with:
 | 
			
		||||
          files: |
 | 
			
		||||
            *.nix
 | 
			
		||||
            go.*
 | 
			
		||||
            **/*.go
 | 
			
		||||
            integration_test/
 | 
			
		||||
            config-example.yaml
 | 
			
		||||
 | 
			
		||||
      - uses: cachix/install-nix-action@v16
 | 
			
		||||
        if: steps.changed-files.outputs.any_changed == 'true'
 | 
			
		||||
 | 
			
		||||
      - name: Run CLI integration tests
 | 
			
		||||
        if: steps.changed-files.outputs.any_changed == 'true'
 | 
			
		||||
        run: nix develop --command -- make test_integration_cli
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								Makefile
									
									
									
									
									
								
							@ -24,21 +24,9 @@ build:
 | 
			
		||||
dev: lint test build
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
	@go test $(TAGS) -short -coverprofile=coverage.out ./...
 | 
			
		||||
	gotestsum -- $(TAGS) -short -coverprofile=coverage.out ./...
 | 
			
		||||
 | 
			
		||||
test_integration: test_integration_cli test_integration_v2_general
 | 
			
		||||
 | 
			
		||||
test_integration_cli:
 | 
			
		||||
	docker network rm $$(docker network ls --filter name=headscale --quiet) || true
 | 
			
		||||
	docker network create headscale-test || true
 | 
			
		||||
	docker run -t --rm \
 | 
			
		||||
		--network headscale-test \
 | 
			
		||||
		-v ~/.cache/hs-integration-go:/go \
 | 
			
		||||
		-v $$PWD:$$PWD -w $$PWD \
 | 
			
		||||
		-v /var/run/docker.sock:/var/run/docker.sock golang:1 \
 | 
			
		||||
		go run gotest.tools/gotestsum@latest -- $(TAGS) -failfast -timeout 30m -count=1 -run IntegrationCLI ./...
 | 
			
		||||
 | 
			
		||||
test_integration_v2_general:
 | 
			
		||||
test_integration:
 | 
			
		||||
	docker run \
 | 
			
		||||
		-t --rm \
 | 
			
		||||
		-v ~/.cache/hs-integration-go:/go \
 | 
			
		||||
 | 
			
		||||
@ -64,7 +64,7 @@ jobs:
 | 
			
		||||
              --volume /var/run/docker.sock:/var/run/docker.sock \
 | 
			
		||||
              --volume $PWD/control_logs:/tmp/control \
 | 
			
		||||
              golang:1 \
 | 
			
		||||
                go test ./... \
 | 
			
		||||
                go run gotest.tools/gotestsum@latest -- ./... \
 | 
			
		||||
                  -tags ts2019 \
 | 
			
		||||
                  -failfast \
 | 
			
		||||
                  -timeout 120m \
 | 
			
		||||
 | 
			
		||||
@ -532,3 +532,989 @@ func TestEnablingRoutes(t *testing.T) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestApiKeyCommand(t *testing.T) {
 | 
			
		||||
	IntegrationSkip(t)
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	count := 5
 | 
			
		||||
 | 
			
		||||
	scenario, err := NewScenario()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	spec := map[string]int{
 | 
			
		||||
		"user1": 0,
 | 
			
		||||
		"user2": 0,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scenario.CreateHeadscaleEnv(spec, []tsic.Option{}, hsic.WithTestName("clins"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	headscale, err := scenario.Headscale()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	keys := make([]string, count)
 | 
			
		||||
 | 
			
		||||
	for idx := 0; idx < count; idx++ {
 | 
			
		||||
		apiResult, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"apikeys",
 | 
			
		||||
				"create",
 | 
			
		||||
				"--expiration",
 | 
			
		||||
				"24h",
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
		assert.NotEmpty(t, apiResult)
 | 
			
		||||
 | 
			
		||||
		keys[idx] = apiResult
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, keys, 5)
 | 
			
		||||
 | 
			
		||||
	var listedAPIKeys []v1.ApiKey
 | 
			
		||||
	err = executeAndUnmarshal(headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"apikeys",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listedAPIKeys,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listedAPIKeys, 5)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, uint64(1), listedAPIKeys[0].Id)
 | 
			
		||||
	assert.Equal(t, uint64(2), listedAPIKeys[1].Id)
 | 
			
		||||
	assert.Equal(t, uint64(3), listedAPIKeys[2].Id)
 | 
			
		||||
	assert.Equal(t, uint64(4), listedAPIKeys[3].Id)
 | 
			
		||||
	assert.Equal(t, uint64(5), listedAPIKeys[4].Id)
 | 
			
		||||
 | 
			
		||||
	assert.NotEmpty(t, listedAPIKeys[0].Prefix)
 | 
			
		||||
	assert.NotEmpty(t, listedAPIKeys[1].Prefix)
 | 
			
		||||
	assert.NotEmpty(t, listedAPIKeys[2].Prefix)
 | 
			
		||||
	assert.NotEmpty(t, listedAPIKeys[3].Prefix)
 | 
			
		||||
	assert.NotEmpty(t, listedAPIKeys[4].Prefix)
 | 
			
		||||
 | 
			
		||||
	assert.True(t, listedAPIKeys[0].Expiration.AsTime().After(time.Now()))
 | 
			
		||||
	assert.True(t, listedAPIKeys[1].Expiration.AsTime().After(time.Now()))
 | 
			
		||||
	assert.True(t, listedAPIKeys[2].Expiration.AsTime().After(time.Now()))
 | 
			
		||||
	assert.True(t, listedAPIKeys[3].Expiration.AsTime().After(time.Now()))
 | 
			
		||||
	assert.True(t, listedAPIKeys[4].Expiration.AsTime().After(time.Now()))
 | 
			
		||||
 | 
			
		||||
	assert.True(
 | 
			
		||||
		t,
 | 
			
		||||
		listedAPIKeys[0].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)),
 | 
			
		||||
	)
 | 
			
		||||
	assert.True(
 | 
			
		||||
		t,
 | 
			
		||||
		listedAPIKeys[1].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)),
 | 
			
		||||
	)
 | 
			
		||||
	assert.True(
 | 
			
		||||
		t,
 | 
			
		||||
		listedAPIKeys[2].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)),
 | 
			
		||||
	)
 | 
			
		||||
	assert.True(
 | 
			
		||||
		t,
 | 
			
		||||
		listedAPIKeys[3].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)),
 | 
			
		||||
	)
 | 
			
		||||
	assert.True(
 | 
			
		||||
		t,
 | 
			
		||||
		listedAPIKeys[4].Expiration.AsTime().Before(time.Now().Add(time.Hour*26)),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	expiredPrefixes := make(map[string]bool)
 | 
			
		||||
 | 
			
		||||
	// Expire three keys
 | 
			
		||||
	for idx := 0; idx < 3; idx++ {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"apikeys",
 | 
			
		||||
				"expire",
 | 
			
		||||
				"--prefix",
 | 
			
		||||
				listedAPIKeys[idx].Prefix,
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		expiredPrefixes[listedAPIKeys[idx].Prefix] = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var listedAfterExpireAPIKeys []v1.ApiKey
 | 
			
		||||
	err = executeAndUnmarshal(headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"apikeys",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listedAfterExpireAPIKeys,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	for index := range listedAfterExpireAPIKeys {
 | 
			
		||||
		if _, ok := expiredPrefixes[listedAfterExpireAPIKeys[index].Prefix]; ok {
 | 
			
		||||
			// Expired
 | 
			
		||||
			assert.True(
 | 
			
		||||
				t,
 | 
			
		||||
				listedAfterExpireAPIKeys[index].Expiration.AsTime().Before(time.Now()),
 | 
			
		||||
			)
 | 
			
		||||
		} else {
 | 
			
		||||
			// Not expired
 | 
			
		||||
			assert.False(
 | 
			
		||||
				t,
 | 
			
		||||
				listedAfterExpireAPIKeys[index].Expiration.AsTime().Before(time.Now()),
 | 
			
		||||
			)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scenario.Shutdown()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNodeTagCommand(t *testing.T) {
 | 
			
		||||
	IntegrationSkip(t)
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	scenario, err := NewScenario()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	spec := map[string]int{
 | 
			
		||||
		"user1": 0,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scenario.CreateHeadscaleEnv(spec, []tsic.Option{}, hsic.WithTestName("clins"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	headscale, err := scenario.Headscale()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	machineKeys := []string{
 | 
			
		||||
		"nodekey:9b2ffa7e08cc421a3d2cca9012280f6a236fd0de0b4ce005b30a98ad930306fe",
 | 
			
		||||
		"nodekey:6abd00bb5fdda622db51387088c68e97e71ce58e7056aa54f592b6a8219d524c",
 | 
			
		||||
	}
 | 
			
		||||
	machines := make([]*v1.Machine, len(machineKeys))
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	for index, machineKey := range machineKeys {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"debug",
 | 
			
		||||
				"create-node",
 | 
			
		||||
				"--name",
 | 
			
		||||
				fmt.Sprintf("machine-%d", index+1),
 | 
			
		||||
				"--user",
 | 
			
		||||
				"user1",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		var machine v1.Machine
 | 
			
		||||
		err = executeAndUnmarshal(
 | 
			
		||||
			headscale,
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"--user",
 | 
			
		||||
				"user1",
 | 
			
		||||
				"register",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
			&machine,
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		machines[index] = &machine
 | 
			
		||||
	}
 | 
			
		||||
	assert.Len(t, machines, len(machineKeys))
 | 
			
		||||
 | 
			
		||||
	var machine v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"tag",
 | 
			
		||||
			"-i", "1",
 | 
			
		||||
			"-t", "tag:test",
 | 
			
		||||
			"--output", "json",
 | 
			
		||||
		},
 | 
			
		||||
		&machine,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, []string{"tag:test"}, machine.ForcedTags)
 | 
			
		||||
 | 
			
		||||
	// try to set a wrong tag and retrieve the error
 | 
			
		||||
	type errOutput struct {
 | 
			
		||||
		Error string `json:"error"`
 | 
			
		||||
	}
 | 
			
		||||
	var errorOutput errOutput
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"tag",
 | 
			
		||||
			"-i", "2",
 | 
			
		||||
			"-t", "wrong-tag",
 | 
			
		||||
			"--output", "json",
 | 
			
		||||
		},
 | 
			
		||||
		&errorOutput,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	assert.Contains(t, errorOutput.Error, "tag must start with the string 'tag:'")
 | 
			
		||||
 | 
			
		||||
	// Test list all nodes after added seconds
 | 
			
		||||
	resultMachines := make([]*v1.Machine, len(machineKeys))
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output", "json",
 | 
			
		||||
		},
 | 
			
		||||
		&resultMachines,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	found := false
 | 
			
		||||
	for _, machine := range resultMachines {
 | 
			
		||||
		if machine.ForcedTags != nil {
 | 
			
		||||
			for _, tag := range machine.ForcedTags {
 | 
			
		||||
				if tag == "tag:test" {
 | 
			
		||||
					found = true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	assert.Equal(
 | 
			
		||||
		t,
 | 
			
		||||
		true,
 | 
			
		||||
		found,
 | 
			
		||||
		"should find a machine with the tag 'tag:test' in the list of machines",
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	err = scenario.Shutdown()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNodeCommand(t *testing.T) {
 | 
			
		||||
	IntegrationSkip(t)
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	scenario, err := NewScenario()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	spec := map[string]int{
 | 
			
		||||
		"machine-user": 0,
 | 
			
		||||
		"other-user":   0,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scenario.CreateHeadscaleEnv(spec, []tsic.Option{}, hsic.WithTestName("clins"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	headscale, err := scenario.Headscale()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// Randomly generated machine keys
 | 
			
		||||
	machineKeys := []string{
 | 
			
		||||
		"nodekey:9b2ffa7e08cc421a3d2cca9012280f6a236fd0de0b4ce005b30a98ad930306fe",
 | 
			
		||||
		"nodekey:6abd00bb5fdda622db51387088c68e97e71ce58e7056aa54f592b6a8219d524c",
 | 
			
		||||
		"nodekey:f08305b4ee4250b95a70f3b7504d048d75d899993c624a26d422c67af0422507",
 | 
			
		||||
		"nodekey:8bc13285cee598acf76b1824a6f4490f7f2e3751b201e28aeb3b07fe81d5b4a1",
 | 
			
		||||
		"nodekey:cf7b0fd05da556fdc3bab365787b506fd82d64a70745db70e00e86c1b1c03084",
 | 
			
		||||
	}
 | 
			
		||||
	machines := make([]*v1.Machine, len(machineKeys))
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	for index, machineKey := range machineKeys {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"debug",
 | 
			
		||||
				"create-node",
 | 
			
		||||
				"--name",
 | 
			
		||||
				fmt.Sprintf("machine-%d", index+1),
 | 
			
		||||
				"--user",
 | 
			
		||||
				"machine-user",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		var machine v1.Machine
 | 
			
		||||
		err = executeAndUnmarshal(
 | 
			
		||||
			headscale,
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"--user",
 | 
			
		||||
				"machine-user",
 | 
			
		||||
				"register",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
			&machine,
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		machines[index] = &machine
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, machines, len(machineKeys))
 | 
			
		||||
 | 
			
		||||
	// Test list all nodes after added seconds
 | 
			
		||||
	var listAll []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listAll,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listAll, 5)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, uint64(1), listAll[0].Id)
 | 
			
		||||
	assert.Equal(t, uint64(2), listAll[1].Id)
 | 
			
		||||
	assert.Equal(t, uint64(3), listAll[2].Id)
 | 
			
		||||
	assert.Equal(t, uint64(4), listAll[3].Id)
 | 
			
		||||
	assert.Equal(t, uint64(5), listAll[4].Id)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, "machine-1", listAll[0].Name)
 | 
			
		||||
	assert.Equal(t, "machine-2", listAll[1].Name)
 | 
			
		||||
	assert.Equal(t, "machine-3", listAll[2].Name)
 | 
			
		||||
	assert.Equal(t, "machine-4", listAll[3].Name)
 | 
			
		||||
	assert.Equal(t, "machine-5", listAll[4].Name)
 | 
			
		||||
 | 
			
		||||
	otherUserMachineKeys := []string{
 | 
			
		||||
		"nodekey:b5b444774186d4217adcec407563a1223929465ee2c68a4da13af0d0185b4f8e",
 | 
			
		||||
		"nodekey:dc721977ac7415aafa87f7d4574cbe07c6b171834a6d37375782bdc1fb6b3584",
 | 
			
		||||
	}
 | 
			
		||||
	otherUserMachines := make([]*v1.Machine, len(otherUserMachineKeys))
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	for index, machineKey := range otherUserMachineKeys {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"debug",
 | 
			
		||||
				"create-node",
 | 
			
		||||
				"--name",
 | 
			
		||||
				fmt.Sprintf("otherUser-machine-%d", index+1),
 | 
			
		||||
				"--user",
 | 
			
		||||
				"other-user",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		var machine v1.Machine
 | 
			
		||||
		err = executeAndUnmarshal(
 | 
			
		||||
			headscale,
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"--user",
 | 
			
		||||
				"other-user",
 | 
			
		||||
				"register",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
			&machine,
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		otherUserMachines[index] = &machine
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, otherUserMachines, len(otherUserMachineKeys))
 | 
			
		||||
 | 
			
		||||
	// Test list all nodes after added otherUser
 | 
			
		||||
	var listAllWithotherUser []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listAllWithotherUser,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	// All nodes, machines + otherUser
 | 
			
		||||
	assert.Len(t, listAllWithotherUser, 7)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, uint64(6), listAllWithotherUser[5].Id)
 | 
			
		||||
	assert.Equal(t, uint64(7), listAllWithotherUser[6].Id)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, "otherUser-machine-1", listAllWithotherUser[5].Name)
 | 
			
		||||
	assert.Equal(t, "otherUser-machine-2", listAllWithotherUser[6].Name)
 | 
			
		||||
 | 
			
		||||
	// Test list all nodes after added otherUser
 | 
			
		||||
	var listOnlyotherUserMachineUser []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--user",
 | 
			
		||||
			"other-user",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listOnlyotherUserMachineUser,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listOnlyotherUserMachineUser, 2)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, uint64(6), listOnlyotherUserMachineUser[0].Id)
 | 
			
		||||
	assert.Equal(t, uint64(7), listOnlyotherUserMachineUser[1].Id)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(
 | 
			
		||||
		t,
 | 
			
		||||
		"otherUser-machine-1",
 | 
			
		||||
		listOnlyotherUserMachineUser[0].Name,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Equal(
 | 
			
		||||
		t,
 | 
			
		||||
		"otherUser-machine-2",
 | 
			
		||||
		listOnlyotherUserMachineUser[1].Name,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// Delete a machines
 | 
			
		||||
	_, err = headscale.Execute(
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"delete",
 | 
			
		||||
			"--identifier",
 | 
			
		||||
			// Delete the last added machine
 | 
			
		||||
			"4",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
			"--force",
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	// Test: list main user after machine is deleted
 | 
			
		||||
	var listOnlyMachineUserAfterDelete []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--user",
 | 
			
		||||
			"machine-user",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listOnlyMachineUserAfterDelete,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listOnlyMachineUserAfterDelete, 4)
 | 
			
		||||
 | 
			
		||||
	err = scenario.Shutdown()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNodeExpireCommand(t *testing.T) {
 | 
			
		||||
	IntegrationSkip(t)
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	scenario, err := NewScenario()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	spec := map[string]int{
 | 
			
		||||
		"machine-expire-user": 0,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scenario.CreateHeadscaleEnv(spec, []tsic.Option{}, hsic.WithTestName("clins"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	headscale, err := scenario.Headscale()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// Randomly generated machine keys
 | 
			
		||||
	machineKeys := []string{
 | 
			
		||||
		"nodekey:9b2ffa7e08cc421a3d2cca9012280f6a236fd0de0b4ce005b30a98ad930306fe",
 | 
			
		||||
		"nodekey:6abd00bb5fdda622db51387088c68e97e71ce58e7056aa54f592b6a8219d524c",
 | 
			
		||||
		"nodekey:f08305b4ee4250b95a70f3b7504d048d75d899993c624a26d422c67af0422507",
 | 
			
		||||
		"nodekey:8bc13285cee598acf76b1824a6f4490f7f2e3751b201e28aeb3b07fe81d5b4a1",
 | 
			
		||||
		"nodekey:cf7b0fd05da556fdc3bab365787b506fd82d64a70745db70e00e86c1b1c03084",
 | 
			
		||||
	}
 | 
			
		||||
	machines := make([]*v1.Machine, len(machineKeys))
 | 
			
		||||
 | 
			
		||||
	for index, machineKey := range machineKeys {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"debug",
 | 
			
		||||
				"create-node",
 | 
			
		||||
				"--name",
 | 
			
		||||
				fmt.Sprintf("machine-%d", index+1),
 | 
			
		||||
				"--user",
 | 
			
		||||
				"machine-expire-user",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		var machine v1.Machine
 | 
			
		||||
		err = executeAndUnmarshal(
 | 
			
		||||
			headscale,
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"--user",
 | 
			
		||||
				"machine-expire-user",
 | 
			
		||||
				"register",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
			&machine,
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		machines[index] = &machine
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, machines, len(machineKeys))
 | 
			
		||||
 | 
			
		||||
	var listAll []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listAll,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listAll, 5)
 | 
			
		||||
 | 
			
		||||
	assert.True(t, listAll[0].Expiry.AsTime().IsZero())
 | 
			
		||||
	assert.True(t, listAll[1].Expiry.AsTime().IsZero())
 | 
			
		||||
	assert.True(t, listAll[2].Expiry.AsTime().IsZero())
 | 
			
		||||
	assert.True(t, listAll[3].Expiry.AsTime().IsZero())
 | 
			
		||||
	assert.True(t, listAll[4].Expiry.AsTime().IsZero())
 | 
			
		||||
 | 
			
		||||
	for idx := 0; idx < 3; idx++ {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"expire",
 | 
			
		||||
				"--identifier",
 | 
			
		||||
				fmt.Sprintf("%d", listAll[idx].Id),
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var listAllAfterExpiry []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listAllAfterExpiry,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listAllAfterExpiry, 5)
 | 
			
		||||
 | 
			
		||||
	assert.True(t, listAllAfterExpiry[0].Expiry.AsTime().Before(time.Now()))
 | 
			
		||||
	assert.True(t, listAllAfterExpiry[1].Expiry.AsTime().Before(time.Now()))
 | 
			
		||||
	assert.True(t, listAllAfterExpiry[2].Expiry.AsTime().Before(time.Now()))
 | 
			
		||||
	assert.True(t, listAllAfterExpiry[3].Expiry.AsTime().IsZero())
 | 
			
		||||
	assert.True(t, listAllAfterExpiry[4].Expiry.AsTime().IsZero())
 | 
			
		||||
 | 
			
		||||
	err = scenario.Shutdown()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNodeRenameCommand(t *testing.T) {
 | 
			
		||||
	IntegrationSkip(t)
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	scenario, err := NewScenario()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	spec := map[string]int{
 | 
			
		||||
		"machine-rename-command": 0,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scenario.CreateHeadscaleEnv(spec, []tsic.Option{}, hsic.WithTestName("clins"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	headscale, err := scenario.Headscale()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// Randomly generated machine keys
 | 
			
		||||
	machineKeys := []string{
 | 
			
		||||
		"nodekey:cf7b0fd05da556fdc3bab365787b506fd82d64a70745db70e00e86c1b1c03084",
 | 
			
		||||
		"nodekey:8bc13285cee598acf76b1824a6f4490f7f2e3751b201e28aeb3b07fe81d5b4a1",
 | 
			
		||||
		"nodekey:f08305b4ee4250b95a70f3b7504d048d75d899993c624a26d422c67af0422507",
 | 
			
		||||
		"nodekey:6abd00bb5fdda622db51387088c68e97e71ce58e7056aa54f592b6a8219d524c",
 | 
			
		||||
		"nodekey:9b2ffa7e08cc421a3d2cca9012280f6a236fd0de0b4ce005b30a98ad930306fe",
 | 
			
		||||
	}
 | 
			
		||||
	machines := make([]*v1.Machine, len(machineKeys))
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	for index, machineKey := range machineKeys {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"debug",
 | 
			
		||||
				"create-node",
 | 
			
		||||
				"--name",
 | 
			
		||||
				fmt.Sprintf("machine-%d", index+1),
 | 
			
		||||
				"--user",
 | 
			
		||||
				"machine-rename-command",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		var machine v1.Machine
 | 
			
		||||
		err = executeAndUnmarshal(
 | 
			
		||||
			headscale,
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"--user",
 | 
			
		||||
				"machine-rename-command",
 | 
			
		||||
				"register",
 | 
			
		||||
				"--key",
 | 
			
		||||
				machineKey,
 | 
			
		||||
				"--output",
 | 
			
		||||
				"json",
 | 
			
		||||
			},
 | 
			
		||||
			&machine,
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
		machines[index] = &machine
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, machines, len(machineKeys))
 | 
			
		||||
 | 
			
		||||
	var listAll []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listAll,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listAll, 5)
 | 
			
		||||
 | 
			
		||||
	assert.Contains(t, listAll[0].GetGivenName(), "machine-1")
 | 
			
		||||
	assert.Contains(t, listAll[1].GetGivenName(), "machine-2")
 | 
			
		||||
	assert.Contains(t, listAll[2].GetGivenName(), "machine-3")
 | 
			
		||||
	assert.Contains(t, listAll[3].GetGivenName(), "machine-4")
 | 
			
		||||
	assert.Contains(t, listAll[4].GetGivenName(), "machine-5")
 | 
			
		||||
 | 
			
		||||
	for idx := 0; idx < 3; idx++ {
 | 
			
		||||
		_, err := headscale.Execute(
 | 
			
		||||
			[]string{
 | 
			
		||||
				"headscale",
 | 
			
		||||
				"nodes",
 | 
			
		||||
				"rename",
 | 
			
		||||
				"--identifier",
 | 
			
		||||
				fmt.Sprintf("%d", listAll[idx].Id),
 | 
			
		||||
				fmt.Sprintf("newmachine-%d", idx+1),
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		assert.Nil(t, err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var listAllAfterRename []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listAllAfterRename,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listAllAfterRename, 5)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, "newmachine-1", listAllAfterRename[0].GetGivenName())
 | 
			
		||||
	assert.Equal(t, "newmachine-2", listAllAfterRename[1].GetGivenName())
 | 
			
		||||
	assert.Equal(t, "newmachine-3", listAllAfterRename[2].GetGivenName())
 | 
			
		||||
	assert.Contains(t, listAllAfterRename[3].GetGivenName(), "machine-4")
 | 
			
		||||
	assert.Contains(t, listAllAfterRename[4].GetGivenName(), "machine-5")
 | 
			
		||||
 | 
			
		||||
	// Test failure for too long names
 | 
			
		||||
	result, err := headscale.Execute(
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"rename",
 | 
			
		||||
			"--identifier",
 | 
			
		||||
			fmt.Sprintf("%d", listAll[4].Id),
 | 
			
		||||
			"testmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachine12345678901234567890",
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
	assert.Contains(t, result, "not be over 63 chars")
 | 
			
		||||
 | 
			
		||||
	var listAllAfterRenameAttempt []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&listAllAfterRenameAttempt,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, listAllAfterRenameAttempt, 5)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, "newmachine-1", listAllAfterRenameAttempt[0].GetGivenName())
 | 
			
		||||
	assert.Equal(t, "newmachine-2", listAllAfterRenameAttempt[1].GetGivenName())
 | 
			
		||||
	assert.Equal(t, "newmachine-3", listAllAfterRenameAttempt[2].GetGivenName())
 | 
			
		||||
	assert.Contains(t, listAllAfterRenameAttempt[3].GetGivenName(), "machine-4")
 | 
			
		||||
	assert.Contains(t, listAllAfterRenameAttempt[4].GetGivenName(), "machine-5")
 | 
			
		||||
 | 
			
		||||
	err = scenario.Shutdown()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNodeMoveCommand(t *testing.T) {
 | 
			
		||||
	IntegrationSkip(t)
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	scenario, err := NewScenario()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	spec := map[string]int{
 | 
			
		||||
		"old-user": 0,
 | 
			
		||||
		"new-user": 0,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = scenario.CreateHeadscaleEnv(spec, []tsic.Option{}, hsic.WithTestName("clins"))
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	headscale, err := scenario.Headscale()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	// Randomly generated machine key
 | 
			
		||||
	machineKey := "nodekey:688411b767663479632d44140f08a9fde87383adc7cdeb518f62ce28a17ef0aa"
 | 
			
		||||
 | 
			
		||||
	_, err = headscale.Execute(
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"debug",
 | 
			
		||||
			"create-node",
 | 
			
		||||
			"--name",
 | 
			
		||||
			"nomad-machine",
 | 
			
		||||
			"--user",
 | 
			
		||||
			"old-user",
 | 
			
		||||
			"--key",
 | 
			
		||||
			machineKey,
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	var machine v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"--user",
 | 
			
		||||
			"old-user",
 | 
			
		||||
			"register",
 | 
			
		||||
			"--key",
 | 
			
		||||
			machineKey,
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&machine,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, uint64(1), machine.Id)
 | 
			
		||||
	assert.Equal(t, "nomad-machine", machine.Name)
 | 
			
		||||
	assert.Equal(t, machine.User.Name, "old-user")
 | 
			
		||||
 | 
			
		||||
	machineID := fmt.Sprintf("%d", machine.Id)
 | 
			
		||||
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"move",
 | 
			
		||||
			"--identifier",
 | 
			
		||||
			machineID,
 | 
			
		||||
			"--user",
 | 
			
		||||
			"new-user",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&machine,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, machine.User.Name, "new-user")
 | 
			
		||||
 | 
			
		||||
	var allNodes []v1.Machine
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&allNodes,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Len(t, allNodes, 1)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, allNodes[0].Id, machine.Id)
 | 
			
		||||
	assert.Equal(t, allNodes[0].User, machine.User)
 | 
			
		||||
	assert.Equal(t, allNodes[0].User.Name, "new-user")
 | 
			
		||||
 | 
			
		||||
	moveToNonExistingNSResult, err := headscale.Execute(
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"move",
 | 
			
		||||
			"--identifier",
 | 
			
		||||
			machineID,
 | 
			
		||||
			"--user",
 | 
			
		||||
			"non-existing-user",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Contains(
 | 
			
		||||
		t,
 | 
			
		||||
		moveToNonExistingNSResult,
 | 
			
		||||
		"User not found",
 | 
			
		||||
	)
 | 
			
		||||
	assert.Equal(t, machine.User.Name, "new-user")
 | 
			
		||||
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"move",
 | 
			
		||||
			"--identifier",
 | 
			
		||||
			machineID,
 | 
			
		||||
			"--user",
 | 
			
		||||
			"old-user",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&machine,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, machine.User.Name, "old-user")
 | 
			
		||||
 | 
			
		||||
	err = executeAndUnmarshal(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"move",
 | 
			
		||||
			"--identifier",
 | 
			
		||||
			machineID,
 | 
			
		||||
			"--user",
 | 
			
		||||
			"old-user",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		&machine,
 | 
			
		||||
	)
 | 
			
		||||
	assert.Nil(t, err)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, machine.User.Name, "old-user")
 | 
			
		||||
 | 
			
		||||
	err = scenario.Shutdown()
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,271 +0,0 @@
 | 
			
		||||
// nolint
 | 
			
		||||
package headscale
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
 | 
			
		||||
	"github.com/ory/dockertest/v3"
 | 
			
		||||
	"github.com/ory/dockertest/v3/docker"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	headscaleNetwork       = "headscale-test"
 | 
			
		||||
	headscaleHostname      = "headscale"
 | 
			
		||||
	DOCKER_EXECUTE_TIMEOUT = 10 * time.Second
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	errEnvVarEmpty = errors.New("getenv: environment variable empty")
 | 
			
		||||
 | 
			
		||||
	IpPrefix4 = netip.MustParsePrefix("100.64.0.0/10")
 | 
			
		||||
	IpPrefix6 = netip.MustParsePrefix("fd7a:115c:a1e0::/48")
 | 
			
		||||
 | 
			
		||||
	tailscaleVersions = []string{
 | 
			
		||||
		"head",
 | 
			
		||||
		"unstable",
 | 
			
		||||
		"1.38.4",
 | 
			
		||||
		"1.36.2",
 | 
			
		||||
		"1.34.2",
 | 
			
		||||
		"1.32.3",
 | 
			
		||||
		"1.30.2",
 | 
			
		||||
		"1.28.0",
 | 
			
		||||
		"1.26.2",
 | 
			
		||||
		"1.24.2",
 | 
			
		||||
		"1.22.2",
 | 
			
		||||
		"1.20.4",
 | 
			
		||||
		"1.18.2",
 | 
			
		||||
		"1.16.2",
 | 
			
		||||
		"1.14.3",
 | 
			
		||||
		"1.12.3",
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ExecuteCommandConfig struct {
 | 
			
		||||
	timeout time.Duration
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ExecuteCommandOption func(*ExecuteCommandConfig) error
 | 
			
		||||
 | 
			
		||||
func ExecuteCommandTimeout(timeout time.Duration) ExecuteCommandOption {
 | 
			
		||||
	return ExecuteCommandOption(func(conf *ExecuteCommandConfig) error {
 | 
			
		||||
		conf.timeout = timeout
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ExecuteCommand(
 | 
			
		||||
	resource *dockertest.Resource,
 | 
			
		||||
	cmd []string,
 | 
			
		||||
	env []string,
 | 
			
		||||
	options ...ExecuteCommandOption,
 | 
			
		||||
) (string, string, error) {
 | 
			
		||||
	var stdout bytes.Buffer
 | 
			
		||||
	var stderr bytes.Buffer
 | 
			
		||||
 | 
			
		||||
	execConfig := ExecuteCommandConfig{
 | 
			
		||||
		timeout: DOCKER_EXECUTE_TIMEOUT,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, opt := range options {
 | 
			
		||||
		if err := opt(&execConfig); err != nil {
 | 
			
		||||
			return "", "", fmt.Errorf("execute-command/options: %w", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type result struct {
 | 
			
		||||
		exitCode int
 | 
			
		||||
		err      error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resultChan := make(chan result, 1)
 | 
			
		||||
 | 
			
		||||
	// Run your long running function in it's own goroutine and pass back it's
 | 
			
		||||
	// response into our channel.
 | 
			
		||||
	go func() {
 | 
			
		||||
		exitCode, err := resource.Exec(
 | 
			
		||||
			cmd,
 | 
			
		||||
			dockertest.ExecOptions{
 | 
			
		||||
				Env:    append(env, "HEADSCALE_LOG_LEVEL=disabled"),
 | 
			
		||||
				StdOut: &stdout,
 | 
			
		||||
				StdErr: &stderr,
 | 
			
		||||
			},
 | 
			
		||||
		)
 | 
			
		||||
		resultChan <- result{exitCode, err}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	// Listen on our channel AND a timeout channel - which ever happens first.
 | 
			
		||||
	select {
 | 
			
		||||
	case res := <-resultChan:
 | 
			
		||||
		if res.err != nil {
 | 
			
		||||
			return stdout.String(), stderr.String(), res.err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if res.exitCode != 0 {
 | 
			
		||||
			fmt.Println("Command: ", cmd)
 | 
			
		||||
			fmt.Println("stdout: ", stdout.String())
 | 
			
		||||
			fmt.Println("stderr: ", stderr.String())
 | 
			
		||||
 | 
			
		||||
			return stdout.String(), stderr.String(), fmt.Errorf(
 | 
			
		||||
				"command failed with: %s",
 | 
			
		||||
				stderr.String(),
 | 
			
		||||
			)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return stdout.String(), stderr.String(), nil
 | 
			
		||||
	case <-time.After(execConfig.timeout):
 | 
			
		||||
 | 
			
		||||
		return stdout.String(), stderr.String(), fmt.Errorf(
 | 
			
		||||
			"command timed out after %s",
 | 
			
		||||
			execConfig.timeout,
 | 
			
		||||
		)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DockerRestartPolicy(config *docker.HostConfig) {
 | 
			
		||||
	// set AutoRemove to true so that stopped container goes away by itself on error *immediately*.
 | 
			
		||||
	// when set to false, containers remain until the end of the integration test.
 | 
			
		||||
	config.AutoRemove = false
 | 
			
		||||
	config.RestartPolicy = docker.RestartPolicy{
 | 
			
		||||
		Name: "no",
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DockerAllowLocalIPv6(config *docker.HostConfig) {
 | 
			
		||||
	if config.Sysctls == nil {
 | 
			
		||||
		config.Sysctls = make(map[string]string, 1)
 | 
			
		||||
	}
 | 
			
		||||
	config.Sysctls["net.ipv6.conf.all.disable_ipv6"] = "0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func DockerAllowNetworkAdministration(config *docker.HostConfig) {
 | 
			
		||||
	config.CapAdd = append(config.CapAdd, "NET_ADMIN")
 | 
			
		||||
	config.Mounts = append(config.Mounts, docker.HostMount{
 | 
			
		||||
		Type:   "bind",
 | 
			
		||||
		Source: "/dev/net/tun",
 | 
			
		||||
		Target: "/dev/net/tun",
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getDockerBuildOptions(version string) *dockertest.BuildOptions {
 | 
			
		||||
	var tailscaleBuildOptions *dockertest.BuildOptions
 | 
			
		||||
	switch version {
 | 
			
		||||
	case "head":
 | 
			
		||||
		tailscaleBuildOptions = &dockertest.BuildOptions{
 | 
			
		||||
			Dockerfile: "Dockerfile.tailscale-HEAD",
 | 
			
		||||
			ContextDir: ".",
 | 
			
		||||
			BuildArgs:  []docker.BuildArg{},
 | 
			
		||||
		}
 | 
			
		||||
	case "unstable":
 | 
			
		||||
		tailscaleBuildOptions = &dockertest.BuildOptions{
 | 
			
		||||
			Dockerfile: "Dockerfile.tailscale",
 | 
			
		||||
			ContextDir: ".",
 | 
			
		||||
			BuildArgs: []docker.BuildArg{
 | 
			
		||||
				{
 | 
			
		||||
					Name:  "TAILSCALE_VERSION",
 | 
			
		||||
					Value: "*", // Installs the latest version https://askubuntu.com/a/824926
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Name:  "TAILSCALE_CHANNEL",
 | 
			
		||||
					Value: "unstable",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	default:
 | 
			
		||||
		tailscaleBuildOptions = &dockertest.BuildOptions{
 | 
			
		||||
			Dockerfile: "Dockerfile.tailscale",
 | 
			
		||||
			ContextDir: ".",
 | 
			
		||||
			BuildArgs: []docker.BuildArg{
 | 
			
		||||
				{
 | 
			
		||||
					Name:  "TAILSCALE_VERSION",
 | 
			
		||||
					Value: version,
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					Name:  "TAILSCALE_CHANNEL",
 | 
			
		||||
					Value: "stable",
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return tailscaleBuildOptions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getDNSNames(
 | 
			
		||||
	headscale *dockertest.Resource,
 | 
			
		||||
) ([]string, error) {
 | 
			
		||||
	listAllResult, _, err := ExecuteCommand(
 | 
			
		||||
		headscale,
 | 
			
		||||
		[]string{
 | 
			
		||||
			"headscale",
 | 
			
		||||
			"nodes",
 | 
			
		||||
			"list",
 | 
			
		||||
			"--output",
 | 
			
		||||
			"json",
 | 
			
		||||
		},
 | 
			
		||||
		[]string{},
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var listAll []v1.Machine
 | 
			
		||||
	err = json.Unmarshal([]byte(listAllResult), &listAll)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hostnames := make([]string, len(listAll))
 | 
			
		||||
 | 
			
		||||
	for index := range listAll {
 | 
			
		||||
		hostnames[index] = listAll[index].GetGivenName()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return hostnames, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetEnvStr(key string) (string, error) {
 | 
			
		||||
	v := os.Getenv(key)
 | 
			
		||||
	if v == "" {
 | 
			
		||||
		return v, errEnvVarEmpty
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return v, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetEnvBool(key string) (bool, error) {
 | 
			
		||||
	s, err := GetEnvStr(key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	v, err := strconv.ParseBool(s)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return v, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetFirstOrCreateNetwork(pool *dockertest.Pool, name string) (dockertest.Network, error) {
 | 
			
		||||
	networks, err := pool.NetworksByName(name)
 | 
			
		||||
	if err != nil || len(networks) == 0 {
 | 
			
		||||
		if _, err := pool.CreateNetwork(name); err == nil {
 | 
			
		||||
			// Create does not give us an updated version of the resource, so we need to
 | 
			
		||||
			// get it again.
 | 
			
		||||
			networks, err := pool.NetworksByName(name)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return dockertest.Network{}, err
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return networks[0], nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return networks[0], nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								integration_legacy/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								integration_legacy/.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,3 +0,0 @@
 | 
			
		||||
derp.yaml
 | 
			
		||||
*.sqlite
 | 
			
		||||
*.sqlite3
 | 
			
		||||
@ -1,56 +0,0 @@
 | 
			
		||||
acl_policy_path: ""
 | 
			
		||||
cli:
 | 
			
		||||
  insecure: false
 | 
			
		||||
  timeout: 5s
 | 
			
		||||
db_path: /tmp/integration_test_db.sqlite3
 | 
			
		||||
db_ssl: false
 | 
			
		||||
db_type: sqlite3
 | 
			
		||||
derp:
 | 
			
		||||
  auto_update_enabled: false
 | 
			
		||||
  server:
 | 
			
		||||
    enabled: false
 | 
			
		||||
    stun:
 | 
			
		||||
      enabled: true
 | 
			
		||||
  update_frequency: 1m
 | 
			
		||||
  urls:
 | 
			
		||||
    - https://controlplane.tailscale.com/derpmap/default
 | 
			
		||||
dns_config:
 | 
			
		||||
  override_local_dns: true
 | 
			
		||||
  base_domain: headscale.net
 | 
			
		||||
  domains: []
 | 
			
		||||
  magic_dns: true
 | 
			
		||||
  nameservers:
 | 
			
		||||
    - 127.0.0.11
 | 
			
		||||
    - 1.1.1.1
 | 
			
		||||
ephemeral_node_inactivity_timeout: 30m
 | 
			
		||||
node_update_check_interval: 10s
 | 
			
		||||
grpc_allow_insecure: false
 | 
			
		||||
grpc_listen_addr: :50443
 | 
			
		||||
ip_prefixes:
 | 
			
		||||
  - fd7a:115c:a1e0::/48
 | 
			
		||||
  - 100.64.0.0/10
 | 
			
		||||
listen_addr: 0.0.0.0:18080
 | 
			
		||||
log:
 | 
			
		||||
  level: disabled
 | 
			
		||||
  format: text
 | 
			
		||||
logtail:
 | 
			
		||||
  enabled: false
 | 
			
		||||
metrics_listen_addr: 127.0.0.1:19090
 | 
			
		||||
oidc:
 | 
			
		||||
  expiry: 180d
 | 
			
		||||
  only_start_if_oidc_is_available: true
 | 
			
		||||
  scope:
 | 
			
		||||
    - openid
 | 
			
		||||
    - profile
 | 
			
		||||
    - email
 | 
			
		||||
  strip_email_domain: true
 | 
			
		||||
  use_expiry_from_token: false
 | 
			
		||||
private_key_path: private.key
 | 
			
		||||
noise:
 | 
			
		||||
  private_key_path: noise_private.key
 | 
			
		||||
server_url: http://headscale:18080
 | 
			
		||||
tls_letsencrypt_cache_dir: /var/www/.cache
 | 
			
		||||
tls_letsencrypt_challenge_type: HTTP-01
 | 
			
		||||
unix_socket: /var/run/headscale.sock
 | 
			
		||||
unix_socket_permission: "0o770"
 | 
			
		||||
randomize_client_port: false
 | 
			
		||||
@ -1,31 +0,0 @@
 | 
			
		||||
log:
 | 
			
		||||
  level: trace
 | 
			
		||||
acl_policy_path: ""
 | 
			
		||||
db_type: sqlite3
 | 
			
		||||
ephemeral_node_inactivity_timeout: 30m
 | 
			
		||||
node_update_check_interval: 10s
 | 
			
		||||
ip_prefixes:
 | 
			
		||||
  - fd7a:115c:a1e0::/48
 | 
			
		||||
  - 100.64.0.0/10
 | 
			
		||||
dns_config:
 | 
			
		||||
  override_local_dns: true
 | 
			
		||||
  base_domain: headscale.net
 | 
			
		||||
  magic_dns: true
 | 
			
		||||
  domains: []
 | 
			
		||||
  nameservers:
 | 
			
		||||
    - 127.0.0.11
 | 
			
		||||
    - 1.1.1.1
 | 
			
		||||
db_path: /tmp/integration_test_db.sqlite3
 | 
			
		||||
db_ssl: false
 | 
			
		||||
private_key_path: private.key
 | 
			
		||||
noise:
 | 
			
		||||
  private_key_path: noise_private.key
 | 
			
		||||
listen_addr: 0.0.0.0:18080
 | 
			
		||||
metrics_listen_addr: 127.0.0.1:19090
 | 
			
		||||
server_url: http://headscale:18080
 | 
			
		||||
 | 
			
		||||
derp:
 | 
			
		||||
  urls:
 | 
			
		||||
    - https://controlplane.tailscale.com/derpmap/default
 | 
			
		||||
  auto_update_enabled: false
 | 
			
		||||
  update_frequency: 1m
 | 
			
		||||
@ -1,55 +0,0 @@
 | 
			
		||||
acl_policy_path: ""
 | 
			
		||||
cli:
 | 
			
		||||
  insecure: false
 | 
			
		||||
  timeout: 5s
 | 
			
		||||
db_path: /tmp/integration_test_db.sqlite3
 | 
			
		||||
db_ssl: false
 | 
			
		||||
db_type: sqlite3
 | 
			
		||||
derp:
 | 
			
		||||
  auto_update_enabled: false
 | 
			
		||||
  server:
 | 
			
		||||
    enabled: false
 | 
			
		||||
    stun:
 | 
			
		||||
      enabled: true
 | 
			
		||||
  update_frequency: 1m
 | 
			
		||||
  urls:
 | 
			
		||||
    - https://controlplane.tailscale.com/derpmap/default
 | 
			
		||||
dns_config:
 | 
			
		||||
  override_local_dns: true
 | 
			
		||||
  base_domain: headscale.net
 | 
			
		||||
  domains: []
 | 
			
		||||
  magic_dns: true
 | 
			
		||||
  nameservers:
 | 
			
		||||
    - 1.1.1.1
 | 
			
		||||
ephemeral_node_inactivity_timeout: 30m
 | 
			
		||||
node_update_check_interval: 30s
 | 
			
		||||
grpc_allow_insecure: false
 | 
			
		||||
grpc_listen_addr: :50443
 | 
			
		||||
ip_prefixes:
 | 
			
		||||
  - fd7a:115c:a1e0::/48
 | 
			
		||||
  - 100.64.0.0/10
 | 
			
		||||
listen_addr: 0.0.0.0:18080
 | 
			
		||||
log:
 | 
			
		||||
  level: disabled
 | 
			
		||||
  format: text
 | 
			
		||||
logtail:
 | 
			
		||||
  enabled: false
 | 
			
		||||
metrics_listen_addr: 127.0.0.1:19090
 | 
			
		||||
oidc:
 | 
			
		||||
  expiry: 180d
 | 
			
		||||
  only_start_if_oidc_is_available: true
 | 
			
		||||
  scope:
 | 
			
		||||
    - openid
 | 
			
		||||
    - profile
 | 
			
		||||
    - email
 | 
			
		||||
  strip_email_domain: true
 | 
			
		||||
  use_expiry_from_token: false
 | 
			
		||||
private_key_path: private.key
 | 
			
		||||
noise:
 | 
			
		||||
  private_key_path: noise_private.key
 | 
			
		||||
server_url: http://headscale:18080
 | 
			
		||||
tls_letsencrypt_cache_dir: /var/www/.cache
 | 
			
		||||
tls_letsencrypt_challenge_type: HTTP-01
 | 
			
		||||
unix_socket: /var/run/headscale.sock
 | 
			
		||||
unix_socket_permission: "0o770"
 | 
			
		||||
randomize_client_port: false
 | 
			
		||||
@ -1,30 +0,0 @@
 | 
			
		||||
log:
 | 
			
		||||
  level: trace
 | 
			
		||||
acl_policy_path: ""
 | 
			
		||||
db_type: sqlite3
 | 
			
		||||
ephemeral_node_inactivity_timeout: 30m
 | 
			
		||||
node_update_check_interval: 30s
 | 
			
		||||
ip_prefixes:
 | 
			
		||||
  - fd7a:115c:a1e0::/48
 | 
			
		||||
  - 100.64.0.0/10
 | 
			
		||||
dns_config:
 | 
			
		||||
  override_local_dns: true
 | 
			
		||||
  base_domain: headscale.net
 | 
			
		||||
  magic_dns: true
 | 
			
		||||
  domains: []
 | 
			
		||||
  nameservers:
 | 
			
		||||
    - 1.1.1.1
 | 
			
		||||
db_path: /tmp/integration_test_db.sqlite3
 | 
			
		||||
db_ssl: false
 | 
			
		||||
private_key_path: private.key
 | 
			
		||||
noise:
 | 
			
		||||
  private_key_path: noise_private.key
 | 
			
		||||
listen_addr: 0.0.0.0:18080
 | 
			
		||||
metrics_listen_addr: 127.0.0.1:19090
 | 
			
		||||
server_url: http://headscale:18080
 | 
			
		||||
 | 
			
		||||
derp:
 | 
			
		||||
  urls:
 | 
			
		||||
    - https://controlplane.tailscale.com/derpmap/default
 | 
			
		||||
  auto_update_enabled: false
 | 
			
		||||
  update_frequency: 1m
 | 
			
		||||
@ -1,56 +0,0 @@
 | 
			
		||||
acl_policy_path: ""
 | 
			
		||||
cli:
 | 
			
		||||
  insecure: false
 | 
			
		||||
  timeout: 5s
 | 
			
		||||
db_path: /tmp/integration_test_db.sqlite3
 | 
			
		||||
db_ssl: false
 | 
			
		||||
db_type: sqlite3
 | 
			
		||||
derp:
 | 
			
		||||
  auto_update_enabled: false
 | 
			
		||||
  server:
 | 
			
		||||
    enabled: false
 | 
			
		||||
    stun:
 | 
			
		||||
      enabled: true
 | 
			
		||||
  update_frequency: 1m
 | 
			
		||||
  urls:
 | 
			
		||||
    - https://controlplane.tailscale.com/derpmap/default
 | 
			
		||||
dns_config:
 | 
			
		||||
  override_local_dns: true
 | 
			
		||||
  base_domain: headscale.net
 | 
			
		||||
  domains: []
 | 
			
		||||
  magic_dns: true
 | 
			
		||||
  nameservers:
 | 
			
		||||
    - 127.0.0.11
 | 
			
		||||
    - 1.1.1.1
 | 
			
		||||
ephemeral_node_inactivity_timeout: 30m
 | 
			
		||||
node_update_check_interval: 10s
 | 
			
		||||
grpc_allow_insecure: false
 | 
			
		||||
grpc_listen_addr: :50443
 | 
			
		||||
ip_prefixes:
 | 
			
		||||
  - fd7a:115c:a1e0::/48
 | 
			
		||||
  - 100.64.0.0/10
 | 
			
		||||
listen_addr: 0.0.0.0:8080
 | 
			
		||||
log:
 | 
			
		||||
  format: text
 | 
			
		||||
  level: disabled
 | 
			
		||||
logtail:
 | 
			
		||||
  enabled: false
 | 
			
		||||
metrics_listen_addr: 127.0.0.1:9090
 | 
			
		||||
oidc:
 | 
			
		||||
  expiry: 180d
 | 
			
		||||
  only_start_if_oidc_is_available: true
 | 
			
		||||
  scope:
 | 
			
		||||
    - openid
 | 
			
		||||
    - profile
 | 
			
		||||
    - email
 | 
			
		||||
  strip_email_domain: true
 | 
			
		||||
  use_expiry_from_token: false
 | 
			
		||||
private_key_path: private.key
 | 
			
		||||
noise:
 | 
			
		||||
  private_key_path: noise_private.key
 | 
			
		||||
server_url: http://headscale:8080
 | 
			
		||||
tls_letsencrypt_cache_dir: /var/www/.cache
 | 
			
		||||
tls_letsencrypt_challenge_type: HTTP-01
 | 
			
		||||
unix_socket: /var/run/headscale.sock
 | 
			
		||||
unix_socket_permission: "0o770"
 | 
			
		||||
randomize_client_port: false
 | 
			
		||||
@ -1,54 +0,0 @@
 | 
			
		||||
acl_policy_path: ""
 | 
			
		||||
cli:
 | 
			
		||||
  insecure: false
 | 
			
		||||
  timeout: 5s
 | 
			
		||||
db_path: /tmp/integration_test_db.sqlite3
 | 
			
		||||
db_type: sqlite3
 | 
			
		||||
derp:
 | 
			
		||||
  auto_update_enabled: false
 | 
			
		||||
  server:
 | 
			
		||||
    enabled: false
 | 
			
		||||
    stun:
 | 
			
		||||
      enabled: true
 | 
			
		||||
  update_frequency: 1m
 | 
			
		||||
  urls:
 | 
			
		||||
    - https://controlplane.tailscale.com/derpmap/default
 | 
			
		||||
dns_config:
 | 
			
		||||
  base_domain: headscale.net
 | 
			
		||||
  domains: []
 | 
			
		||||
  magic_dns: true
 | 
			
		||||
  nameservers:
 | 
			
		||||
    - 127.0.0.11
 | 
			
		||||
    - 1.1.1.1
 | 
			
		||||
  override_local_dns: true
 | 
			
		||||
ephemeral_node_inactivity_timeout: 30m
 | 
			
		||||
grpc_allow_insecure: false
 | 
			
		||||
grpc_listen_addr: :50443
 | 
			
		||||
ip_prefixes:
 | 
			
		||||
  - fd7a:115c:a1e0::/48
 | 
			
		||||
  - 100.64.0.0/10
 | 
			
		||||
listen_addr: 0.0.0.0:18080
 | 
			
		||||
log:
 | 
			
		||||
  format: text
 | 
			
		||||
  level: disabled
 | 
			
		||||
logtail:
 | 
			
		||||
  enabled: false
 | 
			
		||||
metrics_listen_addr: 127.0.0.1:19090
 | 
			
		||||
node_update_check_interval: 10s
 | 
			
		||||
noise:
 | 
			
		||||
  private_key_path: noise_private.key
 | 
			
		||||
oidc:
 | 
			
		||||
  only_start_if_oidc_is_available: true
 | 
			
		||||
  scope:
 | 
			
		||||
    - openid
 | 
			
		||||
    - profile
 | 
			
		||||
    - email
 | 
			
		||||
  strip_email_domain: true
 | 
			
		||||
private_key_path: private.key
 | 
			
		||||
randomize_client_port: false
 | 
			
		||||
server_url: http://headscale:18080
 | 
			
		||||
tls_client_auth_mode: relaxed
 | 
			
		||||
tls_letsencrypt_cache_dir: /var/www/.cache
 | 
			
		||||
tls_letsencrypt_challenge_type: HTTP-01
 | 
			
		||||
unix_socket: /var/run/headscale.sock
 | 
			
		||||
unix_socket_permission: "0o770"
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user