2023-01-05 16:08:40 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
//go:generate go run ./main.go
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"os"
|
|
|
|
"text/template"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
jobFileNameTemplate = `test-integration-v2-%s.yaml`
|
|
|
|
jobTemplate = template.Must(template.New("jobTemplate").Parse(`
|
|
|
|
# DO NOT EDIT, generated with cmd/gh-action-integration-generator/main.go
|
|
|
|
# To regenerate, run "go generate" in cmd/gh-action-integration-generator/
|
|
|
|
|
|
|
|
name: Integration Test v2 - {{.Name}}
|
|
|
|
|
|
|
|
on: [pull_request]
|
|
|
|
|
|
|
|
jobs:
|
|
|
|
test:
|
|
|
|
runs-on: ubuntu-latest
|
|
|
|
|
|
|
|
steps:
|
|
|
|
- uses: actions/checkout@v3
|
|
|
|
with:
|
|
|
|
fetch-depth: 2
|
|
|
|
|
|
|
|
- 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 general integration tests
|
|
|
|
if: steps.changed-files.outputs.any_changed == 'true'
|
|
|
|
run: |
|
|
|
|
nix develop --command -- docker run \
|
|
|
|
--tty --rm \
|
|
|
|
--volume ~/.cache/hs-integration-go:/go \
|
|
|
|
--name headscale-test-suite \
|
|
|
|
--volume $PWD:$PWD -w $PWD/integration \
|
|
|
|
--volume /var/run/docker.sock:/var/run/docker.sock \
|
|
|
|
golang:1 \
|
|
|
|
go test ./... \
|
|
|
|
-tags ts2019 \
|
|
|
|
-failfast \
|
|
|
|
-timeout 120m \
|
|
|
|
-parallel 1 \
|
2023-01-06 15:40:03 +01:00
|
|
|
-run "^{{.Name}}$"
|
2023-01-05 16:08:40 +01:00
|
|
|
`))
|
|
|
|
)
|
|
|
|
|
|
|
|
const workflowFilePerm = 0o600
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
type testConfig struct {
|
|
|
|
Name string
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO(kradalby): automatic fetch tests at runtime
|
|
|
|
tests := []string{
|
|
|
|
"TestAuthKeyLogoutAndRelogin",
|
|
|
|
"TestAuthWebFlowAuthenticationPingAll",
|
|
|
|
"TestAuthWebFlowLogoutAndRelogin",
|
|
|
|
"TestCreateTailscale",
|
|
|
|
"TestEnablingRoutes",
|
|
|
|
"TestHeadscale",
|
|
|
|
"TestNamespaceCommand",
|
|
|
|
"TestOIDCAuthenticationPingAll",
|
|
|
|
"TestOIDCExpireNodes",
|
|
|
|
"TestPingAllByHostname",
|
|
|
|
"TestPingAllByIP",
|
|
|
|
"TestPreAuthKeyCommand",
|
|
|
|
"TestPreAuthKeyCommandReusableEphemeral",
|
|
|
|
"TestPreAuthKeyCommandWithoutExpiry",
|
|
|
|
"TestResolveMagicDNS",
|
|
|
|
"TestSSHIsBlockedInACL",
|
|
|
|
"TestSSHMultipleNamespacesAllToAll",
|
|
|
|
"TestSSHNoSSHConfigured",
|
|
|
|
"TestSSHOneNamespaceAllToAll",
|
|
|
|
"TestSSNamespaceOnlyIsolation",
|
|
|
|
"TestTaildrop",
|
|
|
|
"TestTailscaleNodesJoiningHeadcale",
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, test := range tests {
|
|
|
|
var content bytes.Buffer
|
|
|
|
|
|
|
|
if err := jobTemplate.Execute(&content, testConfig{
|
|
|
|
Name: test,
|
|
|
|
}); err != nil {
|
|
|
|
log.Fatalf("failed to render template: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
path := "../../.github/workflows/" + fmt.Sprintf(jobFileNameTemplate, test)
|
|
|
|
|
|
|
|
err := os.WriteFile(path, content.Bytes(), workflowFilePerm)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatalf("failed to write github job: %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|