From f95749f1cacad532f97875ea2e68e3315e5872ae Mon Sep 17 00:00:00 2001 From: Mahmood Ali Date: Wed, 27 Feb 2019 08:10:23 -0500 Subject: [PATCH] docker: report unhealthy in unsupported Windows (#5356) On Windows, Nomad only supports Windows containers, so report as unhealthy otherwise. --- drivers/docker/fingerprint.go | 14 ++++++++++++++ drivers/docker/fingerprint_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 drivers/docker/fingerprint_test.go diff --git a/drivers/docker/fingerprint.go b/drivers/docker/fingerprint.go index 10a7306c6..694a8ce33 100644 --- a/drivers/docker/fingerprint.go +++ b/drivers/docker/fingerprint.go @@ -2,6 +2,7 @@ package docker import ( "context" + "runtime" "sort" "strings" "time" @@ -158,6 +159,19 @@ func (d *Driver) buildFingerprint() *drivers.Fingerprint { fp.Attributes["driver.docker.runtimes"] = pstructs.NewStringAttribute( strings.Join(runtimeNames, ",")) + fp.Attributes["driver.docker.os_type"] = pstructs.NewStringAttribute(dockerInfo.OSType) + + if runtime.GOOS == "windows" && dockerInfo.OSType == "linux" { + if d.fingerprintSuccessful() { + d.logger.Warn("detected Linux docker containers on Windows; only Windows containers are supported") + } + + d.setFingerprintFailure() + return &drivers.Fingerprint{ + Health: drivers.HealthStateUnhealthy, + HealthDescription: "Docker is configured with Linux containers; only Windows containers are supported", + } + } } d.setFingerprintSuccess() diff --git a/drivers/docker/fingerprint_test.go b/drivers/docker/fingerprint_test.go new file mode 100644 index 000000000..db39a31de --- /dev/null +++ b/drivers/docker/fingerprint_test.go @@ -0,0 +1,27 @@ +package docker + +import ( + "testing" + + "github.com/hashicorp/nomad/client/testutil" + "github.com/hashicorp/nomad/helper/testlog" + "github.com/hashicorp/nomad/plugins/drivers" + tu "github.com/hashicorp/nomad/testutil" + "github.com/stretchr/testify/require" +) + +// TestDockerDriver_FingerprintHealth asserts that docker reports healthy +// whenever Docker is supported. +// +// In Linux CI and AppVeyor Windows environment, it should be enabled. +func TestDockerDriver_FingerprintHealth(t *testing.T) { + if !tu.IsCI() { + t.Parallel() + } + testutil.DockerCompatible(t) + + d := NewDockerDriver(testlog.HCLogger(t)).(*Driver) + + fp := d.buildFingerprint() + require.Equal(t, drivers.HealthStateHealthy, fp.Health) +}