mirror of
https://github.com/kemko/nomad.git
synced 2026-01-05 01:45:44 +03:00
Some time ago the Windows host we were using as a Nomad client agent test target started failing to allow ssh connections. The underlying problem appears to be with sysprep but I wasn't able to debug the exact cause as it's not an area I have a lot of expertise in. Swap out the deprecated Windows 2016 host for a Windows 2022 host. This will use a base image provided by Amazon and then we'll use a userdata script to bootstrap ssh and some target directories for Terraform to upload files to. The more modern Windows will let us drop some of extra powershell scripts we were using as well. Fixes: https://hashicorp.atlassian.net/browse/NMD-151 Fixes: https://github.com/hashicorp/nomad-e2e/issues/125
150 lines
4.1 KiB
Go
150 lines
4.1 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package artifact
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/hashicorp/nomad/api"
|
|
"github.com/hashicorp/nomad/e2e/e2eutil"
|
|
"github.com/hashicorp/nomad/helper/uuid"
|
|
"github.com/shoenig/test/must"
|
|
)
|
|
|
|
func TestArtifact(t *testing.T) {
|
|
nomad := e2eutil.NomadClient(t)
|
|
|
|
e2eutil.WaitForLeader(t, nomad)
|
|
e2eutil.WaitForNodesReady(t, nomad, 1)
|
|
|
|
t.Run("testLinux", testLinux)
|
|
t.Run("testWindows", testWindows)
|
|
t.Run("testLimits", testLimits)
|
|
}
|
|
|
|
// artifactCheckLogContents verifies expected logs for artifact downloader tests.
|
|
//
|
|
// each task is designed to download the artifact in some way then cat the go.mod
|
|
// file, so we just need to read the logs
|
|
//
|
|
// note: git requires the use of destination (hence no default form)
|
|
func artifactCheckLogContents(t *testing.T, nomad *api.Client, group, task string, allocations []map[string]string) {
|
|
var allocID string
|
|
for _, alloc := range allocations {
|
|
if alloc["Task Group"] == group {
|
|
allocID = alloc["ID"]
|
|
break
|
|
}
|
|
}
|
|
e2eutil.WaitForAllocStopped(t, nomad, allocID)
|
|
t.Run(task, func(t *testing.T) {
|
|
logs, err := e2eutil.AllocTaskLogs(allocID, task, e2eutil.LogsStdOut)
|
|
must.NoError(t, err)
|
|
must.StrContains(t, logs, "module github.com/hashicorp/go-set/v3")
|
|
})
|
|
}
|
|
|
|
func testWindows(t *testing.T) {
|
|
nomad := e2eutil.NomadClient(t)
|
|
jobID := "artifact-windows-" + uuid.Short()
|
|
jobIDs := []string{jobID}
|
|
t.Cleanup(e2eutil.CleanupJobsAndGC(t, &jobIDs))
|
|
|
|
// start job
|
|
e2eutil.RegisterAndWaitForAllocs(t, nomad, "./input/artifact_windows.nomad", jobID, "")
|
|
|
|
// get allocations
|
|
allocations, err := e2eutil.AllocsForJob(jobID, "")
|
|
must.NoError(t, err)
|
|
must.Len(t, 1, allocations)
|
|
|
|
// assert log contents for each task
|
|
check := func(group, task string) {
|
|
artifactCheckLogContents(t, nomad, group, task, allocations)
|
|
}
|
|
|
|
check("rawexec", "rawexec_file_default")
|
|
check("rawexec", "rawexec_file_custom")
|
|
check("rawexec", "rawexec_zip_default")
|
|
check("rawexec", "rawexec_zip_custom")
|
|
|
|
// todo(shoenig) needs git on windows
|
|
// https://github.com/hashicorp/nomad/issues/15505
|
|
// check("rawexec", "rawexec_git_custom")
|
|
}
|
|
|
|
func testLinux(t *testing.T) {
|
|
nomad := e2eutil.NomadClient(t)
|
|
jobID := "artifact-linux-" + uuid.Short()
|
|
jobIDs := []string{jobID}
|
|
t.Cleanup(e2eutil.CleanupJobsAndGC(t, &jobIDs))
|
|
|
|
// start job
|
|
e2eutil.RegisterAndWaitForAllocs(t, nomad, "./input/artifact_linux.nomad", jobID, "")
|
|
|
|
// get allocations
|
|
allocations, err := e2eutil.AllocsForJob(jobID, "")
|
|
must.NoError(t, err)
|
|
must.Len(t, 3, allocations)
|
|
|
|
// assert log contents for each task
|
|
check := func(group, task string) {
|
|
artifactCheckLogContents(t, nomad, group, task, allocations)
|
|
}
|
|
|
|
check("rawexec", "rawexec_file_default")
|
|
check("rawexec", "rawexec_file_custom")
|
|
check("rawexec", "rawexec_file_alloc_dots")
|
|
check("rawexec", "rawexec_file_alloc_env")
|
|
check("rawexec", "rawexec_zip_default")
|
|
check("rawexec", "rawexec_zip_custom")
|
|
check("rawexec", "rawexec_git_custom")
|
|
|
|
check("exec", "exec_file_default")
|
|
check("exec", "exec_file_custom")
|
|
check("exec", "exec_file_alloc")
|
|
check("exec", "exec_zip_default")
|
|
check("exec", "exec_zip_custom")
|
|
check("exec", "exec_git_custom")
|
|
|
|
check("docker", "docker_file_default")
|
|
check("docker", "docker_file_custom")
|
|
check("docker", "docker_file_alloc")
|
|
check("docker", "docker_zip_default")
|
|
check("docker", "docker_zip_custom")
|
|
check("docker", "docker_git_custom")
|
|
}
|
|
|
|
func testLimits(t *testing.T) {
|
|
// defaults are 100GB, 4096 files; we run into the files count here
|
|
|
|
jobID := "artifact-limits-" + uuid.Short()
|
|
jobIDs := []string{jobID}
|
|
t.Cleanup(e2eutil.CleanupJobsAndGC(t, &jobIDs))
|
|
|
|
err := e2eutil.Register(jobID, "./input/artifact_limits.nomad")
|
|
must.NoError(t, err)
|
|
|
|
err = e2eutil.WaitForAllocStatusExpected(jobID, "", []string{"failed"})
|
|
must.NoError(t, err)
|
|
|
|
m, err := e2eutil.AllocTaskEventsForJob(jobID, "")
|
|
must.NoError(t, err)
|
|
|
|
found := false
|
|
SCAN:
|
|
for _, events := range m {
|
|
for _, event := range events {
|
|
for label, description := range event {
|
|
if label == "Type" && description == "Failed Artifact Download" {
|
|
found = true
|
|
break SCAN
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
must.True(t, found)
|
|
}
|