2023-06-06 19:02:26 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/mitchellh/cli"
|
|
|
|
"github.com/shoenig/test"
|
|
|
|
"github.com/shoenig/test/must"
|
|
|
|
|
|
|
|
"github.com/hashicorp/nomad/api"
|
|
|
|
"github.com/hashicorp/nomad/ci"
|
|
|
|
"github.com/hashicorp/nomad/helper"
|
|
|
|
"github.com/hashicorp/nomad/helper/pointer"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestNodePoolJobsListCommand_Run(t *testing.T) {
|
|
|
|
ci.Parallel(t)
|
|
|
|
|
|
|
|
// Start test server.
|
|
|
|
srv, client, url := testServer(t, true, nil)
|
|
|
|
defer srv.Shutdown()
|
|
|
|
|
|
|
|
waitForNodes(t, client)
|
|
|
|
|
|
|
|
// Register test node pool
|
|
|
|
dev1 := &api.NodePool{Name: "dev-1", Description: "Pool dev-1"}
|
|
|
|
_, err := client.NodePools().Register(dev1, nil)
|
|
|
|
must.NoError(t, err)
|
|
|
|
|
|
|
|
// Register a non-default namespace
|
|
|
|
ns := &api.Namespace{Name: "system"}
|
|
|
|
_, err = client.Namespaces().Register(ns, nil)
|
|
|
|
must.NoError(t, err)
|
|
|
|
|
|
|
|
// Register some jobs
|
|
|
|
registerJob := func(np, ns, id string) {
|
|
|
|
job := testJob(id)
|
|
|
|
job.Namespace = pointer.Of(ns)
|
|
|
|
job.NodePool = pointer.Of(np)
|
|
|
|
_, _, err := client.Jobs().Register(job, nil)
|
|
|
|
must.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
registerJob("dev-1", "default", "job0")
|
|
|
|
registerJob("dev-1", "default", "job1")
|
|
|
|
registerJob("dev-1", "system", "job2")
|
|
|
|
registerJob("default", "default", "job3")
|
|
|
|
registerJob("default", "default", "job4")
|
|
|
|
registerJob("default", "system", "job5")
|
2023-06-23 21:10:45 +00:00
|
|
|
registerJob("all", "system", "job6")
|
|
|
|
registerJob("all", "default", "job7")
|
2023-06-06 19:02:26 +00:00
|
|
|
|
|
|
|
testCases := []struct {
|
|
|
|
name string
|
|
|
|
args []string
|
|
|
|
expectedJobs []string
|
|
|
|
expectedErr string
|
|
|
|
expectedCode int
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "missing arg",
|
|
|
|
args: []string{},
|
|
|
|
expectedErr: "This command takes one argument: <node-pool>",
|
|
|
|
expectedCode: 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "list with wildcard namespaces",
|
|
|
|
args: []string{"-namespace", "*", "dev-1"},
|
|
|
|
expectedJobs: []string{"job0", "job1", "job2"},
|
|
|
|
expectedCode: 0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "list with specific namespaces",
|
|
|
|
args: []string{"-namespace", "system", "dev-1"},
|
|
|
|
expectedJobs: []string{"job2"},
|
|
|
|
expectedCode: 0,
|
|
|
|
},
|
|
|
|
{
|
2023-06-23 21:10:45 +00:00
|
|
|
name: "list with specific namespace in the all pool",
|
2023-06-06 19:02:26 +00:00
|
|
|
args: []string{"-namespace", "system", "all"},
|
2023-06-23 21:10:45 +00:00
|
|
|
expectedJobs: []string{"job6"},
|
2023-06-06 19:02:26 +00:00
|
|
|
expectedCode: 0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "list with filter",
|
|
|
|
args: []string{"-filter", "ID == \"job1\"", "dev-1"},
|
|
|
|
expectedJobs: []string{"job1"},
|
|
|
|
expectedCode: 0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "paginate",
|
|
|
|
args: []string{"-per-page", "2", "-namespace", "*", "dev-1"},
|
|
|
|
expectedJobs: []string{"job0", "job1"},
|
|
|
|
expectedCode: 0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "paginate page 2",
|
|
|
|
args: []string{
|
|
|
|
"-per-page", "2", "-page-token", "job2",
|
|
|
|
"-namespace", "*", "dev-1"},
|
|
|
|
expectedJobs: []string{"job2"},
|
|
|
|
expectedCode: 0,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range testCases {
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
// Initialize UI and command.
|
|
|
|
ui := cli.NewMockUi()
|
|
|
|
cmd := &NodePoolJobsCommand{Meta: Meta{Ui: ui}}
|
|
|
|
|
|
|
|
// Run command, always in JSON so we can easily parse results
|
|
|
|
args := []string{"-address", url, "-json"}
|
|
|
|
args = append(args, tc.args...)
|
|
|
|
code := cmd.Run(args)
|
|
|
|
|
|
|
|
gotStdout := ui.OutputWriter.String()
|
|
|
|
gotStdout = jsonOutputRaftIndexes.ReplaceAllString(gotStdout, "")
|
|
|
|
|
|
|
|
must.Eq(t, tc.expectedCode, code,
|
|
|
|
must.Sprintf("got unexpected code with stdout:\n%s\nstderr:\n%s",
|
|
|
|
gotStdout, ui.ErrorWriter.String(),
|
|
|
|
))
|
|
|
|
|
|
|
|
if tc.expectedCode == 0 {
|
|
|
|
var jobs []*api.JobListStub
|
|
|
|
err := json.Unmarshal([]byte(gotStdout), &jobs)
|
|
|
|
must.NoError(t, err)
|
|
|
|
|
|
|
|
gotJobs := helper.ConvertSlice(jobs,
|
|
|
|
func(j *api.JobListStub) string { return j.ID })
|
|
|
|
must.Eq(t, tc.expectedJobs, gotJobs,
|
|
|
|
must.Sprintf("got unexpected list of jobs:\n%s",
|
|
|
|
gotStdout))
|
|
|
|
} else {
|
|
|
|
test.StrContains(t, ui.ErrorWriter.String(), strings.TrimSpace(tc.expectedErr))
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|