From 60bb50c432f016b93c8600a7268fe4433fd983cd Mon Sep 17 00:00:00 2001 From: Mahmood Ali Date: Wed, 20 Jan 2021 10:24:23 -0500 Subject: [PATCH] e2e deflake namespaces: only check namespace jobs Deflake namespace e2e test by only asserting on jobs related to the namespace tests. During our e2e tests, some left over jobs (e.g. prometheus) are left running while being shutdown and cause the test to fail. --- e2e/e2eutil/allocs.go | 2 +- e2e/namespaces/namespaces.go | 66 ++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/e2e/e2eutil/allocs.go b/e2e/e2eutil/allocs.go index 625732f44..fcf6f6057 100644 --- a/e2e/e2eutil/allocs.go +++ b/e2e/e2eutil/allocs.go @@ -208,7 +208,7 @@ func AllocExec(allocID, taskID, execCmd, ns string, wc *WaitConfig) (string, err got, err = Command(cmd[0], cmd[1:]...) return err == nil, err }, func(e error) { - err = fmt.Errorf("exec failed: '%s'", strings.Join(cmd, " ")) + err = fmt.Errorf("exec failed: '%s': %v", strings.Join(cmd, " "), e) }) return got, err } diff --git a/e2e/namespaces/namespaces.go b/e2e/namespaces/namespaces.go index a484bcc7f..67a81d913 100644 --- a/e2e/namespaces/namespaces.go +++ b/e2e/namespaces/namespaces.go @@ -3,6 +3,7 @@ package namespaces import ( "fmt" "os" + "strings" e2e "github.com/hashicorp/nomad/e2e/e2eutil" "github.com/hashicorp/nomad/e2e/framework" @@ -88,61 +89,69 @@ func (tc *NamespacesE2ETest) TestNamespacesFiltering(f *framework.F) { jobDefault := run("namespaces/input/namespace_default.nomad", "") // exercise 'nomad job status' filtering + parse := func(out string) []map[string]string { + rows, err := e2e.ParseColumns(out) + f.NoError(err, "failed to parse job status output: %v", out) + + result := make([]map[string]string, 0, len(rows)) + for _, row := range rows { + jobID := row["Job ID"] + if jobID == "" { + jobID = row["ID"] + } + if strings.HasPrefix(jobID, "test-namespace-") { + result = append(result, row) + } + } + return result + } out, err := e2e.Command("nomad", "job", "status", "-namespace", "NamespaceA") f.NoError(err, "'nomad job status -namespace NamespaceA' failed") - rows, err := e2e.ParseColumns(out) - f.NoError(err, "could not parse job status output") - f.Equal(1, len(rows)) + rows := parse(out) + f.Len(rows, 1) f.Equal(jobA, rows[0]["ID"]) out, err = e2e.Command("nomad", "job", "status", "-namespace", "NamespaceB") f.NoError(err, "'nomad job status -namespace NamespaceB' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse job status output") - f.Equal(1, len(rows)) + rows = parse(out) + f.Len(rows, 1) f.Equal(jobB, rows[0]["ID"]) out, err = e2e.Command("nomad", "job", "status", "-namespace", "*") f.NoError(err, "'nomad job status -namespace *' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse job status output") + rows = parse(out) f.Equal(3, len(rows)) out, err = e2e.Command("nomad", "job", "status") f.NoError(err, "'nomad job status' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse job status output") - f.Equal(1, len(rows)) + rows = parse(out) + f.Len(rows, 1) f.Equal(jobDefault, rows[0]["ID"]) // exercise 'nomad status' filtering out, err = e2e.Command("nomad", "status", "-namespace", "NamespaceA") f.NoError(err, "'nomad job status -namespace NamespaceA' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse status output") - f.Equal(1, len(rows)) + rows = parse(out) + f.Len(rows, 1) f.Equal(jobA, rows[0]["ID"]) out, err = e2e.Command("nomad", "status", "-namespace", "NamespaceB") f.NoError(err, "'nomad job status -namespace NamespaceB' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse status output") - f.Equal(1, len(rows)) + rows = parse(out) + f.Len(rows, 1) f.Equal(jobB, rows[0]["ID"]) out, err = e2e.Command("nomad", "status", "-namespace", "*") f.NoError(err, "'nomad job status -namespace *' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse status output") + rows = parse(out) f.Equal(3, len(rows)) out, err = e2e.Command("nomad", "status") f.NoError(err, "'nomad status' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse status output") - f.Equal(1, len(rows)) + rows = parse(out) + f.Len(rows, 1) f.Equal(jobDefault, rows[0]["ID"]) // exercise 'nomad deployment list' filtering @@ -150,23 +159,20 @@ func (tc *NamespacesE2ETest) TestNamespacesFiltering(f *framework.F) { out, err = e2e.Command("nomad", "deployment", "list", "-namespace", "NamespaceA") f.NoError(err, "'nomad job status -namespace NamespaceA' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse deployment list output") - f.Equal(1, len(rows)) + rows = parse(out) + f.Len(rows, 1) f.Equal(jobA, rows[0]["Job ID"]) out, err = e2e.Command("nomad", "deployment", "list", "-namespace", "NamespaceB") f.NoError(err, "'nomad job status -namespace NamespaceB' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse deployment list output") + rows = parse(out) f.Equal(len(rows), 1) f.Equal(jobB, rows[0]["Job ID"]) out, err = e2e.Command("nomad", "deployment", "list") f.NoError(err, "'nomad deployment list' failed") - rows, err = e2e.ParseColumns(out) - f.NoError(err, "could not parse deployment list output") - f.Equal(1, len(rows)) + rows = parse(out) + f.Len(rows, 1) f.Equal(jobDefault, rows[0]["Job ID"]) out, err = e2e.Command("nomad", "job", "stop", jobA)