mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
tests: swap testify for test in more places (#20028)
* tests: swap testify for test in plugins/csi/client_test.go * tests: swap testify for test in testutil/ * tests: swap testify for test in host_test.go * tests: swap testify for test in plugin_test.go * tests: swap testify for test in utils_test.go * tests: swap testify for test in scheduler/ * tests: swap testify for test in parse_test.go * tests: swap testify for test in attribute_test.go * tests: swap testify for test in plugins/drivers/ * tests: swap testify for test in command/ * tests: fixup some test usages * go: run go mod tidy * windows: cpuset test only on linux
This commit is contained in:
@@ -12,7 +12,7 @@ require (
|
||||
github.com/hashicorp/go-rootcerts v1.0.2
|
||||
github.com/mitchellh/go-testing-interface v1.14.1
|
||||
github.com/mitchellh/mapstructure v1.5.0
|
||||
github.com/shoenig/test v1.7.0
|
||||
github.com/shoenig/test v1.7.1
|
||||
golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691
|
||||
)
|
||||
|
||||
|
||||
@@ -27,8 +27,8 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk=
|
||||
github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI=
|
||||
github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY=
|
||||
github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
|
||||
@@ -14,7 +14,6 @@ import (
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestACLBindingRuleUpdateCommand_Run(t *testing.T) {
|
||||
@@ -29,7 +28,7 @@ func TestACLBindingRuleUpdateCommand_Run(t *testing.T) {
|
||||
// Wait for the server to start fully and ensure we have a bootstrap token.
|
||||
testutil.WaitForLeader(t, srv.Agent.RPC)
|
||||
rootACLToken := srv.RootToken
|
||||
require.NotNil(t, rootACLToken)
|
||||
must.NotNil(t, rootACLToken)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &ACLBindingRuleUpdateCommand{
|
||||
|
||||
@@ -12,7 +12,6 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestACLBootstrapCommand(t *testing.T) {
|
||||
@@ -37,7 +36,7 @@ func TestACLBootstrapCommand(t *testing.T) {
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
must.StrContains(t, out, "Secret ID")
|
||||
require.Contains(t, out, "Expiry Time = <none>")
|
||||
must.StrContains(t, out, "Expiry Time = <none>")
|
||||
}
|
||||
|
||||
// If a bootstrap token has already been created, attempts to create more should
|
||||
@@ -115,7 +114,7 @@ func TestACLBootstrapCommand_WithOperatorFileBootstrapToken(t *testing.T) {
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
must.StrContains(t, out, mockToken.SecretID)
|
||||
require.Contains(t, out, "Expiry Time = <none>")
|
||||
must.StrContains(t, out, "Expiry Time = <none>")
|
||||
}
|
||||
|
||||
// Attempting to bootstrap the server with an invalid operator provided token in a file should
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestACLRoleCreateCommand_Run(t *testing.T) {
|
||||
@@ -26,7 +26,7 @@ func TestACLRoleCreateCommand_Run(t *testing.T) {
|
||||
// Wait for the server to start fully and ensure we have a bootstrap token.
|
||||
testutil.WaitForLeader(t, srv.Agent.RPC)
|
||||
rootACLToken := srv.RootToken
|
||||
require.NotNil(t, rootACLToken)
|
||||
must.NotNil(t, rootACLToken)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &ACLRoleCreateCommand{
|
||||
@@ -37,20 +37,20 @@ func TestACLRoleCreateCommand_Run(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test the basic validation on the command.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "this-command-does-not-take-args"}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "This command takes no arguments")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, "this-command-does-not-take-args"}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "This command takes no arguments")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, `-name="foobar"`}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, `-name="foobar"`}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -65,18 +65,18 @@ func TestACLRoleCreateCommand_Run(t *testing.T) {
|
||||
}
|
||||
err := srv.Agent.Server().State().UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create an ACL role.
|
||||
args := []string{
|
||||
"-address=" + url, "-token=" + rootACLToken.SecretID, "-name=acl-role-cli-test",
|
||||
"-policy=acl-role-cli-test-policy", "-description=acl-role-all-the-things",
|
||||
}
|
||||
require.Equal(t, 0, cmd.Run(args))
|
||||
must.Zero(t, cmd.Run(args))
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, "Name = acl-role-cli-test")
|
||||
require.Contains(t, s, "Description = acl-role-all-the-things")
|
||||
require.Contains(t, s, "Policies = acl-role-cli-test-policy")
|
||||
must.StrContains(t, s, "Name = acl-role-cli-test")
|
||||
must.StrContains(t, s, "Description = acl-role-all-the-things")
|
||||
must.StrContains(t, s, "Policies = acl-role-cli-test-policy")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestACLRoleDeleteCommand_Run(t *testing.T) {
|
||||
@@ -27,7 +27,7 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) {
|
||||
// Wait for the server to start fully and ensure we have a bootstrap token.
|
||||
testutil.WaitForLeader(t, srv.Agent.RPC)
|
||||
rootACLToken := srv.RootToken
|
||||
require.NotNil(t, rootACLToken)
|
||||
must.NotNil(t, rootACLToken)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &ACLRoleDeleteCommand{
|
||||
@@ -39,15 +39,15 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) {
|
||||
|
||||
// Try and delete more than one ACL role.
|
||||
code := cmd.Run([]string{"-address=" + url, "acl-role-1", "acl-role-2"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "This command takes one argument")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Try deleting a role that does not exist.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "acl-role-1"}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "ACL role not found")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "acl-role-1"}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "ACL role not found")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -62,7 +62,7 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) {
|
||||
}
|
||||
err := srv.Agent.Server().State().UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create an ACL role referencing the previously created policy.
|
||||
aclRole := structs.ACLRole{
|
||||
@@ -72,9 +72,9 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) {
|
||||
}
|
||||
err = srv.Agent.Server().State().UpsertACLRoles(
|
||||
structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Delete the existing ACL role.
|
||||
require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "successfully deleted")
|
||||
must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID}))
|
||||
must.StrContains(t, ui.OutputWriter.String(), "successfully deleted")
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestACLRoleInfoCommand_Run(t *testing.T) {
|
||||
@@ -28,7 +28,7 @@ func TestACLRoleInfoCommand_Run(t *testing.T) {
|
||||
// Wait for the server to start fully and ensure we have a bootstrap token.
|
||||
testutil.WaitForLeader(t, srv.Agent.RPC)
|
||||
rootACLToken := srv.RootToken
|
||||
require.NotNil(t, rootACLToken)
|
||||
must.NotNil(t, rootACLToken)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &ACLRoleInfoCommand{
|
||||
@@ -39,15 +39,15 @@ func TestACLRoleInfoCommand_Run(t *testing.T) {
|
||||
}
|
||||
|
||||
// Perform a lookup without specifying an ID.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "This command takes one argument: <acl_role_id>")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument: <acl_role_id>")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Perform a lookup specifying a random ID.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, uuid.Generate()}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "ACL role not found")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, uuid.Generate()}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "ACL role not found")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -62,7 +62,7 @@ func TestACLRoleInfoCommand_Run(t *testing.T) {
|
||||
}
|
||||
err := srv.Agent.Server().State().UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create an ACL role referencing the previously created policy.
|
||||
aclRole := structs.ACLRole{
|
||||
@@ -72,26 +72,26 @@ func TestACLRoleInfoCommand_Run(t *testing.T) {
|
||||
}
|
||||
err = srv.Agent.Server().State().UpsertACLRoles(
|
||||
structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Look up the ACL role using its ID.
|
||||
require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID}))
|
||||
must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID}))
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
require.Contains(t, s, fmt.Sprintf("Name = %s", aclRole.Name))
|
||||
require.Contains(t, s, "Description = <none>")
|
||||
require.Contains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name))
|
||||
must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
must.StrContains(t, s, fmt.Sprintf("Name = %s", aclRole.Name))
|
||||
must.StrContains(t, s, "Description = <none>")
|
||||
must.StrContains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name))
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Look up the ACL role using its Name.
|
||||
require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "-by-name", aclRole.Name}))
|
||||
must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "-by-name", aclRole.Name}))
|
||||
s = ui.OutputWriter.String()
|
||||
require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
require.Contains(t, s, fmt.Sprintf("Name = %s", aclRole.Name))
|
||||
require.Contains(t, s, "Description = <none>")
|
||||
require.Contains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name))
|
||||
must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
must.StrContains(t, s, fmt.Sprintf("Name = %s", aclRole.Name))
|
||||
must.StrContains(t, s, "Description = <none>")
|
||||
must.StrContains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name))
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestACLRoleListCommand_Run(t *testing.T) {
|
||||
@@ -27,7 +27,7 @@ func TestACLRoleListCommand_Run(t *testing.T) {
|
||||
// Wait for the server to start fully and ensure we have a bootstrap token.
|
||||
testutil.WaitForLeader(t, srv.Agent.RPC)
|
||||
rootACLToken := srv.RootToken
|
||||
require.NotNil(t, rootACLToken)
|
||||
must.NotNil(t, rootACLToken)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &ACLRoleListCommand{
|
||||
@@ -38,8 +38,8 @@ func TestACLRoleListCommand_Run(t *testing.T) {
|
||||
}
|
||||
|
||||
// Perform a list straight away without any roles held in state.
|
||||
require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "No ACL roles found")
|
||||
must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID}))
|
||||
must.StrContains(t, ui.OutputWriter.String(), "No ACL roles found")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -54,7 +54,7 @@ func TestACLRoleListCommand_Run(t *testing.T) {
|
||||
}
|
||||
err := srv.Agent.Server().State().UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create an ACL role referencing the previously created policy.
|
||||
aclRole := structs.ACLRole{
|
||||
@@ -64,16 +64,16 @@ func TestACLRoleListCommand_Run(t *testing.T) {
|
||||
}
|
||||
err = srv.Agent.Server().State().UpsertACLRoles(
|
||||
structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Perform a listing to get the created role.
|
||||
require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID}))
|
||||
must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID}))
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, "ID")
|
||||
require.Contains(t, s, "Name")
|
||||
require.Contains(t, s, "Policies")
|
||||
require.Contains(t, s, "acl-role-cli-test")
|
||||
require.Contains(t, s, "acl-role-policy-cli-test")
|
||||
must.StrContains(t, s, "ID")
|
||||
must.StrContains(t, s, "Name")
|
||||
must.StrContains(t, s, "Policies")
|
||||
must.StrContains(t, s, "acl-role-cli-test")
|
||||
must.StrContains(t, s, "acl-role-policy-cli-test")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func Test_formatACLRole(t *testing.T) {
|
||||
@@ -26,7 +26,7 @@ func Test_formatACLRole(t *testing.T) {
|
||||
}
|
||||
expectedOutput := "ID = this-is-usually-a-uuid\nName = this-is-my-friendly-name\nDescription = this-is-my-friendly-name\nPolicies = policy-link-1,policy-link-2,policy-link-3,policy-link-4\nCreate Index = 13\nModify Index = 1313"
|
||||
actualOutput := formatACLRole(&inputACLRole)
|
||||
require.Equal(t, expectedOutput, actualOutput)
|
||||
must.Eq(t, expectedOutput, actualOutput)
|
||||
}
|
||||
|
||||
func Test_aclRolePolicyLinkToStringList(t *testing.T) {
|
||||
@@ -43,7 +43,7 @@ func Test_aclRolePolicyLinkToStringList(t *testing.T) {
|
||||
"z-policy-link-1",
|
||||
}
|
||||
actualOutput := aclRolePolicyLinkToStringList(inputPolicyLinks)
|
||||
require.Equal(t, expectedOutput, actualOutput)
|
||||
must.Eq(t, expectedOutput, actualOutput)
|
||||
}
|
||||
|
||||
func Test_aclRolePolicyNamesToPolicyLinks(t *testing.T) {
|
||||
@@ -60,5 +60,5 @@ func Test_aclRolePolicyNamesToPolicyLinks(t *testing.T) {
|
||||
{Name: "policy-link-4"},
|
||||
}
|
||||
actualOutput := aclRolePolicyNamesToPolicyLinks(inputPolicyNames)
|
||||
require.ElementsMatch(t, expectedOutput, actualOutput)
|
||||
must.SliceContainsAll(t, expectedOutput, actualOutput)
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestACLRoleUpdateCommand_Run(t *testing.T) {
|
||||
@@ -28,7 +28,7 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) {
|
||||
// Wait for the server to start fully and ensure we have a bootstrap token.
|
||||
testutil.WaitForLeader(t, srv.Agent.RPC)
|
||||
rootACLToken := srv.RootToken
|
||||
require.NotNil(t, rootACLToken)
|
||||
must.NotNil(t, rootACLToken)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &ACLRoleUpdateCommand{
|
||||
@@ -39,16 +39,16 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) {
|
||||
}
|
||||
|
||||
// Try calling the command without setting an ACL Role ID arg.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "This command takes one argument")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Try calling the command with an ACL role ID that does not exist.
|
||||
code := cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "catch-me-if-you-can"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "ACL role not found")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "ACL role not found")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -63,7 +63,7 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) {
|
||||
}
|
||||
err := srv.Agent.Server().State().UpsertACLPolicies(
|
||||
structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy})
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create an ACL role that can be used for updating.
|
||||
aclRole := structs.ACLRole{
|
||||
@@ -75,12 +75,12 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) {
|
||||
|
||||
err = srv.Agent.Server().State().UpsertACLRoles(
|
||||
structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Try a merge update without setting any parameters to update.
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "Please provide at least one flag to update the ACL role")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Please provide at least one flag to update the ACL role")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -88,39 +88,39 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) {
|
||||
// Update the description using the merge method.
|
||||
code = cmd.Run([]string{
|
||||
"-address=" + url, "-token=" + rootACLToken.SecretID, "-description=badger-badger-badger", aclRole.ID})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
require.Contains(t, s, "Name = acl-role-cli-test")
|
||||
require.Contains(t, s, "Description = badger-badger-badger")
|
||||
require.Contains(t, s, "Policies = acl-role-cli-test-policy")
|
||||
must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
must.StrContains(t, s, "Name = acl-role-cli-test")
|
||||
must.StrContains(t, s, "Description = badger-badger-badger")
|
||||
must.StrContains(t, s, "Policies = acl-role-cli-test-policy")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Try updating the role using no-merge without setting the required flags.
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "-no-merge", aclRole.ID})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
code = cmd.Run([]string{
|
||||
"-address=" + url, "-token=" + rootACLToken.SecretID, "-no-merge", "-name=update-role-name", aclRole.ID})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag")
|
||||
|
||||
// Update the role using no-merge with all required flags set.
|
||||
code = cmd.Run([]string{
|
||||
"-address=" + url, "-token=" + rootACLToken.SecretID, "-no-merge", "-name=update-role-name",
|
||||
"-description=updated-description", "-policy=acl-role-cli-test-policy", aclRole.ID})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
s = ui.OutputWriter.String()
|
||||
require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
require.Contains(t, s, "Name = update-role-name")
|
||||
require.Contains(t, s, "Description = updated-description")
|
||||
require.Contains(t, s, "Policies = acl-role-cli-test-policy")
|
||||
must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID))
|
||||
must.StrContains(t, s, "Name = update-role-name")
|
||||
must.StrContains(t, s, "Description = updated-description")
|
||||
must.StrContains(t, s, "Policies = acl-role-cli-test-policy")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -12,7 +12,6 @@ import (
|
||||
"github.com/hashicorp/nomad/command/agent"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestACLTokenCreateCommand(t *testing.T) {
|
||||
@@ -39,12 +38,12 @@ func TestACLTokenCreateCommand(t *testing.T) {
|
||||
// Request to create a new token with a valid management token that does
|
||||
// not have an expiry set.
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-policy=foo", "-type=client"})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
// Check the output
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(t, out, "[foo]")
|
||||
require.Contains(t, out, "Expiry Time = <none>")
|
||||
must.StrContains(t, out, "[foo]")
|
||||
must.StrContains(t, out, "Expiry Time = <none>")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -54,14 +53,14 @@ func TestACLTokenCreateCommand(t *testing.T) {
|
||||
var jsonMap map[string]interface{}
|
||||
for _, outputFormatFlag := range testCasesNoTTL {
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-policy=foo", "-type=client", outputFormatFlag})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
// Check the output
|
||||
out = ui.OutputWriter.String()
|
||||
require.Contains(t, out, "foo")
|
||||
must.StrContains(t, out, "foo")
|
||||
if outputFormatFlag == "-json" {
|
||||
err := json.Unmarshal([]byte(out), &jsonMap)
|
||||
require.Nil(t, err, "Output not in JSON format")
|
||||
must.NoError(t, err)
|
||||
}
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
@@ -70,10 +69,10 @@ func TestACLTokenCreateCommand(t *testing.T) {
|
||||
|
||||
// Create a new token that has an expiry TTL set and check the response.
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-type=management", "-ttl=10m"})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
out = ui.OutputWriter.String()
|
||||
require.NotContains(t, out, "Expiry Time = <none>")
|
||||
must.StrNotContains(t, out, "Expiry Time = <none>")
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -81,15 +80,15 @@ func TestACLTokenCreateCommand(t *testing.T) {
|
||||
testCasesWithTTL := [][]string{{"-json", "ExpirationTTL"}, {"-t='{{ .ExpirationTTL }}'", "10m0s"}}
|
||||
for _, outputFormatFlag := range testCasesWithTTL {
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-type=management", "-ttl=10m", outputFormatFlag[0]})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
// Check the output
|
||||
out = ui.OutputWriter.String()
|
||||
if outputFormatFlag[0] == "-json" {
|
||||
err := json.Unmarshal([]byte(out), &jsonMap)
|
||||
require.Nil(t, err, "Output not in JSON format")
|
||||
must.NoError(t, err)
|
||||
}
|
||||
require.Contains(t, out, outputFormatFlag[1])
|
||||
must.StrContains(t, out, outputFormatFlag[1])
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
}
|
||||
@@ -117,5 +116,5 @@ func Test_generateACLTokenRoleLinks(t *testing.T) {
|
||||
{ID: "77a780d8-2dee-7c7f-7822-6f5471c5cbb2"},
|
||||
{ID: "56850b06-a343-a772-1a5c-ad083fd8a50e"},
|
||||
}
|
||||
require.ElementsMatch(t, generateACLTokenRoleLinks(inputRoleNames, inputRoleIDs), expectedOutput)
|
||||
must.SliceContainsAll(t, generateACLTokenRoleLinks(inputRoleNames, inputRoleIDs), expectedOutput)
|
||||
}
|
||||
|
||||
@@ -8,12 +8,12 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/helper/uuid"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestHTTP_rpcHandlerForAlloc(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
agent := NewTestAgent(t, t.Name(), nil)
|
||||
defer agent.Shutdown()
|
||||
|
||||
@@ -23,25 +23,25 @@ func TestHTTP_rpcHandlerForAlloc(t *testing.T) {
|
||||
// Case 1: Client has allocation
|
||||
// Outcome: Use local client
|
||||
lc, rc, s := agent.Server.rpcHandlerForAlloc(a.ID)
|
||||
require.True(lc)
|
||||
require.False(rc)
|
||||
require.False(s)
|
||||
must.True(t, lc)
|
||||
must.False(t, rc)
|
||||
must.False(t, s)
|
||||
|
||||
// Case 2: Client doesn't have allocation and there is a server
|
||||
// Outcome: Use server
|
||||
lc, rc, s = agent.Server.rpcHandlerForAlloc(uuid.Generate())
|
||||
require.False(lc)
|
||||
require.False(rc)
|
||||
require.True(s)
|
||||
must.False(t, lc)
|
||||
must.False(t, rc)
|
||||
must.True(t, s)
|
||||
|
||||
// Case 3: Client doesn't have allocation and there is no server
|
||||
// Outcome: Use client RPC to server
|
||||
srv := agent.server
|
||||
agent.server = nil
|
||||
lc, rc, s = agent.Server.rpcHandlerForAlloc(uuid.Generate())
|
||||
require.False(lc)
|
||||
require.True(rc)
|
||||
require.False(s)
|
||||
must.False(t, lc)
|
||||
must.True(t, rc)
|
||||
must.False(t, s)
|
||||
agent.server = srv
|
||||
|
||||
// Case 4: No client
|
||||
@@ -49,15 +49,15 @@ func TestHTTP_rpcHandlerForAlloc(t *testing.T) {
|
||||
client := agent.client
|
||||
agent.client = nil
|
||||
lc, rc, s = agent.Server.rpcHandlerForAlloc(uuid.Generate())
|
||||
require.False(lc)
|
||||
require.False(rc)
|
||||
require.True(s)
|
||||
must.False(t, lc)
|
||||
must.False(t, rc)
|
||||
must.True(t, s)
|
||||
agent.client = client
|
||||
}
|
||||
|
||||
func TestHTTP_rpcHandlerForNode(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
agent := NewTestAgent(t, t.Name(), nil)
|
||||
defer agent.Shutdown()
|
||||
|
||||
@@ -66,25 +66,25 @@ func TestHTTP_rpcHandlerForNode(t *testing.T) {
|
||||
// Case 1: Node running, no node ID given
|
||||
// Outcome: Use local node
|
||||
lc, rc, s := agent.Server.rpcHandlerForNode("")
|
||||
require.True(lc)
|
||||
require.False(rc)
|
||||
require.False(s)
|
||||
must.True(t, lc)
|
||||
must.False(t, rc)
|
||||
must.False(t, s)
|
||||
|
||||
// Case 2: Node running, it's ID given
|
||||
// Outcome: Use local node
|
||||
lc, rc, s = agent.Server.rpcHandlerForNode(cID)
|
||||
require.True(lc)
|
||||
require.False(rc)
|
||||
require.False(s)
|
||||
must.True(t, lc)
|
||||
must.False(t, rc)
|
||||
must.False(t, s)
|
||||
|
||||
// Case 3: Local node but wrong ID and there is no server
|
||||
// Outcome: Use client RPC to server
|
||||
srv := agent.server
|
||||
agent.server = nil
|
||||
lc, rc, s = agent.Server.rpcHandlerForNode(uuid.Generate())
|
||||
require.False(lc)
|
||||
require.True(rc)
|
||||
require.False(s)
|
||||
must.False(t, lc)
|
||||
must.True(t, rc)
|
||||
must.False(t, s)
|
||||
agent.server = srv
|
||||
|
||||
// Case 4: No client
|
||||
@@ -92,8 +92,8 @@ func TestHTTP_rpcHandlerForNode(t *testing.T) {
|
||||
client := agent.client
|
||||
agent.client = nil
|
||||
lc, rc, s = agent.Server.rpcHandlerForNode(uuid.Generate())
|
||||
require.False(lc)
|
||||
require.False(rc)
|
||||
require.True(s)
|
||||
must.False(t, lc)
|
||||
must.False(t, rc)
|
||||
must.True(t, s)
|
||||
agent.client = client
|
||||
}
|
||||
|
||||
@@ -6,17 +6,17 @@ package host
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestHostUtils(t *testing.T) {
|
||||
mounts := mountedPaths()
|
||||
require.NotEmpty(t, mounts)
|
||||
must.SliceNotEmpty(t, mounts)
|
||||
|
||||
du, err := diskUsage("/")
|
||||
require.NoError(t, err)
|
||||
require.NotZero(t, du.DiskMB)
|
||||
require.NotZero(t, du.UsedMB)
|
||||
must.NoError(t, err)
|
||||
must.Positive(t, du.DiskMB)
|
||||
must.Positive(t, du.UsedMB)
|
||||
}
|
||||
|
||||
func TestMakeHostData(t *testing.T) {
|
||||
@@ -27,15 +27,15 @@ func TestMakeHostData(t *testing.T) {
|
||||
t.Setenv("ryanSECRETS", "foo")
|
||||
|
||||
host, err := MakeHostData()
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, host.OS)
|
||||
require.NotEmpty(t, host.Network)
|
||||
require.NotEmpty(t, host.ResolvConf)
|
||||
require.NotEmpty(t, host.Hosts)
|
||||
require.NotEmpty(t, host.Disk)
|
||||
require.NotEmpty(t, host.Environment)
|
||||
require.Equal(t, "<redacted>", host.Environment["VAULT_TOKEN"])
|
||||
require.Equal(t, "<redacted>", host.Environment["BOGUS_TOKEN"])
|
||||
require.Equal(t, "<redacted>", host.Environment["BOGUS_SECRET"])
|
||||
require.Equal(t, "<redacted>", host.Environment["ryanSECRETS"])
|
||||
must.NoError(t, err)
|
||||
must.NotEq(t, "", host.OS)
|
||||
must.SliceNotEmpty(t, host.Network)
|
||||
must.NotEq(t, "", host.ResolvConf)
|
||||
must.NotEq(t, "", host.Hosts)
|
||||
must.MapNotEmpty(t, host.Disk)
|
||||
must.MapNotEmpty(t, host.Environment)
|
||||
must.Eq(t, "<redacted>", host.Environment["VAULT_TOKEN"])
|
||||
must.Eq(t, "<redacted>", host.Environment["BOGUS_TOKEN"])
|
||||
must.Eq(t, "<redacted>", host.Environment["BOGUS_SECRET"])
|
||||
must.Eq(t, "<redacted>", host.Environment["ryanSECRETS"])
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeploymentFailCommand_Implements(t *testing.T) {
|
||||
@@ -44,7 +44,6 @@ func TestDeploymentFailCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestDeploymentFailCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -55,13 +54,13 @@ func TestDeploymentFailCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake deployment
|
||||
state := srv.Agent.Server().State()
|
||||
d := mock.Deployment()
|
||||
assert.Nil(state.UpsertDeployment(1000, d))
|
||||
must.Nil(t, state.UpsertDeployment(1000, d))
|
||||
|
||||
prefix := d.ID[:5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(d.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, d.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeploymentPauseCommand_Implements(t *testing.T) {
|
||||
@@ -44,7 +44,6 @@ func TestDeploymentPauseCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestDeploymentPauseCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -55,13 +54,13 @@ func TestDeploymentPauseCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake deployment
|
||||
state := srv.Agent.Server().State()
|
||||
d := mock.Deployment()
|
||||
assert.Nil(state.UpsertDeployment(1000, d))
|
||||
must.NoError(t, state.UpsertDeployment(1000, d))
|
||||
|
||||
prefix := d.ID[:5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(d.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, d.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeploymentPromoteCommand_Implements(t *testing.T) {
|
||||
@@ -44,7 +44,6 @@ func TestDeploymentPromoteCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestDeploymentPromoteCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -55,13 +54,13 @@ func TestDeploymentPromoteCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake deployment
|
||||
state := srv.Agent.Server().State()
|
||||
d := mock.Deployment()
|
||||
assert.Nil(state.UpsertDeployment(1000, d))
|
||||
must.NoError(t, state.UpsertDeployment(1000, d))
|
||||
|
||||
prefix := d.ID[:5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(d.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, d.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeploymentResumeCommand_Implements(t *testing.T) {
|
||||
@@ -44,7 +44,6 @@ func TestDeploymentResumeCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestDeploymentResumeCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -55,13 +54,13 @@ func TestDeploymentResumeCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake deployment
|
||||
state := srv.Agent.Server().State()
|
||||
d := mock.Deployment()
|
||||
assert.Nil(state.UpsertDeployment(1000, d))
|
||||
must.NoError(t, state.UpsertDeployment(1000, d))
|
||||
|
||||
prefix := d.ID[:5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(d.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, d.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -10,8 +10,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeploymentStatusCommand_Implements(t *testing.T) {
|
||||
@@ -26,37 +25,36 @@ func TestDeploymentStatusCommand_Fails(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Contains(t, out, commandErrorText(cmd))
|
||||
must.StrContains(t, out, commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
code = cmd.Run([]string{"-address=nope", "12"})
|
||||
require.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
out = ui.ErrorWriter.String()
|
||||
require.Contains(t, out, "Error retrieving deployment")
|
||||
must.StrContains(t, out, "Error retrieving deployment")
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
code = cmd.Run([]string{"-address=nope"})
|
||||
require.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
out = ui.ErrorWriter.String()
|
||||
// "deployments" indicates that we attempted to list all deployments
|
||||
require.Contains(t, out, "Error retrieving deployments")
|
||||
must.StrContains(t, out, "Error retrieving deployments")
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Fails if monitor passed with json or tmpl flags
|
||||
for _, flag := range []string{"-json", "-t"} {
|
||||
code = cmd.Run([]string{"-monitor", flag, "12"})
|
||||
require.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
out = ui.ErrorWriter.String()
|
||||
require.Contains(t, out, "The monitor flag cannot be used with the '-json' or '-t' flags")
|
||||
must.StrContains(t, out, "The monitor flag cannot be used with the '-json' or '-t' flags")
|
||||
ui.ErrorWriter.Reset()
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeploymentStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -67,13 +65,13 @@ func TestDeploymentStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake deployment
|
||||
state := srv.Agent.Server().State()
|
||||
d := mock.Deployment()
|
||||
assert.Nil(state.UpsertDeployment(1000, d))
|
||||
must.NoError(t, state.UpsertDeployment(1000, d))
|
||||
|
||||
prefix := d.ID[:5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(d.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, d.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeploymentUnblockCommand_Implements(t *testing.T) {
|
||||
@@ -44,7 +44,6 @@ func TestDeploymentUnblockCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestDeploymentUnblockCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -55,13 +54,13 @@ func TestDeploymentUnblockCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake deployment
|
||||
state := srv.Agent.Server().State()
|
||||
d := mock.Deployment()
|
||||
assert.Nil(state.UpsertDeployment(1000, d))
|
||||
must.NoError(t, state.UpsertDeployment(1000, d))
|
||||
|
||||
prefix := d.ID[:5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(d.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, d.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestEvalDeleteCommand_Run(t *testing.T) {
|
||||
@@ -36,30 +36,30 @@ func TestEvalDeleteCommand_Run(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test basic command input validation.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "Error validating command args and flags")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Error validating command args and flags")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Try running the command when the eval broker is not paused.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "Eval broker is not paused")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Eval broker is not paused")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Paused the eval broker, then try deleting with an eval that
|
||||
// does not exist.
|
||||
schedulerConfig, _, err := client.Operator().SchedulerGetConfiguration(nil)
|
||||
require.NoError(t, err)
|
||||
require.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
must.NoError(t, err)
|
||||
must.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
|
||||
schedulerConfig.SchedulerConfig.PauseEvalBroker = true
|
||||
_, _, err = client.Operator().SchedulerSetConfiguration(schedulerConfig.SchedulerConfig, nil)
|
||||
require.NoError(t, err)
|
||||
require.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
must.NoError(t, err)
|
||||
must.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "eval not found")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "eval not found")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
},
|
||||
@@ -82,13 +82,13 @@ func TestEvalDeleteCommand_Run(t *testing.T) {
|
||||
|
||||
// Paused the eval broker.
|
||||
schedulerConfig, _, err := client.Operator().SchedulerGetConfiguration(nil)
|
||||
require.NoError(t, err)
|
||||
require.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
must.NoError(t, err)
|
||||
must.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
|
||||
schedulerConfig.SchedulerConfig.PauseEvalBroker = true
|
||||
_, _, err = client.Operator().SchedulerSetConfiguration(schedulerConfig.SchedulerConfig, nil)
|
||||
require.NoError(t, err)
|
||||
require.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
must.NoError(t, err)
|
||||
must.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker)
|
||||
|
||||
// With the eval broker paused, run a job register several times
|
||||
// to generate evals that will not be acted on.
|
||||
@@ -97,20 +97,20 @@ func TestEvalDeleteCommand_Run(t *testing.T) {
|
||||
evalIDs := make([]string, 3)
|
||||
for i := 0; i < 3; i++ {
|
||||
regResp, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, regResp)
|
||||
require.NotEmpty(t, regResp.EvalID)
|
||||
must.NoError(t, err)
|
||||
must.NotNil(t, regResp)
|
||||
must.NotEq(t, "", regResp.EvalID)
|
||||
evalIDs[i] = regResp.EvalID
|
||||
}
|
||||
|
||||
// Ensure we have three evaluations in state.
|
||||
evalList, _, err := client.Evaluations().List(nil)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, evalList, 3)
|
||||
must.NoError(t, err)
|
||||
must.SliceLen(t, 3, evalList)
|
||||
|
||||
// Attempted to delete one eval using the ID.
|
||||
require.Equal(t, 0, cmd.Run([]string{"-address=" + url, evalIDs[0]}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "Successfully deleted 1 evaluation")
|
||||
must.Zero(t, cmd.Run([]string{"-address=" + url, evalIDs[0]}))
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted 1 evaluation")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
@@ -122,15 +122,15 @@ func TestEvalDeleteCommand_Run(t *testing.T) {
|
||||
// Attempted to delete the remaining two evals using a filter
|
||||
// expression.
|
||||
expr := fmt.Sprintf("JobID == %q and Status == \"pending\" ", *testJob.Name)
|
||||
require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-filter=" + expr}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "Successfully deleted 2 evaluations")
|
||||
must.Zero(t, cmd.Run([]string{"-address=" + url, "-filter=" + expr}))
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted 2 evaluations")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Ensure we have zero evaluations in state.
|
||||
evalList, _, err = client.Evaluations().List(nil)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, evalList, 0)
|
||||
must.NoError(t, err)
|
||||
must.SliceEmpty(t, evalList)
|
||||
},
|
||||
name: "successful",
|
||||
},
|
||||
@@ -181,7 +181,7 @@ func TestEvalDeleteCommand_verifyArgsAndFlags(t *testing.T) {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
actualError := tc.inputEvalDeleteCommand.verifyArgsAndFlags(tc.inputArgs)
|
||||
require.Equal(t, tc.expectedError, actualError)
|
||||
must.Eq(t, tc.expectedError, actualError)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestEvalList_ArgsWithoutPageToken(t *testing.T) {
|
||||
@@ -58,8 +58,6 @@ func TestEvalList_ArgsWithoutPageToken(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
args := strings.Split(tc.cli, " ")
|
||||
assert.Equal(t, tc.expected, argsWithoutPageToken(args),
|
||||
"for input: %s", tc.cli)
|
||||
must.Eq(t, tc.expected, argsWithoutPageToken(args), must.Sprintf("for input: %s", tc.cli))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestEvalStatusCommand_Implements(t *testing.T) {
|
||||
@@ -68,7 +68,6 @@ func TestEvalStatusCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestEvalStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -79,13 +78,13 @@ func TestEvalStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake eval
|
||||
state := srv.Agent.Server().State()
|
||||
e := mock.Eval()
|
||||
assert.Nil(state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{e}))
|
||||
must.NoError(t, state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{e}))
|
||||
|
||||
prefix := e.ID[:5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(e.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, e.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestEventCommand_BaseCommand(t *testing.T) {
|
||||
@@ -22,5 +22,5 @@ func TestEventCommand_BaseCommand(t *testing.T) {
|
||||
|
||||
code := cmd.Run([]string{"-address=" + url})
|
||||
|
||||
require.Equal(t, -18511, code)
|
||||
must.Eq(t, -18511, code)
|
||||
}
|
||||
|
||||
@@ -13,8 +13,6 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestFmtCommand(t *testing.T) {
|
||||
@@ -141,10 +139,10 @@ func TestFmtCommand_FromWorkingDirectory(t *testing.T) {
|
||||
tmpDir := fmtFixtureWriteDir(t)
|
||||
|
||||
cwd, err := os.Getwd()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
err = os.Chdir(tmpDir)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Chdir(cwd)
|
||||
|
||||
tests := []struct {
|
||||
@@ -251,7 +249,7 @@ func TestFmtCommand_FileDoesNotExist(t *testing.T) {
|
||||
}
|
||||
|
||||
code := cmd.Run([]string{"file/does/not/exist.hcl"})
|
||||
assert.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
}
|
||||
|
||||
func TestFmtCommand_InvalidSyntax(t *testing.T) {
|
||||
@@ -266,14 +264,14 @@ func TestFmtCommand_InvalidSyntax(t *testing.T) {
|
||||
}
|
||||
|
||||
code := cmd.Run([]string{"-"})
|
||||
assert.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
}
|
||||
|
||||
func fmtFixtureWriteDir(t *testing.T) string {
|
||||
dir := t.TempDir()
|
||||
|
||||
err := os.WriteFile(filepath.Join(dir, fmtFixture.filename), fmtFixture.input, 0644)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
return dir
|
||||
}
|
||||
|
||||
@@ -9,18 +9,15 @@ import (
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/helper/pointer"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestDeviceQualifiedID(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
|
||||
require := require.New(t)
|
||||
|
||||
require.Equal("vendor/type/name[id]", deviceQualifiedID("vendor", "type", "name", "id"))
|
||||
require.Equal("vendor/type[id]", deviceQualifiedID("vendor", "type", "", "id"))
|
||||
require.Equal("vendor[id]", deviceQualifiedID("vendor", "", "", "id"))
|
||||
must.Eq(t, "vendor/type/name[id]", deviceQualifiedID("vendor", "type", "name", "id"))
|
||||
must.Eq(t, "vendor/type[id]", deviceQualifiedID("vendor", "type", "", "id"))
|
||||
must.Eq(t, "vendor[id]", deviceQualifiedID("vendor", "", "", "id"))
|
||||
}
|
||||
|
||||
func TestBuildDeviceStatsSummaryMap(t *testing.T) {
|
||||
@@ -77,7 +74,9 @@ func TestBuildDeviceStatsSummaryMap(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
require.EqualValues(t, expected, buildDeviceStatsSummaryMap(hostDeviceStats))
|
||||
must.Eq(t, expected, buildDeviceStatsSummaryMap(hostDeviceStats))
|
||||
// TODO(shoenig) figure out why the below does not compile
|
||||
// must.MapContainsValues[map[string]*api.StatValue](t, expected, buildDeviceStatsSummaryMap(hostDeviceStats))
|
||||
}
|
||||
|
||||
func TestFormatDeviceStats(t *testing.T) {
|
||||
@@ -120,7 +119,7 @@ func TestFormatDeviceStats(t *testing.T) {
|
||||
result := formatDeviceStats("TestDeviceID", stat)
|
||||
|
||||
// check that device id always appears first
|
||||
require.Equal(t, "Device|TestDeviceID", result[0])
|
||||
must.Eq(t, "Device|TestDeviceID", result[0])
|
||||
|
||||
// check rest of values
|
||||
expected := []string{
|
||||
@@ -134,7 +133,7 @@ func TestFormatDeviceStats(t *testing.T) {
|
||||
"nested2.k2|v2",
|
||||
}
|
||||
|
||||
require.Equal(t, expected, result)
|
||||
must.Eq(t, expected, result)
|
||||
}
|
||||
|
||||
func TestNodeStatusCommand_GetDeviceResourcesForNode(t *testing.T) {
|
||||
@@ -208,7 +207,7 @@ func TestNodeStatusCommand_GetDeviceResourcesForNode(t *testing.T) {
|
||||
"vendor2/type2[id2]|4",
|
||||
}
|
||||
|
||||
assert.Equal(t, expected, formattedDevices)
|
||||
must.Eq(t, expected, formattedDevices)
|
||||
}
|
||||
|
||||
func TestNodeStatusCommand_GetDeviceResources(t *testing.T) {
|
||||
@@ -258,7 +257,7 @@ func TestNodeStatusCommand_GetDeviceResources(t *testing.T) {
|
||||
"vendor2/type2[id2]|4",
|
||||
}
|
||||
|
||||
assert.Equal(t, expected, formattedDevices)
|
||||
must.Eq(t, expected, formattedDevices)
|
||||
}
|
||||
func TestGetDeviceAttributes(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -286,5 +285,5 @@ func TestGetDeviceAttributes(t *testing.T) {
|
||||
"utilization|0.78 %",
|
||||
}
|
||||
|
||||
assert.Equal(t, expected, formattedDevices)
|
||||
must.Eq(t, expected, formattedDevices)
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ import (
|
||||
"github.com/kr/pretty"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestHelpers_FormatKV(t *testing.T) {
|
||||
@@ -315,22 +314,22 @@ func TestJobGetter_LocalFile_InvalidHCL2(t *testing.T) {
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
fh, err := os.CreateTemp("", "nomad")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Remove(fh.Name())
|
||||
defer fh.Close()
|
||||
|
||||
_, err = fh.WriteString(c.hcl)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
j := &JobGetter{}
|
||||
_, _, err = j.ApiJob(fh.Name())
|
||||
require.Error(t, err)
|
||||
must.Error(t, err)
|
||||
|
||||
exptMessage := "Failed to parse using HCL 2. Use the HCL 1"
|
||||
if c.expectHCL1Message {
|
||||
require.Contains(t, err.Error(), exptMessage)
|
||||
must.ErrorContains(t, err, exptMessage)
|
||||
} else {
|
||||
require.NotContains(t, err.Error(), exptMessage)
|
||||
must.StrNotContains(t, err.Error(), exptMessage)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -359,20 +358,20 @@ job "example" {
|
||||
expected := []string{"default-val", "from-cli", "from-varfile", "from-envvar"}
|
||||
|
||||
hclf, err := os.CreateTemp("", "hcl")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Remove(hclf.Name())
|
||||
defer hclf.Close()
|
||||
|
||||
_, err = hclf.WriteString(hcl)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
vf, err := os.CreateTemp("", "var.hcl")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Remove(vf.Name())
|
||||
defer vf.Close()
|
||||
|
||||
_, err = vf.WriteString(fileVars + "\n")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
jg := &JobGetter{
|
||||
Vars: cliArgs,
|
||||
@@ -381,10 +380,10 @@ job "example" {
|
||||
}
|
||||
|
||||
_, j, err := jg.Get(hclf.Name())
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
require.NotNil(t, j)
|
||||
require.Equal(t, expected, j.Datacenters)
|
||||
must.NotNil(t, j)
|
||||
must.Eq(t, expected, j.Datacenters)
|
||||
}
|
||||
|
||||
func TestJobGetter_HCL2_Variables_StrictFalse(t *testing.T) {
|
||||
@@ -414,20 +413,20 @@ unsedVar2 = "from-varfile"
|
||||
expected := []string{"default-val", "from-cli", "from-varfile", "from-envvar"}
|
||||
|
||||
hclf, err := os.CreateTemp("", "hcl")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Remove(hclf.Name())
|
||||
defer hclf.Close()
|
||||
|
||||
_, err = hclf.WriteString(hcl)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
vf, err := os.CreateTemp("", "var.hcl")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Remove(vf.Name())
|
||||
defer vf.Close()
|
||||
|
||||
_, err = vf.WriteString(fileVars + "\n")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
jg := &JobGetter{
|
||||
Vars: cliArgs,
|
||||
@@ -436,10 +435,9 @@ unsedVar2 = "from-varfile"
|
||||
}
|
||||
|
||||
_, j, err := jg.Get(hclf.Name())
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NotNil(t, j)
|
||||
require.Equal(t, expected, j.Datacenters)
|
||||
must.NoError(t, err)
|
||||
must.NotNil(t, j)
|
||||
must.Eq(t, expected, j.Datacenters)
|
||||
}
|
||||
|
||||
// Test StructJob with jobfile from HTTP Server
|
||||
@@ -535,9 +533,9 @@ func TestJobGetter_Validate(t *testing.T) {
|
||||
|
||||
switch tc.errContains {
|
||||
case "":
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
default:
|
||||
require.ErrorContains(t, err, tc.errContains)
|
||||
must.ErrorContains(t, err, tc.errContains)
|
||||
}
|
||||
|
||||
})
|
||||
@@ -610,27 +608,27 @@ func TestUiErrorWriter(t *testing.T) {
|
||||
partialAcc := ""
|
||||
for _, in := range inputs {
|
||||
n, err := w.Write([]byte(in))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, len(in), n)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, len(in), n)
|
||||
|
||||
// assert that writer emits partial result until last new line
|
||||
partialAcc += strings.ReplaceAll(in, "\r\n", "\n")
|
||||
lastNL := strings.LastIndex(partialAcc, "\n")
|
||||
require.Equal(t, partialAcc[:lastNL+1], errBuf.String())
|
||||
must.Eq(t, partialAcc[:lastNL+1], errBuf.String())
|
||||
}
|
||||
|
||||
require.Empty(t, outBuf.String())
|
||||
must.Eq(t, "", outBuf.String())
|
||||
|
||||
// note that the \r\n got replaced by \n
|
||||
expectedErr := "some line\nmultiple\nlines\nhere with followup\nand more lines without new line until here\n"
|
||||
require.Equal(t, expectedErr, errBuf.String())
|
||||
must.Eq(t, expectedErr, errBuf.String())
|
||||
|
||||
// close emits the final line
|
||||
err := w.Close()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
expectedErr += "and thensome more\n"
|
||||
require.Equal(t, expectedErr, errBuf.String())
|
||||
must.Eq(t, expectedErr, errBuf.String())
|
||||
}
|
||||
|
||||
func Test_extractVarFiles(t *testing.T) {
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/client/testutil"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestIntegration_Command_NomadInit(t *testing.T) {
|
||||
@@ -43,7 +43,6 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
testutil.DockerCompatible(t)
|
||||
|
||||
assert := assert.New(t)
|
||||
tmpDir := t.TempDir()
|
||||
|
||||
// Start in dev mode so we get a node registration
|
||||
@@ -53,7 +52,7 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) {
|
||||
{
|
||||
cmd := exec.Command("nomad", "job", "init", "-short")
|
||||
cmd.Dir = tmpDir
|
||||
assert.Nil(cmd.Run())
|
||||
must.NoError(t, cmd.Run())
|
||||
}
|
||||
|
||||
{
|
||||
@@ -71,16 +70,16 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) {
|
||||
cmd.Dir = tmpDir
|
||||
cmd.Env = []string{fmt.Sprintf("NOMAD_ADDR=%s", url)}
|
||||
out, err := cmd.Output()
|
||||
assert.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var req api.JobRegisterRequest
|
||||
dec := json.NewDecoder(bytes.NewReader(out))
|
||||
assert.Nil(dec.Decode(&req))
|
||||
must.NoError(t, dec.Decode(&req))
|
||||
|
||||
var resp api.JobRegisterResponse
|
||||
_, err = client.Raw().Write("/v1/jobs", req, &resp, nil)
|
||||
assert.Nil(err)
|
||||
assert.NotZero(resp.EvalID)
|
||||
must.NoError(t, err)
|
||||
must.NotEq(t, "", resp.EvalID)
|
||||
}
|
||||
|
||||
{
|
||||
@@ -88,6 +87,6 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) {
|
||||
cmd.Dir = tmpDir
|
||||
cmd.Env = []string{fmt.Sprintf("NOMAD_ADDR=%s", url)}
|
||||
_, err := cmd.Output()
|
||||
assert.Nil(err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestJobAllocsCommand_Implements(t *testing.T) {
|
||||
@@ -33,24 +32,24 @@ func TestJobAllocsCommand_Fails(t *testing.T) {
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
outerr := ui.ErrorWriter.String()
|
||||
require.Equalf(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Containsf(t, outerr, commandErrorText(cmd), "expected help output, got: %s", outerr)
|
||||
must.One(t, code)
|
||||
must.StrContains(t, outerr, commandErrorText(cmd))
|
||||
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Bad address
|
||||
code = cmd.Run([]string{"-address=nope", "foo"})
|
||||
outerr = ui.ErrorWriter.String()
|
||||
require.Equalf(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Containsf(t, outerr, "Error querying job prefix", "expected failed query error, got: %s", outerr)
|
||||
must.One(t, code)
|
||||
must.StrContains(t, outerr, "Error querying job prefix")
|
||||
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Bad job name
|
||||
code = cmd.Run([]string{"-address=" + url, "foo"})
|
||||
outerr = ui.ErrorWriter.String()
|
||||
require.Equalf(t, 1, code, "expected exit 1, got: %d", code)
|
||||
require.Containsf(t, outerr, "No job(s) with prefix or ID \"foo\" found", "expected no job found, got: %s", outerr)
|
||||
must.One(t, code)
|
||||
must.StrContains(t, outerr, "No job(s) with prefix or ID \"foo\" found")
|
||||
|
||||
ui.ErrorWriter.Reset()
|
||||
}
|
||||
@@ -66,13 +65,13 @@ func TestJobAllocsCommand_Run(t *testing.T) {
|
||||
// Create a job without an allocation
|
||||
job := mock.Job()
|
||||
state := srv.Agent.Server().State()
|
||||
require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
|
||||
// Should display no match if the job doesn't have allocations
|
||||
code := cmd.Run([]string{"-address=" + url, job.ID})
|
||||
out := ui.OutputWriter.String()
|
||||
require.Equalf(t, 0, code, "expected exit 0, got: %d", code)
|
||||
require.Containsf(t, out, "No allocations placed", "expected no allocations placed, got: %s", out)
|
||||
must.Zero(t, code)
|
||||
must.StrContains(t, out, "No allocations placed")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
@@ -84,15 +83,15 @@ func TestJobAllocsCommand_Run(t *testing.T) {
|
||||
a.Metrics = &structs.AllocMetric{}
|
||||
a.DesiredStatus = structs.AllocDesiredStatusRun
|
||||
a.ClientStatus = structs.AllocClientStatusRunning
|
||||
require.Nil(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a}))
|
||||
must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a}))
|
||||
|
||||
// Should now display the alloc
|
||||
code = cmd.Run([]string{"-address=" + url, "-verbose", job.ID})
|
||||
out = ui.OutputWriter.String()
|
||||
outerr := ui.ErrorWriter.String()
|
||||
require.Equalf(t, 0, code, "expected exit 0, got: %d", code)
|
||||
require.Emptyf(t, outerr, "expected no error output, got: \n\n%s", outerr)
|
||||
require.Containsf(t, out, a.ID, "expected alloc output, got: %s", out)
|
||||
must.Zero(t, code)
|
||||
must.Eq(t, "", outerr)
|
||||
must.StrContains(t, out, a.ID)
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -109,7 +108,7 @@ func TestJobAllocsCommand_Template(t *testing.T) {
|
||||
// Create a job
|
||||
job := mock.Job()
|
||||
state := srv.Agent.Server().State()
|
||||
require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
|
||||
// Inject a running allocation
|
||||
a := mock.Alloc()
|
||||
@@ -119,7 +118,7 @@ func TestJobAllocsCommand_Template(t *testing.T) {
|
||||
a.Metrics = &structs.AllocMetric{}
|
||||
a.DesiredStatus = structs.AllocDesiredStatusRun
|
||||
a.ClientStatus = structs.AllocClientStatusRunning
|
||||
require.Nil(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a}))
|
||||
must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a}))
|
||||
|
||||
// Inject a pending allocation
|
||||
b := mock.Alloc()
|
||||
@@ -129,16 +128,16 @@ func TestJobAllocsCommand_Template(t *testing.T) {
|
||||
b.Metrics = &structs.AllocMetric{}
|
||||
b.DesiredStatus = structs.AllocDesiredStatusRun
|
||||
b.ClientStatus = structs.AllocClientStatusPending
|
||||
require.Nil(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 300, []*structs.Allocation{b}))
|
||||
must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 300, []*structs.Allocation{b}))
|
||||
|
||||
// Should display an AllocacitonListStub object
|
||||
code := cmd.Run([]string{"-address=" + url, "-t", "'{{printf \"%#+v\" .}}'", job.ID})
|
||||
out := ui.OutputWriter.String()
|
||||
outerr := ui.ErrorWriter.String()
|
||||
|
||||
require.Equalf(t, 0, code, "expected exit 0, got: %d", code)
|
||||
require.Emptyf(t, outerr, "expected no error output, got: \n\n%s", outerr)
|
||||
require.Containsf(t, out, "api.AllocationListStub", "expected alloc output, got: %s", out)
|
||||
must.Zero(t, code)
|
||||
must.Eq(t, "", outerr)
|
||||
must.StrContains(t, out, "api.AllocationListStub")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -148,10 +147,10 @@ func TestJobAllocsCommand_Template(t *testing.T) {
|
||||
out = ui.OutputWriter.String()
|
||||
outerr = ui.ErrorWriter.String()
|
||||
|
||||
require.Equalf(t, 0, code, "expected exit 0, got: %d", code)
|
||||
require.Emptyf(t, outerr, "expected no error output, got: \n\n%s", outerr)
|
||||
require.Containsf(t, out, a.ID, "expected ID of alloc a, got: %s", out)
|
||||
require.NotContainsf(t, out, b.ID, "should not contain ID of alloc b, got: %s", out)
|
||||
must.Zero(t, code)
|
||||
must.Eq(t, "", outerr)
|
||||
must.StrContains(t, out, a.ID)
|
||||
must.StrNotContains(t, out, b.ID)
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -168,15 +167,15 @@ func TestJobAllocsCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(t, 1, len(res))
|
||||
require.Equal(t, j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobAllocsCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestJobDeploymentsCommand_Implements(t *testing.T) {
|
||||
@@ -49,7 +48,6 @@ func TestJobDeploymentsCommand_Fails(t *testing.T) {
|
||||
func TestJobDeploymentsCommand_Run(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
|
||||
assert := assert.New(t)
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
|
||||
@@ -64,7 +62,7 @@ func TestJobDeploymentsCommand_Run(t *testing.T) {
|
||||
// Create a job without a deployment
|
||||
job := mock.Job()
|
||||
state := srv.Agent.Server().State()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
|
||||
// Should display no match if the job doesn't have deployments
|
||||
if code := cmd.Run([]string{"-address=" + url, job.ID}); code != 0 {
|
||||
@@ -79,7 +77,7 @@ func TestJobDeploymentsCommand_Run(t *testing.T) {
|
||||
d := mock.Deployment()
|
||||
d.JobID = job.ID
|
||||
d.JobCreateIndex = job.CreateIndex
|
||||
assert.Nil(state.UpsertDeployment(200, d))
|
||||
must.NoError(t, state.UpsertDeployment(200, d))
|
||||
|
||||
// Should now display the deployment
|
||||
if code := cmd.Run([]string{"-address=" + url, "-verbose", job.ID}); code != 0 {
|
||||
@@ -93,7 +91,7 @@ func TestJobDeploymentsCommand_Run(t *testing.T) {
|
||||
|
||||
func TestJobDeploymentsCommand_Run_Latest(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
|
||||
@@ -108,7 +106,7 @@ func TestJobDeploymentsCommand_Run_Latest(t *testing.T) {
|
||||
// Create a job without a deployment
|
||||
job := mock.Job()
|
||||
state := srv.Agent.Server().State()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job))
|
||||
|
||||
// Should display no match if the job doesn't have deployments
|
||||
if code := cmd.Run([]string{"-address=" + url, "-latest", job.ID}); code != 0 {
|
||||
@@ -123,7 +121,7 @@ func TestJobDeploymentsCommand_Run_Latest(t *testing.T) {
|
||||
d := mock.Deployment()
|
||||
d.JobID = job.ID
|
||||
d.JobCreateIndex = job.CreateIndex
|
||||
assert.Nil(state.UpsertDeployment(200, d))
|
||||
must.NoError(t, state.UpsertDeployment(200, d))
|
||||
|
||||
// Should now display the deployment
|
||||
if code := cmd.Run([]string{"-address=" + url, "-verbose", "-latest", job.ID}); code != 0 {
|
||||
@@ -137,7 +135,6 @@ func TestJobDeploymentsCommand_Run_Latest(t *testing.T) {
|
||||
|
||||
func TestJobDeploymentsCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -148,15 +145,15 @@ func TestJobDeploymentsCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobDeploymentsCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestJobDispatchCommand_Implements(t *testing.T) {
|
||||
@@ -67,7 +66,7 @@ func TestJobDispatchCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
@@ -75,12 +74,12 @@ func TestJobDispatchCommand_AutocompleteArgs(t *testing.T) {
|
||||
|
||||
// No parameterized jobs, should be 0 results
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(t, 0, len(res))
|
||||
must.SliceEmpty(t, res)
|
||||
|
||||
// Create a fake parameterized job
|
||||
j1 := mock.Job()
|
||||
j1.ParameterizedJob = &structs.ParameterizedJobConfig{}
|
||||
require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 2000, nil, j1))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 2000, nil, j1))
|
||||
|
||||
prefix = j1.ID[:len(j1.ID)-5]
|
||||
args = complete.Args{Last: prefix}
|
||||
@@ -88,8 +87,8 @@ func TestJobDispatchCommand_AutocompleteArgs(t *testing.T) {
|
||||
|
||||
// Should return 1 parameterized job
|
||||
res = predictor.Predict(args)
|
||||
require.Equal(t, 1, len(res))
|
||||
require.Equal(t, j1.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j1.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobDispatchCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -17,8 +17,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestJobEvalCommand_Implements(t *testing.T) {
|
||||
@@ -74,17 +72,16 @@ func TestJobEvalCommand_Run(t *testing.T) {
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &JobEvalCommand{Meta: Meta{Ui: ui}}
|
||||
require := require.New(t)
|
||||
|
||||
state := srv.Agent.Server().State()
|
||||
|
||||
// Create a job
|
||||
job := mock.Job()
|
||||
err := state.UpsertJob(structs.MsgTypeTestSetup, 11, nil, job)
|
||||
require.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
job, err = state.JobByID(nil, structs.DefaultNamespace, job.ID)
|
||||
require.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create a failed alloc for the job
|
||||
alloc := mock.Alloc()
|
||||
@@ -94,7 +91,7 @@ func TestJobEvalCommand_Run(t *testing.T) {
|
||||
alloc.Namespace = job.Namespace
|
||||
alloc.ClientStatus = structs.AllocClientStatusFailed
|
||||
err = state.UpsertAllocs(structs.MsgTypeTestSetup, 12, []*structs.Allocation{alloc})
|
||||
require.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
if code := cmd.Run([]string{"-address=" + url, "-force-reschedule", "-detach", job.ID}); code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d", code)
|
||||
@@ -102,15 +99,14 @@ func TestJobEvalCommand_Run(t *testing.T) {
|
||||
|
||||
// Lookup alloc again
|
||||
alloc, err = state.AllocByID(nil, alloc.ID)
|
||||
require.NotNil(alloc)
|
||||
require.Nil(err)
|
||||
require.True(*alloc.DesiredTransition.ForceReschedule)
|
||||
must.NotNil(t, alloc)
|
||||
must.Nil(t, err)
|
||||
must.True(t, *alloc.DesiredTransition.ForceReschedule)
|
||||
|
||||
}
|
||||
|
||||
func TestJobEvalCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -121,15 +117,15 @@ func TestJobEvalCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobEvalCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestJobHistoryCommand_Implements(t *testing.T) {
|
||||
@@ -48,7 +47,6 @@ func TestJobHistoryCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestJobHistoryCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -59,15 +57,15 @@ func TestJobHistoryCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobHistoryCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -13,7 +13,6 @@ import (
|
||||
"github.com/hashicorp/nomad/command/asset"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestInitCommand_Implements(t *testing.T) {
|
||||
@@ -64,12 +63,12 @@ func TestInitCommand_Run(t *testing.T) {
|
||||
// Works with -short flag
|
||||
os.Remove(DefaultInitName)
|
||||
if code := cmd.Run([]string{"-short"}); code != 0 {
|
||||
require.Zero(t, code, "unexpected exit code: %d", code)
|
||||
must.Zero(t, code)
|
||||
}
|
||||
content, err = os.ReadFile(DefaultInitName)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
shortJob := asset.JobExampleShort
|
||||
require.Equal(t, string(content), string(shortJob))
|
||||
must.Eq(t, string(content), string(shortJob))
|
||||
|
||||
// Fails if the file exists
|
||||
if code := cmd.Run([]string{}); code != 1 {
|
||||
@@ -204,12 +203,12 @@ func TestInitCommand_customFilename(t *testing.T) {
|
||||
// Works with -short flag
|
||||
os.Remove(filename)
|
||||
if code := cmd.Run([]string{"-short", filename}); code != 0 {
|
||||
require.Zero(t, code, "unexpected exit code: %d", code)
|
||||
must.Zero(t, code)
|
||||
}
|
||||
content, err = os.ReadFile(filename)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
shortJob := asset.JobExampleShort
|
||||
require.Equal(t, string(content), string(shortJob))
|
||||
must.Eq(t, string(content), string(shortJob))
|
||||
|
||||
// Fails if the file exists
|
||||
if code := cmd.Run([]string{filename}); code != 1 {
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestInspectCommand_Implements(t *testing.T) {
|
||||
@@ -69,7 +68,6 @@ func TestInspectCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestInspectCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -79,15 +77,15 @@ func TestInspectCommand_AutocompleteArgs(t *testing.T) {
|
||||
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobInspectCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -17,7 +17,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestJobPeriodicForceCommand_Implements(t *testing.T) {
|
||||
@@ -32,15 +31,15 @@ func TestJobPeriodicForceCommand_Fails(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, code, 1, "expected error")
|
||||
must.One(t, code)
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Contains(t, out, commandErrorText(cmd), "expected help output")
|
||||
must.StrContains(t, out, commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
code = cmd.Run([]string{"-address=nope", "12"})
|
||||
require.Equal(t, code, 1, "expected error")
|
||||
must.One(t, code)
|
||||
out = ui.ErrorWriter.String()
|
||||
require.Contains(t, out, "Error querying job prefix", "expected force error")
|
||||
must.StrContains(t, out, "Error querying job prefix")
|
||||
}
|
||||
|
||||
func TestJobPeriodicForceCommand_AutocompleteArgs(t *testing.T) {
|
||||
@@ -55,12 +54,12 @@ func TestJobPeriodicForceCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job, not periodic
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
require.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(complete.Args{Last: j.ID[:len(j.ID)-5]})
|
||||
require.Empty(t, res)
|
||||
must.SliceEmpty(t, res)
|
||||
|
||||
// Create another fake job, periodic
|
||||
state = srv.Agent.Server().State()
|
||||
@@ -72,13 +71,13 @@ func TestJobPeriodicForceCommand_AutocompleteArgs(t *testing.T) {
|
||||
ProhibitOverlap: true,
|
||||
TimeZone: "test zone",
|
||||
}
|
||||
require.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j2))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j2))
|
||||
|
||||
res = predictor.Predict(complete.Args{Last: j2.ID[:len(j.ID)-5]})
|
||||
require.Equal(t, []string{j2.ID}, res)
|
||||
must.Eq(t, []string{j2.ID}, res)
|
||||
|
||||
res = predictor.Predict(complete.Args{})
|
||||
require.Equal(t, []string{j2.ID}, res)
|
||||
must.Eq(t, []string{j2.ID}, res)
|
||||
}
|
||||
|
||||
func TestJobPeriodicForceCommand_NonPeriodicJob(t *testing.T) {
|
||||
@@ -98,7 +97,7 @@ func TestJobPeriodicForceCommand_NonPeriodicJob(t *testing.T) {
|
||||
}
|
||||
return true, nil
|
||||
}, func(err error) {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
})
|
||||
|
||||
// Register a job
|
||||
@@ -108,14 +107,14 @@ func TestJobPeriodicForceCommand_NonPeriodicJob(t *testing.T) {
|
||||
cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}}
|
||||
|
||||
resp, _, err := client.Jobs().Register(j, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
code = cmd.Run([]string{"-address=" + url, "job_not_periodic"})
|
||||
require.Equal(t, 1, code, "expected exit code")
|
||||
must.One(t, code)
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Contains(t, out, "No periodic job(s)", "non-periodic error message")
|
||||
must.StrContains(t, out, "No periodic job(s)")
|
||||
}
|
||||
|
||||
func TestJobPeriodicForceCommand_SuccessfulPeriodicForceDetach(t *testing.T) {
|
||||
@@ -135,7 +134,7 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForceDetach(t *testing.T) {
|
||||
}
|
||||
return true, nil
|
||||
}, func(err error) {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
})
|
||||
|
||||
// Register a job
|
||||
@@ -151,13 +150,13 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForceDetach(t *testing.T) {
|
||||
cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}}
|
||||
|
||||
_, _, err := client.Jobs().Register(j, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
code := cmd.Run([]string{"-address=" + url, "-detach", "job1_is_periodic"})
|
||||
require.Equal(t, 0, code, "expected no error code")
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(t, out, "Force periodic successful")
|
||||
require.Contains(t, out, "Evaluation ID:")
|
||||
must.StrContains(t, out, "Force periodic successful")
|
||||
must.StrContains(t, out, "Evaluation ID:")
|
||||
}
|
||||
|
||||
func TestJobPeriodicForceCommand_SuccessfulPeriodicForce(t *testing.T) {
|
||||
@@ -177,7 +176,7 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForce(t *testing.T) {
|
||||
}
|
||||
return true, nil
|
||||
}, func(err error) {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
})
|
||||
|
||||
// Register a job
|
||||
@@ -193,13 +192,13 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForce(t *testing.T) {
|
||||
cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}}
|
||||
|
||||
_, _, err := client.Jobs().Register(j, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
code := cmd.Run([]string{"-address=" + url, "job2_is_periodic"})
|
||||
require.Equal(t, 0, code, "expected no error code")
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(t, out, "Monitoring evaluation")
|
||||
require.Contains(t, out, "finished with status \"complete\"")
|
||||
must.StrContains(t, out, "Monitoring evaluation")
|
||||
must.StrContains(t, out, "finished with status \"complete\"")
|
||||
}
|
||||
|
||||
func TestJobPeriodicForceCommand_SuccessfulIfJobIDEqualsPrefix(t *testing.T) {
|
||||
@@ -219,7 +218,7 @@ func TestJobPeriodicForceCommand_SuccessfulIfJobIDEqualsPrefix(t *testing.T) {
|
||||
}
|
||||
return true, nil
|
||||
}, func(err error) {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
})
|
||||
|
||||
j1 := testJob("periodic-prefix")
|
||||
@@ -241,15 +240,15 @@ func TestJobPeriodicForceCommand_SuccessfulIfJobIDEqualsPrefix(t *testing.T) {
|
||||
cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}}
|
||||
|
||||
_, _, err := client.Jobs().Register(j1, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
_, _, err = client.Jobs().Register(j2, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
code := cmd.Run([]string{"-address=" + url, "periodic-prefix"})
|
||||
require.Equal(t, 0, code, "expected no error code")
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(t, out, "Monitoring evaluation")
|
||||
require.Contains(t, out, "finished with status \"complete\"")
|
||||
must.StrContains(t, out, "Monitoring evaluation")
|
||||
must.StrContains(t, out, "finished with status \"complete\"")
|
||||
}
|
||||
|
||||
func TestJobPeriodicForceCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPlanCommand_Implements(t *testing.T) {
|
||||
@@ -132,7 +131,7 @@ func TestPlanCommand_hcl1_hcl2_strict(t *testing.T) {
|
||||
})
|
||||
// Exit code 1 here means that an alloc will be created, which is
|
||||
// expected.
|
||||
require.Equal(t, 1, got)
|
||||
must.One(t, got)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -199,7 +198,7 @@ func TestPlanCommand_From_Files(t *testing.T) {
|
||||
cmd := &JobPlanCommand{Meta: Meta{Ui: ui}}
|
||||
args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-basic.nomad"}
|
||||
code := cmd.Run(args)
|
||||
require.Equal(t, 1, code) // no client running, fail to place
|
||||
must.One(t, code) // no client running, fail to place
|
||||
must.StrContains(t, ui.OutputWriter.String(), "WARNING: Failed to place all allocations.")
|
||||
})
|
||||
|
||||
@@ -253,7 +252,6 @@ func TestPlanCommand_Preemptions(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &JobPlanCommand{Meta: Meta{Ui: ui}}
|
||||
require := require.New(t)
|
||||
|
||||
// Only one preempted alloc
|
||||
resp1 := &api.JobPlanResponse{
|
||||
@@ -271,8 +269,8 @@ func TestPlanCommand_Preemptions(t *testing.T) {
|
||||
}
|
||||
cmd.addPreemptions(resp1)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(out, "Alloc ID")
|
||||
require.Contains(out, "alloc1")
|
||||
must.StrContains(t, out, "Alloc ID")
|
||||
must.StrContains(t, out, "alloc1")
|
||||
|
||||
// Less than 10 unique job ids
|
||||
var preemptedAllocs []*api.AllocationListStub
|
||||
@@ -296,8 +294,8 @@ func TestPlanCommand_Preemptions(t *testing.T) {
|
||||
ui.OutputWriter.Reset()
|
||||
cmd.addPreemptions(resp2)
|
||||
out = ui.OutputWriter.String()
|
||||
require.Contains(out, "Job ID")
|
||||
require.Contains(out, "Namespace")
|
||||
must.StrContains(t, out, "Job ID")
|
||||
must.StrContains(t, out, "Namespace")
|
||||
|
||||
// More than 10 unique job IDs
|
||||
preemptedAllocs = make([]*api.AllocationListStub, 0)
|
||||
@@ -327,9 +325,9 @@ func TestPlanCommand_Preemptions(t *testing.T) {
|
||||
ui.OutputWriter.Reset()
|
||||
cmd.addPreemptions(resp3)
|
||||
out = ui.OutputWriter.String()
|
||||
require.Contains(out, "Job Type")
|
||||
require.Contains(out, "batch")
|
||||
require.Contains(out, "service")
|
||||
must.StrContains(t, out, "Job Type")
|
||||
must.StrContains(t, out, "batch")
|
||||
must.StrContains(t, out, "service")
|
||||
}
|
||||
|
||||
func TestPlanCommand_JSON(t *testing.T) {
|
||||
@@ -344,6 +342,6 @@ func TestPlanCommand_JSON(t *testing.T) {
|
||||
"testdata/example-short.json",
|
||||
}
|
||||
code := cmd.Run(args)
|
||||
require.Equal(t, 255, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "Error during plan: Put")
|
||||
must.Eq(t, 255, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Error during plan: Put")
|
||||
}
|
||||
|
||||
@@ -10,13 +10,11 @@ import (
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/command/agent"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/shoenig/test/must"
|
||||
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestJobPromoteCommand_Implements(t *testing.T) {
|
||||
@@ -49,7 +47,6 @@ func TestJobPromoteCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestJobPromoteCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -60,15 +57,15 @@ func TestJobPromoteCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobPromoteCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -25,7 +25,6 @@ import (
|
||||
"github.com/hashicorp/nomad/helper/pointer"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/shoenig/test/wait"
|
||||
)
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestJobRevertCommand_Implements(t *testing.T) {
|
||||
@@ -48,7 +47,6 @@ func TestJobRevertCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestJobRevertCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -59,15 +57,15 @@ func TestJobRevertCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobRevertCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
var _ cli.Command = (*JobRunCommand)(nil)
|
||||
@@ -70,7 +70,7 @@ func TestRunCommand_hcl1_hcl2_strict(t *testing.T) {
|
||||
"-detach",
|
||||
"asset/example-short.nomad.hcl",
|
||||
})
|
||||
require.Equal(t, 0, got, ui.ErrorWriter.String())
|
||||
must.Zero(t, got)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -261,13 +261,13 @@ func TestRunCommand_JSON(t *testing.T) {
|
||||
|
||||
// First convert HCL -> JSON with -output
|
||||
stdout, stderr, code := run("-output", "asset/example-short.nomad.hcl")
|
||||
require.Zero(t, code, stderr)
|
||||
require.Empty(t, stderr)
|
||||
require.NotEmpty(t, stdout)
|
||||
must.Zero(t, code)
|
||||
must.Eq(t, "", stderr)
|
||||
must.NotEq(t, "", stdout)
|
||||
t.Logf("run -output==> %s...", stdout[:12])
|
||||
|
||||
jsonFile := filepath.Join(t.TempDir(), "redis.json")
|
||||
require.NoError(t, os.WriteFile(jsonFile, []byte(stdout), 0o640))
|
||||
must.NoError(t, os.WriteFile(jsonFile, []byte(stdout), 0o640))
|
||||
|
||||
// Wait for agent to start and get its address
|
||||
addr := ""
|
||||
@@ -279,23 +279,23 @@ func TestRunCommand_JSON(t *testing.T) {
|
||||
|
||||
// Submit JSON
|
||||
stdout, stderr, code = run("-detach", "-address", addr, "-json", jsonFile)
|
||||
require.Zero(t, code, stderr)
|
||||
require.Empty(t, stderr)
|
||||
must.Zero(t, code)
|
||||
must.Eq(t, "", stderr)
|
||||
|
||||
// Read the JSON from the API as it omits the Job envelope and
|
||||
// therefore differs from -output
|
||||
resp, err := http.Get(addr + "/v1/job/example")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
buf, err := io.ReadAll(resp.Body)
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, resp.Body.Close())
|
||||
require.NotEmpty(t, buf)
|
||||
must.NoError(t, err)
|
||||
must.NoError(t, resp.Body.Close())
|
||||
must.SliceNotEmpty(t, buf)
|
||||
t.Logf("/v1/job/example==> %s...", string(buf[:12]))
|
||||
require.NoError(t, os.WriteFile(jsonFile, buf, 0o640))
|
||||
must.NoError(t, os.WriteFile(jsonFile, buf, 0o640))
|
||||
|
||||
// Submit JSON
|
||||
stdout, stderr, code = run("-detach", "-address", addr, "-json", jsonFile)
|
||||
require.Zerof(t, code, "stderr: %s\njson: %s\n", stderr, string(buf))
|
||||
require.Empty(t, stderr)
|
||||
require.NotEmpty(t, stdout)
|
||||
must.Zero(t, code)
|
||||
must.Eq(t, "", stderr)
|
||||
must.NotEq(t, "", stdout)
|
||||
}
|
||||
|
||||
@@ -19,8 +19,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestJobStatusCommand_Implements(t *testing.T) {
|
||||
@@ -166,7 +164,7 @@ func TestJobStatusCommand_Run(t *testing.T) {
|
||||
nodeNameHeaderStr := "Node Name"
|
||||
nodeNameHeaderIndex := strings.Index(allocationsTableStr, nodeNameHeaderStr)
|
||||
nodeNameRegexpStr := fmt.Sprintf(`.*%s.*\n.{%d}%s`, nodeNameHeaderStr, nodeNameHeaderIndex, regexp.QuoteMeta(nodeName))
|
||||
require.Regexp(t, regexp.MustCompile(nodeNameRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(nodeNameRegexpStr), out)
|
||||
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
@@ -254,7 +252,6 @@ func TestJobStatusCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestJobStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -265,20 +262,19 @@ func TestJobStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
prefix := j.ID[:len(j.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(j.ID, res[0])
|
||||
must.SliceLen(t, 1, res)
|
||||
must.Eq(t, j.ID, res[0])
|
||||
}
|
||||
|
||||
func TestJobStatusCommand_WithAccessPolicy(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
config := func(c *agent.Config) {
|
||||
c.ACL.Enabled = true
|
||||
@@ -289,7 +285,7 @@ func TestJobStatusCommand_WithAccessPolicy(t *testing.T) {
|
||||
|
||||
// Bootstrap an initial ACL token
|
||||
token := srv.RootToken
|
||||
assert.NotNil(token, "failed to bootstrap ACL token")
|
||||
must.NotNil(t, token)
|
||||
|
||||
// Wait for client ready
|
||||
client.SetSecretID(token.SecretID)
|
||||
@@ -320,22 +316,22 @@ func TestJobStatusCommand_WithAccessPolicy(t *testing.T) {
|
||||
// registering a job without a token fails
|
||||
client.SetSecretID(invalidToken.SecretID)
|
||||
resp, _, err := client.Jobs().Register(j, nil)
|
||||
assert.NotNil(err)
|
||||
must.NotNil(t, err)
|
||||
|
||||
// registering a job with a valid token succeeds
|
||||
client.SetSecretID(token.SecretID)
|
||||
resp, _, err = client.Jobs().Register(j, nil)
|
||||
assert.Nil(err)
|
||||
must.NoError(t, err)
|
||||
code := waitForSuccess(ui, client, fullId, t, resp.EvalID)
|
||||
assert.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
// Request Job List without providing a valid token
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + invalidToken.SecretID, "-short"})
|
||||
assert.Equal(1, code)
|
||||
must.One(t, code)
|
||||
|
||||
// Request Job List with a valid token
|
||||
code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-short"})
|
||||
assert.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
if !strings.Contains(out, *j.ID) {
|
||||
@@ -367,16 +363,15 @@ func TestJobStatusCommand_RescheduleEvals(t *testing.T) {
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &JobStatusCommand{Meta: Meta{Ui: ui, flagAddress: url}}
|
||||
|
||||
require := require.New(t)
|
||||
state := srv.Agent.Server().State()
|
||||
|
||||
// Create state store objects for job, alloc and followup eval with a future WaitUntil value
|
||||
j := mock.Job()
|
||||
require.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 900, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 900, nil, j))
|
||||
|
||||
e := mock.Eval()
|
||||
e.WaitUntil = time.Now().Add(1 * time.Hour)
|
||||
require.Nil(state.UpsertEvals(structs.MsgTypeTestSetup, 902, []*structs.Evaluation{e}))
|
||||
must.NoError(t, state.UpsertEvals(structs.MsgTypeTestSetup, 902, []*structs.Evaluation{e}))
|
||||
a := mock.Alloc()
|
||||
a.Job = j
|
||||
a.JobID = j.ID
|
||||
@@ -385,15 +380,15 @@ func TestJobStatusCommand_RescheduleEvals(t *testing.T) {
|
||||
a.Metrics = &structs.AllocMetric{}
|
||||
a.DesiredStatus = structs.AllocDesiredStatusRun
|
||||
a.ClientStatus = structs.AllocClientStatusRunning
|
||||
require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
|
||||
must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a}))
|
||||
|
||||
// Query jobs with prefix match
|
||||
if code := cmd.Run([]string{"-address=" + url, j.ID}); code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d", code)
|
||||
}
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(out, "Future Rescheduling Attempts")
|
||||
require.Contains(out, e.ID[:8])
|
||||
must.StrContains(t, out, "Future Rescheduling Attempts")
|
||||
must.StrContains(t, out, e.ID[:8])
|
||||
}
|
||||
|
||||
func TestJobStatusCommand_ACL(t *testing.T) {
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/helper/pointer"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestValidateCommand_Implements(t *testing.T) {
|
||||
@@ -40,7 +40,7 @@ func TestValidateCommand_Files(t *testing.T) {
|
||||
cmd := &JobValidateCommand{Meta: Meta{Ui: ui, flagAddress: "http://" + s.HTTPAddr}}
|
||||
args := []string{"testdata/example-basic.nomad"}
|
||||
code := cmd.Run(args)
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
})
|
||||
|
||||
t.Run("vault no token", func(t *testing.T) {
|
||||
@@ -48,8 +48,8 @@ func TestValidateCommand_Files(t *testing.T) {
|
||||
cmd := &JobValidateCommand{Meta: Meta{Ui: ui}}
|
||||
args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-vault.nomad"}
|
||||
code := cmd.Run(args)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "* Vault used in the job but missing Vault token")
|
||||
require.Equal(t, 1, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "* Vault used in the job but missing Vault token")
|
||||
must.One(t, code)
|
||||
})
|
||||
|
||||
t.Run("vault bad token via flag", func(t *testing.T) {
|
||||
@@ -57,8 +57,8 @@ func TestValidateCommand_Files(t *testing.T) {
|
||||
cmd := &JobValidateCommand{Meta: Meta{Ui: ui}}
|
||||
args := []string{"-address", "http://" + s.HTTPAddr, "-vault-token=abc123", "testdata/example-vault.nomad"}
|
||||
code := cmd.Run(args)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "* bad token")
|
||||
require.Equal(t, 1, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "* bad token")
|
||||
must.One(t, code)
|
||||
})
|
||||
|
||||
t.Run("vault token bad via env", func(t *testing.T) {
|
||||
@@ -67,8 +67,8 @@ func TestValidateCommand_Files(t *testing.T) {
|
||||
cmd := &JobValidateCommand{Meta: Meta{Ui: ui}}
|
||||
args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-vault.nomad"}
|
||||
code := cmd.Run(args)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "* bad token")
|
||||
require.Equal(t, 1, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "* bad token")
|
||||
must.One(t, code)
|
||||
})
|
||||
}
|
||||
func TestValidateCommand_hcl1_hcl2_strict(t *testing.T) {
|
||||
@@ -84,7 +84,7 @@ func TestValidateCommand_hcl1_hcl2_strict(t *testing.T) {
|
||||
"-address", addr,
|
||||
"asset/example-short.nomad.hcl",
|
||||
})
|
||||
require.Equal(t, 0, got, ui.ErrorWriter.String())
|
||||
must.Zero(t, got)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -221,11 +221,9 @@ func TestValidateCommand_JSON(t *testing.T) {
|
||||
|
||||
code := cmd.Run([]string{"-address", addr, "-json", "testdata/example-short.json"})
|
||||
|
||||
require.Zerof(t, code, "stdout: %s\nstdout: %s\n",
|
||||
ui.OutputWriter.String(), ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
code = cmd.Run([]string{"-address", addr, "-json", "testdata/example-short-bad.json"})
|
||||
|
||||
require.Equalf(t, 1, code, "stdout: %s\nstdout: %s\n",
|
||||
ui.OutputWriter.String(), ui.ErrorWriter.String())
|
||||
must.One(t, code)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
var _ cli.Command = &LicenseGetCommand{}
|
||||
@@ -26,10 +26,10 @@ func TestCommand_LicenseGet_OSSErr(t *testing.T) {
|
||||
|
||||
code := cmd.Run([]string{"-address=" + url})
|
||||
if srv.Enterprise {
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
} else {
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,9 +55,9 @@ func TestOutputLicenseReply(t *testing.T) {
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
|
||||
require.Equal(t, 0, OutputLicenseReply(ui, lic))
|
||||
must.Zero(t, OutputLicenseReply(ui, lic))
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(t, out, "Customer ID")
|
||||
require.Contains(t, out, "License ID")
|
||||
must.StrContains(t, out, "Customer ID")
|
||||
must.StrContains(t, out, "License ID")
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import (
|
||||
"github.com/hashicorp/nomad/helper/pointer"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestMeta_FlagSet(t *testing.T) {
|
||||
@@ -138,7 +137,7 @@ func TestMeta_Colorize(t *testing.T) {
|
||||
t.Run(tc.Name, func(t *testing.T) {
|
||||
// Create fake test terminal.
|
||||
_, tty, err := pty.Open()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer tty.Close()
|
||||
|
||||
oldStdout := os.Stdout
|
||||
@@ -155,7 +154,7 @@ func TestMeta_Colorize(t *testing.T) {
|
||||
tc.SetupFn(t, m)
|
||||
}
|
||||
|
||||
require.Equal(t, !tc.ExpectColor, m.Colorize().Disable)
|
||||
must.Eq(t, !tc.ExpectColor, m.Colorize().Disable)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/shoenig/test/wait"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestMonitor_Update_Eval(t *testing.T) {
|
||||
@@ -379,7 +378,7 @@ node-3 0 0 0 4 3
|
||||
for _, tc := range tests {
|
||||
t.Run(tc.Name, func(t *testing.T) {
|
||||
got := formatAllocMetrics(tc.Metrics, true, "")
|
||||
require.Equal(t, strings.TrimSpace(tc.Expected), got)
|
||||
must.Eq(t, strings.TrimSpace(tc.Expected), got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestNamespaceApplyCommand_Implements(t *testing.T) {
|
||||
@@ -59,8 +58,8 @@ func TestNamespaceApplyCommand_Good(t *testing.T) {
|
||||
}
|
||||
|
||||
namespaces, _, err := client.Namespaces().List(nil)
|
||||
assert.Nil(t, err)
|
||||
assert.Len(t, namespaces, 2)
|
||||
must.NoError(t, err)
|
||||
must.SliceLen(t, 2, namespaces)
|
||||
}
|
||||
|
||||
func TestNamespaceApplyCommand_parseNamesapceSpec(t *testing.T) {
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestNamespaceDeleteCommand_Implements(t *testing.T) {
|
||||
@@ -57,7 +57,7 @@ func TestNamespaceDeleteCommand_Good(t *testing.T) {
|
||||
Name: "foo",
|
||||
}
|
||||
_, err := client.Namespaces().Register(ns, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Delete a namespace
|
||||
if code := cmd.Run([]string{"-address=" + url, ns.Name}); code != 0 {
|
||||
@@ -65,13 +65,12 @@ func TestNamespaceDeleteCommand_Good(t *testing.T) {
|
||||
}
|
||||
|
||||
namespaces, _, err := client.Namespaces().List(nil)
|
||||
assert.Nil(t, err)
|
||||
assert.Len(t, namespaces, 1)
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 1, namespaces)
|
||||
}
|
||||
|
||||
func TestNamespaceDeleteCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -84,12 +83,12 @@ func TestNamespaceDeleteCommand_AutocompleteArgs(t *testing.T) {
|
||||
Name: "diddo",
|
||||
}
|
||||
_, err := client.Namespaces().Register(ns, nil)
|
||||
assert.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
args := complete.Args{Last: "d"}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(ns.Name, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, ns.Name, res[0])
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestNamespaceInspectCommand_Implements(t *testing.T) {
|
||||
@@ -57,7 +57,7 @@ func TestNamespaceInspectCommand_Good(t *testing.T) {
|
||||
Name: "foo",
|
||||
}
|
||||
_, err := client.Namespaces().Register(ns, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Inspect
|
||||
if code := cmd.Run([]string{"-address=" + url, ns.Name}); code != 0 {
|
||||
@@ -72,7 +72,6 @@ func TestNamespaceInspectCommand_Good(t *testing.T) {
|
||||
|
||||
func TestNamespaceInspectCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -85,14 +84,14 @@ func TestNamespaceInspectCommand_AutocompleteArgs(t *testing.T) {
|
||||
Name: "foo",
|
||||
}
|
||||
_, err := client.Namespaces().Register(ns, nil)
|
||||
assert.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
args := complete.Args{Last: "f"}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(ns.Name, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, ns.Name, res[0])
|
||||
}
|
||||
|
||||
// This test should demonstrate the behavior of a namespace
|
||||
@@ -112,27 +111,24 @@ func TestNamespaceInspectCommand_NamespaceMatchesPrefix(t *testing.T) {
|
||||
// Create a namespace that uses foo as a prefix
|
||||
ns := &api.Namespace{Name: "fooBar"}
|
||||
_, err := client.Namespaces().Register(ns, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create a foo namespace
|
||||
ns2 := &api.Namespace{Name: "foo"}
|
||||
_, err = client.Namespaces().Register(ns2, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Adding a NS after to prevent sort from creating
|
||||
// false successes
|
||||
ns = &api.Namespace{Name: "fooBaz"}
|
||||
_, err = client.Namespaces().Register(ns, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Check status on namespace
|
||||
code := cmd.Run([]string{"-address=" + url, ns2.Name})
|
||||
if code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d; %v", code, ui.ErrorWriter.String())
|
||||
}
|
||||
must.Zero(t, code)
|
||||
|
||||
// Check to ensure we got the proper foo
|
||||
out := ui.OutputWriter.String()
|
||||
if !strings.Contains(out, "\"foo\",\n") {
|
||||
t.Fatalf("expected namespace foo, got: %s", out)
|
||||
}
|
||||
must.StrContains(t, out, "\"foo\",\n")
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestNamespaceStatusCommand_Implements(t *testing.T) {
|
||||
@@ -108,7 +107,7 @@ func TestNamespaceStatusCommand_Run_Quota(t *testing.T) {
|
||||
// Create a quota to delete
|
||||
qs := testQuotaSpec()
|
||||
_, err := client.Quotas().Register(qs, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Create a namespace
|
||||
ns := &api.Namespace{
|
||||
@@ -116,7 +115,7 @@ func TestNamespaceStatusCommand_Run_Quota(t *testing.T) {
|
||||
Quota: qs.Name,
|
||||
}
|
||||
_, err = client.Namespaces().Register(ns, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Check status on namespace
|
||||
code := cmd.Run([]string{"-address=" + url, ns.Name})
|
||||
|
||||
@@ -17,8 +17,7 @@ import (
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestNodeDrainCommand_Implements(t *testing.T) {
|
||||
@@ -28,7 +27,7 @@ func TestNodeDrainCommand_Implements(t *testing.T) {
|
||||
|
||||
func TestNodeDrainCommand_Detach(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
server, client, url := testServer(t, true, func(c *agent.Config) {
|
||||
c.NodeName = "drain_detach_node"
|
||||
})
|
||||
@@ -72,7 +71,7 @@ func TestNodeDrainCommand_Detach(t *testing.T) {
|
||||
}
|
||||
|
||||
_, _, err := client.Jobs().Register(job, nil)
|
||||
require.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
testutil.WaitForResult(func() (bool, error) {
|
||||
allocs, _, err := client.Nodes().Allocations(nodeID, nil)
|
||||
@@ -92,16 +91,16 @@ func TestNodeDrainCommand_Detach(t *testing.T) {
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
expected := "drain strategy set"
|
||||
require.Contains(out, expected)
|
||||
must.StrContains(t, out, expected)
|
||||
|
||||
node, _, err := client.Nodes().Info(nodeID, nil)
|
||||
require.Nil(err)
|
||||
require.NotNil(node.DrainStrategy)
|
||||
must.NoError(t, err)
|
||||
must.NotNil(t, node.DrainStrategy)
|
||||
}
|
||||
|
||||
func TestNodeDrainCommand_Monitor(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
server, client, url := testServer(t, true, func(c *agent.Config) {
|
||||
c.NodeName = "drain_monitor_node"
|
||||
})
|
||||
@@ -161,7 +160,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
|
||||
}
|
||||
|
||||
_, _, err := client.Jobs().Register(job, nil)
|
||||
require.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Register a system job to ensure it is ignored during draining
|
||||
sysjob := &api.Job{
|
||||
@@ -191,7 +190,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
|
||||
}
|
||||
|
||||
_, _, err = client.Jobs().Register(sysjob, nil)
|
||||
require.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var allocs []*api.Allocation
|
||||
testutil.WaitForResult(func() (bool, error) {
|
||||
@@ -221,7 +220,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
|
||||
cmd := &NodeDrainCommand{Meta: Meta{Ui: ui}}
|
||||
args := []string{"-address=" + url, "-self", "-enable", "-deadline", "1s", "-ignore-system"}
|
||||
t.Logf("Running: %v", args)
|
||||
require.Zero(cmd.Run(args))
|
||||
must.Zero(t, cmd.Run(args))
|
||||
|
||||
out := outBuf.String()
|
||||
t.Logf("Output:\n%s", out)
|
||||
@@ -230,7 +229,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
|
||||
// monitor goroutines may start only after some or all the allocs have been
|
||||
// migrated.
|
||||
if !testutil.IsTravis() {
|
||||
require.Contains(out, "Drain complete for node")
|
||||
must.StrContains(t, out, "Drain complete for node")
|
||||
for _, a := range allocs {
|
||||
if *a.Job.Type == "system" {
|
||||
if strings.Contains(out, a.ID) {
|
||||
@@ -238,8 +237,8 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
|
||||
}
|
||||
continue
|
||||
}
|
||||
require.Contains(out, fmt.Sprintf("Alloc %q marked for migration", a.ID))
|
||||
require.Contains(out, fmt.Sprintf("Alloc %q draining", a.ID))
|
||||
must.StrContains(t, out, fmt.Sprintf("Alloc %q marked for migration", a.ID))
|
||||
must.StrContains(t, out, fmt.Sprintf("Alloc %q draining", a.ID))
|
||||
}
|
||||
|
||||
expected := fmt.Sprintf("All allocations on node %q have stopped\n", nodeID)
|
||||
@@ -252,16 +251,16 @@ func TestNodeDrainCommand_Monitor(t *testing.T) {
|
||||
outBuf.Reset()
|
||||
args = []string{"-address=" + url, "-self", "-monitor", "-ignore-system"}
|
||||
t.Logf("Running: %v", args)
|
||||
require.Zero(cmd.Run(args))
|
||||
must.Zero(t, cmd.Run(args))
|
||||
|
||||
out = outBuf.String()
|
||||
t.Logf("Output:\n%s", out)
|
||||
require.Contains(out, "No drain strategy set")
|
||||
must.StrContains(t, out, "No drain strategy set")
|
||||
}
|
||||
|
||||
func TestNodeDrainCommand_Monitor_NoDrainStrategy(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
server, client, url := testServer(t, true, func(c *agent.Config) {
|
||||
c.NodeName = "drain_monitor_node2"
|
||||
})
|
||||
@@ -298,7 +297,7 @@ func TestNodeDrainCommand_Monitor_NoDrainStrategy(t *testing.T) {
|
||||
out := outBuf.String()
|
||||
t.Logf("Output:\n%s", out)
|
||||
|
||||
require.Contains(out, "No drain strategy set")
|
||||
must.StrContains(t, out, "No drain strategy set")
|
||||
}
|
||||
|
||||
func TestNodeDrainCommand_Fails(t *testing.T) {
|
||||
@@ -417,7 +416,6 @@ func TestNodeDrainCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestNodeDrainCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -446,6 +444,6 @@ func TestNodeDrainCommand_AutocompleteArgs(t *testing.T) {
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(nodeID, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, nodeID, res[0])
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestNodeEligibilityCommand_Implements(t *testing.T) {
|
||||
@@ -95,7 +95,6 @@ func TestNodeEligibilityCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestNodeEligibilityCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -124,6 +123,6 @@ func TestNodeEligibilityCommand_AutocompleteArgs(t *testing.T) {
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(nodeID, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, nodeID, res[0])
|
||||
}
|
||||
|
||||
@@ -8,14 +8,13 @@ import (
|
||||
"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"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestNodePoolJobsListCommand_Run(t *testing.T) {
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestNodeStatusCommand_Implements(t *testing.T) {
|
||||
@@ -241,7 +241,6 @@ func TestNodeStatusCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestNodeStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -270,30 +269,29 @@ func TestNodeStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(nodeID, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, nodeID, res[0])
|
||||
}
|
||||
|
||||
func TestNodeStatusCommand_FormatDrain(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
node := &api.Node{}
|
||||
|
||||
assert.Equal("false", formatDrain(node))
|
||||
must.Eq(t, "false", formatDrain(node))
|
||||
|
||||
node.DrainStrategy = &api.DrainStrategy{}
|
||||
assert.Equal("true; no deadline", formatDrain(node))
|
||||
must.Eq(t, "true; no deadline", formatDrain(node))
|
||||
|
||||
node.DrainStrategy = &api.DrainStrategy{}
|
||||
node.DrainStrategy.Deadline = -1 * time.Second
|
||||
assert.Equal("true; force drain", formatDrain(node))
|
||||
must.Eq(t, "true; force drain", formatDrain(node))
|
||||
|
||||
// formatTime special cases Unix(0, 0), so increment by 1
|
||||
node.DrainStrategy = &api.DrainStrategy{}
|
||||
node.DrainStrategy.ForceDeadline = time.Unix(1, 0).UTC()
|
||||
assert.Equal("true; 1970-01-01T00:00:01Z deadline", formatDrain(node))
|
||||
must.Eq(t, "true; 1970-01-01T00:00:01Z deadline", formatDrain(node))
|
||||
|
||||
node.DrainStrategy.IgnoreSystemJobs = true
|
||||
assert.Equal("true; 1970-01-01T00:00:01Z deadline; ignoring system jobs", formatDrain(node))
|
||||
must.Eq(t, "true; 1970-01-01T00:00:01Z deadline; ignoring system jobs", formatDrain(node))
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// TestOperatorAPICommand_Paths asserts that the op api command normalizes
|
||||
@@ -45,11 +44,11 @@ func TestOperatorAPICommand_Paths(t *testing.T) {
|
||||
|
||||
// Assert that absolute paths are appended to the configured address
|
||||
exitCode := cmd.Run([]string{"-address=" + ts.URL, "/v1/jobs"})
|
||||
require.Zero(t, exitCode, buf.String())
|
||||
must.Zero(t, exitCode)
|
||||
|
||||
select {
|
||||
case hit := <-hits:
|
||||
require.Equal(t, expected, hit.String())
|
||||
must.Eq(t, expected, hit.String())
|
||||
case <-time.After(10 * time.Second):
|
||||
t.Fatalf("timed out waiting for hit")
|
||||
}
|
||||
@@ -59,11 +58,11 @@ func TestOperatorAPICommand_Paths(t *testing.T) {
|
||||
// Assert that full URLs are used as-is even if an invalid address is
|
||||
// set.
|
||||
exitCode = cmd.Run([]string{"-address=ftp://127.0.0.2:1", ts.URL + "/v1/jobs"})
|
||||
require.Zero(t, exitCode, buf.String())
|
||||
must.Zero(t, exitCode)
|
||||
|
||||
select {
|
||||
case hit := <-hits:
|
||||
require.Equal(t, expected, hit.String())
|
||||
must.Eq(t, expected, hit.String())
|
||||
case <-time.After(10 * time.Second):
|
||||
t.Fatalf("timed out waiting for hit")
|
||||
}
|
||||
@@ -73,11 +72,11 @@ func TestOperatorAPICommand_Paths(t *testing.T) {
|
||||
// Assert that URLs lacking a scheme are used even if an invalid
|
||||
// address is set.
|
||||
exitCode = cmd.Run([]string{"-address=ftp://127.0.0.2:1", ts.Listener.Addr().String() + "/v1/jobs"})
|
||||
require.Zero(t, exitCode, buf.String())
|
||||
must.Zero(t, exitCode)
|
||||
|
||||
select {
|
||||
case hit := <-hits:
|
||||
require.Equal(t, expected, hit.String())
|
||||
must.Eq(t, expected, hit.String())
|
||||
case <-time.After(10 * time.Second):
|
||||
t.Fatalf("timed out waiting for hit")
|
||||
}
|
||||
@@ -105,7 +104,7 @@ func TestOperatorAPICommand_Curl(t *testing.T) {
|
||||
"-H", "Some-Other-Header: ok",
|
||||
"/url",
|
||||
})
|
||||
require.Zero(t, exitCode, buf.String())
|
||||
must.Zero(t, exitCode)
|
||||
|
||||
expected := `curl \
|
||||
-X POST \
|
||||
@@ -113,7 +112,7 @@ func TestOperatorAPICommand_Curl(t *testing.T) {
|
||||
-H 'X-Nomad-Token: acl-token' \
|
||||
http://127.0.0.1:1/url?filter=this+%3D%3D+%22that%22+or+this+%21%3D+%22foo%22®ion=not+even+a+valid+region
|
||||
`
|
||||
require.Equal(t, expected, buf.String())
|
||||
must.Eq(t, expected, buf.String())
|
||||
}
|
||||
|
||||
func Test_pathToURL(t *testing.T) {
|
||||
@@ -192,13 +191,13 @@ func TestOperatorAPICommand_ContentLength(t *testing.T) {
|
||||
// Setup a temp file to act as stdin.
|
||||
input := []byte("test-input")
|
||||
fakeStdin, err := os.CreateTemp("", "fake-stdin")
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Remove(fakeStdin.Name())
|
||||
|
||||
_, err = fakeStdin.Write(input)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
_, err = fakeStdin.Seek(0, 0)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Override the package's Stdin variable for testing.
|
||||
Stdin = fakeStdin
|
||||
@@ -214,11 +213,11 @@ func TestOperatorAPICommand_ContentLength(t *testing.T) {
|
||||
|
||||
// Assert that a request has the expected content length.
|
||||
exitCode := cmd.Run([]string{"-address=" + ts.URL, "/v1/jobs"})
|
||||
require.Zero(t, exitCode, buf.String())
|
||||
must.Zero(t, exitCode)
|
||||
|
||||
select {
|
||||
case l := <-contentLength:
|
||||
require.Equal(t, len(input), l)
|
||||
must.Eq(t, len(input), l)
|
||||
case <-time.After(10 * time.Second):
|
||||
t.Fatalf("timed out waiting for request")
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestOperator_Autopilot_SetConfig_Implements(t *testing.T) {
|
||||
@@ -20,7 +20,7 @@ func TestOperator_Autopilot_SetConfig_Implements(t *testing.T) {
|
||||
|
||||
func TestOperatorAutopilotSetConfigCommand(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
s, _, addr := testServer(t, false, nil)
|
||||
defer s.Shutdown()
|
||||
|
||||
@@ -39,22 +39,23 @@ func TestOperatorAutopilotSetConfigCommand(t *testing.T) {
|
||||
}
|
||||
|
||||
code := c.Run(args)
|
||||
require.EqualValues(0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
output := strings.TrimSpace(ui.OutputWriter.String())
|
||||
require.Contains(output, "Configuration updated")
|
||||
must.StrContains(t, output, "Configuration updated")
|
||||
|
||||
client, err := c.Client()
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
conf, _, err := client.Operator().AutopilotGetConfiguration(nil)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
require.False(conf.CleanupDeadServers)
|
||||
require.EqualValues(99, conf.MaxTrailingLogs)
|
||||
require.EqualValues(3, conf.MinQuorum)
|
||||
require.EqualValues(123*time.Millisecond, conf.LastContactThreshold)
|
||||
require.EqualValues(123*time.Millisecond, conf.ServerStabilizationTime)
|
||||
require.True(conf.EnableRedundancyZones)
|
||||
require.True(conf.DisableUpgradeMigration)
|
||||
require.True(conf.EnableCustomUpgrades)
|
||||
must.False(t, conf.CleanupDeadServers)
|
||||
must.Eq(t, 99, conf.MaxTrailingLogs)
|
||||
must.Eq(t, 3, conf.MinQuorum)
|
||||
must.Eq(t, 123*time.Millisecond, conf.LastContactThreshold)
|
||||
must.Eq(t, 123*time.Millisecond, conf.ServerStabilizationTime)
|
||||
must.True(t, conf.EnableRedundancyZones)
|
||||
must.True(t, conf.DisableUpgradeMigration)
|
||||
must.True(t, conf.EnableCustomUpgrades)
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import (
|
||||
)
|
||||
|
||||
// NOTE: most of these tests cannot be run in parallel
|
||||
// TODO(shoenig): come back to this one
|
||||
|
||||
type testCase struct {
|
||||
name string
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestGossipKeyringGenerateCommand(t *testing.T) {
|
||||
@@ -17,17 +18,11 @@ func TestGossipKeyringGenerateCommand(t *testing.T) {
|
||||
ui := cli.NewMockUi()
|
||||
c := &OperatorGossipKeyringGenerateCommand{Meta: Meta{Ui: ui}}
|
||||
code := c.Run(nil)
|
||||
if code != 0 {
|
||||
t.Fatalf("bad: %d", code)
|
||||
}
|
||||
must.Zero(t, code)
|
||||
|
||||
output := ui.OutputWriter.String()
|
||||
result, err := base64.StdEncoding.DecodeString(output)
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 32, result)
|
||||
|
||||
if len(result) != 32 {
|
||||
t.Fatalf("bad: %#v", result)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestOperator_Raft_RemovePeers_Implements(t *testing.T) {
|
||||
@@ -18,7 +18,7 @@ func TestOperator_Raft_RemovePeers_Implements(t *testing.T) {
|
||||
|
||||
func TestOperator_Raft_RemovePeer(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
s, _, addr := testServer(t, false, nil)
|
||||
defer s.Shutdown()
|
||||
|
||||
@@ -32,21 +32,18 @@ func TestOperator_Raft_RemovePeer(t *testing.T) {
|
||||
t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String())
|
||||
}
|
||||
|
||||
assert.Contains(ui.ErrorWriter.String(), "cannot give both an address and id")
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "cannot give both an address and id")
|
||||
|
||||
// Neither address nor ID present
|
||||
args = args[:1]
|
||||
code = c.Run(args)
|
||||
if code != 1 {
|
||||
t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String())
|
||||
}
|
||||
|
||||
assert.Contains(ui.ErrorWriter.String(), "an address or id is required for the peer to remove")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "an address or id is required for the peer to remove")
|
||||
}
|
||||
|
||||
func TestOperator_Raft_RemovePeerAddress(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
s, _, addr := testServer(t, false, nil)
|
||||
defer s.Shutdown()
|
||||
|
||||
@@ -55,17 +52,15 @@ func TestOperator_Raft_RemovePeerAddress(t *testing.T) {
|
||||
args := []string{"-address=" + addr, "-peer-address=nope"}
|
||||
|
||||
code := c.Run(args)
|
||||
if code != 1 {
|
||||
t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String())
|
||||
}
|
||||
must.One(t, code)
|
||||
|
||||
// If we get this error, it proves we sent the address all they through.
|
||||
assert.Contains(ui.ErrorWriter.String(), "address \"nope\" was not found in the Raft configuration")
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "address \"nope\" was not found in the Raft configuration")
|
||||
}
|
||||
|
||||
func TestOperator_Raft_RemovePeerID(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
s, _, addr := testServer(t, false, nil)
|
||||
defer s.Shutdown()
|
||||
|
||||
@@ -74,10 +69,8 @@ func TestOperator_Raft_RemovePeerID(t *testing.T) {
|
||||
args := []string{"-address=" + addr, "-peer-id=nope"}
|
||||
|
||||
code := c.Run(args)
|
||||
if code != 1 {
|
||||
t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String())
|
||||
}
|
||||
must.One(t, code)
|
||||
|
||||
// If we get this error, it proves we sent the address all they through.
|
||||
assert.Contains(ui.ErrorWriter.String(), "id \"nope\" was not found in the Raft configuration")
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "id \"nope\" was not found in the Raft configuration")
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestOperatorSchedulerGetConfig_Run(t *testing.T) {
|
||||
@@ -23,28 +23,28 @@ func TestOperatorSchedulerGetConfig_Run(t *testing.T) {
|
||||
c := &OperatorSchedulerGetConfig{Meta: Meta{Ui: ui}}
|
||||
|
||||
// Run the command, so we get the default output and test this.
|
||||
require.EqualValues(t, 0, c.Run([]string{"-address=" + addr}))
|
||||
must.Zero(t, c.Run([]string{"-address=" + addr}))
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, "Scheduler Algorithm = binpack")
|
||||
require.Contains(t, s, "Preemption SysBatch Scheduler = false")
|
||||
must.StrContains(t, s, "Scheduler Algorithm = binpack")
|
||||
must.StrContains(t, s, "Preemption SysBatch Scheduler = false")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Request JSON output and test.
|
||||
require.EqualValues(t, 0, c.Run([]string{"-address=" + addr, "-json"}))
|
||||
must.Zero(t, c.Run([]string{"-address=" + addr, "-json"}))
|
||||
s = ui.OutputWriter.String()
|
||||
var js api.SchedulerConfiguration
|
||||
require.NoError(t, json.Unmarshal([]byte(s), &js))
|
||||
must.NoError(t, json.Unmarshal([]byte(s), &js))
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Request a template output and test.
|
||||
require.EqualValues(t, 0, c.Run([]string{"-address=" + addr, "-t='{{printf \"%s!!!\" .SchedulerConfig.SchedulerAlgorithm}}'"}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "binpack!!!")
|
||||
must.Zero(t, c.Run([]string{"-address=" + addr, "-t='{{printf \"%s!!!\" .SchedulerConfig.SchedulerAlgorithm}}'"}))
|
||||
must.StrContains(t, ui.OutputWriter.String(), "binpack!!!")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Test an unsupported flag.
|
||||
require.EqualValues(t, 1, c.Run([]string{"-address=" + addr, "-yaml"}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler get-config")
|
||||
must.One(t, c.Run([]string{"-address=" + addr, "-yaml"}))
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler get-config")
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestOperatorSchedulerSetConfig_Run(t *testing.T) {
|
||||
@@ -23,19 +23,19 @@ func TestOperatorSchedulerSetConfig_Run(t *testing.T) {
|
||||
c := &OperatorSchedulerSetConfig{Meta: Meta{Ui: ui}}
|
||||
|
||||
bootstrappedConfig, _, err := srv.APIClient().Operator().SchedulerGetConfiguration(nil)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, bootstrappedConfig.SchedulerConfig)
|
||||
must.NoError(t, err)
|
||||
must.NotNil(t, bootstrappedConfig.SchedulerConfig)
|
||||
|
||||
// Run the command with zero value and ensure the configuration does not
|
||||
// change.
|
||||
require.EqualValues(t, 0, c.Run([]string{"-address=" + addr}))
|
||||
must.Zero(t, c.Run([]string{"-address=" + addr}))
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Read the configuration again and test that nothing has changed which
|
||||
// ensures our empty flags are working correctly.
|
||||
nonModifiedConfig, _, err := srv.APIClient().Operator().SchedulerGetConfiguration(nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
schedulerConfigEquals(t, bootstrappedConfig.SchedulerConfig, nonModifiedConfig.SchedulerConfig)
|
||||
|
||||
// Modify every configuration parameter using the flags. This ensures the
|
||||
@@ -52,12 +52,12 @@ func TestOperatorSchedulerSetConfig_Run(t *testing.T) {
|
||||
"-preempt-sysbatch-scheduler=true",
|
||||
"-preempt-system-scheduler=false",
|
||||
}
|
||||
require.EqualValues(t, 0, c.Run(modifyingArgs))
|
||||
must.Zero(t, c.Run(modifyingArgs))
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, "Scheduler configuration updated!")
|
||||
must.StrContains(t, s, "Scheduler configuration updated!")
|
||||
|
||||
modifiedConfig, _, err := srv.APIClient().Operator().SchedulerGetConfiguration(nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
schedulerConfigEquals(t, &api.SchedulerConfiguration{
|
||||
SchedulerAlgorithm: "spread",
|
||||
PreemptionConfig: api.PreemptionConfig{
|
||||
@@ -76,36 +76,36 @@ func TestOperatorSchedulerSetConfig_Run(t *testing.T) {
|
||||
|
||||
// Make a Freudian slip with one of the flags to ensure the usage is
|
||||
// returned.
|
||||
require.EqualValues(t, 1, c.Run([]string{"-address=" + addr, "-pause-evil-broker=true"}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler set-config")
|
||||
must.One(t, c.Run([]string{"-address=" + addr, "-pause-evil-broker=true"}))
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler set-config")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Try updating the config using an incorrect check-index value.
|
||||
require.EqualValues(t, 1, c.Run([]string{
|
||||
must.One(t, c.Run([]string{
|
||||
"-address=" + addr,
|
||||
"-pause-eval-broker=false",
|
||||
"-check-index=1000000",
|
||||
}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "check-index 1000000 does not match does not match current state")
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "check-index 1000000 does not match does not match current state")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
|
||||
// Try updating the config using a correct check-index value.
|
||||
require.EqualValues(t, 0, c.Run([]string{
|
||||
must.Zero(t, c.Run([]string{
|
||||
"-address=" + addr,
|
||||
"-pause-eval-broker=false",
|
||||
"-check-index=" + strconv.FormatUint(modifiedConfig.SchedulerConfig.ModifyIndex, 10),
|
||||
}))
|
||||
require.Contains(t, ui.OutputWriter.String(), "Scheduler configuration updated!")
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Scheduler configuration updated!")
|
||||
ui.ErrorWriter.Reset()
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func schedulerConfigEquals(t *testing.T, expected, actual *api.SchedulerConfiguration) {
|
||||
require.Equal(t, expected.SchedulerAlgorithm, actual.SchedulerAlgorithm)
|
||||
require.Equal(t, expected.RejectJobRegistration, actual.RejectJobRegistration)
|
||||
require.Equal(t, expected.MemoryOversubscriptionEnabled, actual.MemoryOversubscriptionEnabled)
|
||||
require.Equal(t, expected.PauseEvalBroker, actual.PauseEvalBroker)
|
||||
require.Equal(t, expected.PreemptionConfig, actual.PreemptionConfig)
|
||||
must.Eq(t, expected.SchedulerAlgorithm, actual.SchedulerAlgorithm)
|
||||
must.Eq(t, expected.RejectJobRegistration, actual.RejectJobRegistration)
|
||||
must.Eq(t, expected.MemoryOversubscriptionEnabled, actual.MemoryOversubscriptionEnabled)
|
||||
must.Eq(t, expected.PauseEvalBroker, actual.PauseEvalBroker)
|
||||
must.Eq(t, expected.PreemptionConfig, actual.PreemptionConfig)
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/command/agent"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestOperatorSnapshotInspect_Works(t *testing.T) {
|
||||
@@ -24,7 +24,7 @@ func TestOperatorSnapshotInspect_Works(t *testing.T) {
|
||||
cmd := &OperatorSnapshotInspectCommand{Meta: Meta{Ui: ui}}
|
||||
|
||||
code := cmd.Run([]string{snapPath})
|
||||
require.Zero(t, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
output := ui.OutputWriter.String()
|
||||
for _, key := range []string{
|
||||
@@ -34,7 +34,7 @@ func TestOperatorSnapshotInspect_Works(t *testing.T) {
|
||||
"Term",
|
||||
"Version",
|
||||
} {
|
||||
require.Contains(t, output, key)
|
||||
must.StrContains(t, output, key)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,15 +47,15 @@ func TestOperatorSnapshotInspect_HandlesFailure(t *testing.T) {
|
||||
filepath.Join(tmpDir, "invalid.snap"),
|
||||
[]byte("invalid data"),
|
||||
0600)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
t.Run("not found", func(t *testing.T) {
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &OperatorSnapshotInspectCommand{Meta: Meta{Ui: ui}}
|
||||
|
||||
code := cmd.Run([]string{filepath.Join(tmpDir, "foo")})
|
||||
require.NotZero(t, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "no such file")
|
||||
must.Positive(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "no such file")
|
||||
})
|
||||
|
||||
t.Run("invalid file", func(t *testing.T) {
|
||||
@@ -63,8 +63,8 @@ func TestOperatorSnapshotInspect_HandlesFailure(t *testing.T) {
|
||||
cmd := &OperatorSnapshotInspectCommand{Meta: Meta{Ui: ui}}
|
||||
|
||||
code := cmd.Run([]string{filepath.Join(tmpDir, "invalid.snap")})
|
||||
require.NotZero(t, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "Error verifying snapshot")
|
||||
must.Positive(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Error verifying snapshot")
|
||||
})
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ func generateSnapshotFile(t *testing.T, prepare func(srv *agent.TestAgent, clien
|
||||
"--address=" + url,
|
||||
dest,
|
||||
})
|
||||
require.Zero(t, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
return dest
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"github.com/hashicorp/nomad/command/agent"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestOperatorSnapshotRestore_Works(t *testing.T) {
|
||||
@@ -44,7 +44,7 @@ job "snapshot-test-job" {
|
||||
cmd.JobGetter.testStdin = strings.NewReader(sampleJob)
|
||||
|
||||
code := cmd.Run([]string{"--address=" + url, "-detach", "-"})
|
||||
require.Zero(t, code)
|
||||
must.Zero(t, code)
|
||||
})
|
||||
|
||||
srv, _, url := testServer(t, false, func(c *agent.Config) {
|
||||
@@ -60,20 +60,20 @@ job "snapshot-test-job" {
|
||||
|
||||
// job is not found before restore
|
||||
j, err := srv.Agent.Server().State().JobByID(nil, structs.DefaultNamespace, "snapshot-test-job")
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, j)
|
||||
must.NoError(t, err)
|
||||
must.Nil(t, j)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &OperatorSnapshotRestoreCommand{Meta: Meta{Ui: ui}}
|
||||
|
||||
code := cmd.Run([]string{"--address=" + url, snapshotPath})
|
||||
require.Empty(t, ui.ErrorWriter.String())
|
||||
require.Zero(t, code)
|
||||
require.Contains(t, ui.OutputWriter.String(), "Snapshot Restored")
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Snapshot Restored")
|
||||
|
||||
foundJob, err := srv.Agent.Server().State().JobByID(nil, structs.DefaultNamespace, "snapshot-test-job")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "snapshot-test-job", foundJob.ID)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "snapshot-test-job", foundJob.ID)
|
||||
}
|
||||
|
||||
func TestOperatorSnapshotRestore_Fails(t *testing.T) {
|
||||
@@ -84,12 +84,12 @@ func TestOperatorSnapshotRestore_Fails(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Fails when specified file does not exist
|
||||
code = cmd.Run([]string{"/unicorns/leprechauns"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "no such file")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "no such file")
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/command/agent"
|
||||
"github.com/hashicorp/nomad/helper/snapshot"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestOperatorSnapshotSave_Works(t *testing.T) {
|
||||
@@ -39,15 +39,15 @@ func TestOperatorSnapshotSave_Works(t *testing.T) {
|
||||
"--address=" + url,
|
||||
dest,
|
||||
})
|
||||
require.Zero(t, code)
|
||||
require.Contains(t, ui.OutputWriter.String(), "State file written to "+dest)
|
||||
must.Zero(t, code)
|
||||
must.StrContains(t, ui.OutputWriter.String(), "State file written to "+dest)
|
||||
|
||||
f, err := os.Open(dest)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
meta, err := snapshot.Verify(f)
|
||||
require.NoError(t, err)
|
||||
require.NotZero(t, meta.Index)
|
||||
must.NoError(t, err)
|
||||
must.Positive(t, meta.Index)
|
||||
}
|
||||
|
||||
func TestOperatorSnapshotSave_Fails(t *testing.T) {
|
||||
@@ -58,12 +58,12 @@ func TestOperatorSnapshotSave_Fails(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Fails when specified file does not exist
|
||||
code = cmd.Run([]string{"/unicorns/leprechauns"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "no such file")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "no such file")
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/state"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestPluginStatusCommand_Implements(t *testing.T) {
|
||||
@@ -26,18 +26,18 @@ func TestPluginStatusCommand_Fails(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Contains(t, out, commandErrorText(cmd))
|
||||
must.StrContains(t, out, commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Test an unsupported plugin type.
|
||||
code = cmd.Run([]string{"-type=not-a-plugin"})
|
||||
require.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
|
||||
out = ui.ErrorWriter.String()
|
||||
require.Contains(t, out, "Unsupported plugin type: not-a-plugin")
|
||||
must.StrContains(t, out, "Unsupported plugin type: not-a-plugin")
|
||||
ui.ErrorWriter.Reset()
|
||||
}
|
||||
|
||||
@@ -57,13 +57,13 @@ func TestPluginStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
defer cleanup()
|
||||
ws := memdb.NewWatchSet()
|
||||
plug, err := s.CSIPluginByID(ws, id)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
prefix := plug.ID[:len(plug.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(t, 1, len(res))
|
||||
require.Equal(t, plug.ID, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, plug.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ import (
|
||||
"github.com/hashicorp/nomad/helper/uuid"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestQuotaDeleteCommand_Implements(t *testing.T) {
|
||||
@@ -60,7 +60,7 @@ func TestQuotaDeleteCommand_Good(t *testing.T) {
|
||||
// Create a quota to delete
|
||||
qs := testQuotaSpec()
|
||||
_, err := client.Quotas().Register(qs, nil)
|
||||
assert.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Delete a namespace
|
||||
if code := cmd.Run([]string{"-address=" + url, qs.Name}); code != 0 {
|
||||
@@ -68,13 +68,12 @@ func TestQuotaDeleteCommand_Good(t *testing.T) {
|
||||
}
|
||||
|
||||
quotas, _, err := client.Quotas().List(nil)
|
||||
assert.Nil(t, err)
|
||||
assert.Len(t, quotas, 0)
|
||||
must.NoError(t, err)
|
||||
must.SliceEmpty(t, quotas)
|
||||
}
|
||||
|
||||
func TestQuotaDeleteCommand_AutocompleteArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -85,14 +84,14 @@ func TestQuotaDeleteCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a quota
|
||||
qs := testQuotaSpec()
|
||||
_, err := client.Quotas().Register(qs, nil)
|
||||
assert.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
args := complete.Args{Last: "quot"}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Equal(1, len(res))
|
||||
assert.Equal(qs.Name, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, qs.Name, res[0])
|
||||
}
|
||||
|
||||
// testQuotaSpec returns a test quota specification
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestQuotaInitCommand_Implements(t *testing.T) {
|
||||
@@ -24,44 +24,44 @@ func TestQuotaInitCommand_Run_HCL(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Ensure we change the cwd back
|
||||
origDir, err := os.Getwd()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Chdir(origDir)
|
||||
|
||||
// Create a temp dir and change into it
|
||||
dir := t.TempDir()
|
||||
|
||||
err = os.Chdir(dir)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Works if the file doesn't exist
|
||||
code = cmd.Run([]string{})
|
||||
require.Empty(t, ui.ErrorWriter.String())
|
||||
require.Zero(t, code)
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
content, err := os.ReadFile(DefaultHclQuotaInitName)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultHclQuotaSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultHclQuotaSpec, string(content))
|
||||
|
||||
// Fails if the file exists
|
||||
code = cmd.Run([]string{})
|
||||
require.Contains(t, ui.ErrorWriter.String(), "exists")
|
||||
require.Equal(t, 1, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "exists")
|
||||
must.One(t, code)
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Works if file is passed
|
||||
code = cmd.Run([]string{"mytest.hcl"})
|
||||
require.Empty(t, ui.ErrorWriter.String())
|
||||
require.Zero(t, code)
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
content, err = os.ReadFile("mytest.hcl")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultHclQuotaSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultHclQuotaSpec, string(content))
|
||||
}
|
||||
|
||||
func TestQuotaInitCommand_Run_JSON(t *testing.T) {
|
||||
@@ -71,42 +71,42 @@ func TestQuotaInitCommand_Run_JSON(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Ensure we change the cwd back
|
||||
origDir, err := os.Getwd()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
defer os.Chdir(origDir)
|
||||
|
||||
// Create a temp dir and change into it
|
||||
dir := t.TempDir()
|
||||
|
||||
err = os.Chdir(dir)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Works if the file doesn't exist
|
||||
code = cmd.Run([]string{"-json"})
|
||||
require.Empty(t, ui.ErrorWriter.String())
|
||||
require.Zero(t, code)
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
content, err := os.ReadFile(DefaultJsonQuotaInitName)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultJsonQuotaSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultJsonQuotaSpec, string(content))
|
||||
|
||||
// Fails if the file exists
|
||||
code = cmd.Run([]string{"-json"})
|
||||
require.Contains(t, ui.ErrorWriter.String(), "exists")
|
||||
require.Equal(t, 1, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "exists")
|
||||
must.One(t, code)
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Works if file is passed
|
||||
code = cmd.Run([]string{"-json", "mytest.json"})
|
||||
require.Empty(t, ui.ErrorWriter.String())
|
||||
require.Zero(t, code)
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
content, err = os.ReadFile("mytest.json")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultJsonQuotaSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultJsonQuotaSpec, string(content))
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestQuotaListCommand_Implements(t *testing.T) {
|
||||
@@ -45,7 +45,6 @@ func TestQuotaListCommand_Fails(t *testing.T) {
|
||||
|
||||
func TestQuotaListCommand_List(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
// Create a server
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
@@ -57,7 +56,7 @@ func TestQuotaListCommand_List(t *testing.T) {
|
||||
// Create a quota
|
||||
qs := testQuotaSpec()
|
||||
_, err := client.Quotas().Register(qs, nil)
|
||||
assert.Nil(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// List should contain the new quota
|
||||
if code := cmd.Run([]string{"-address=" + url}); code != 0 {
|
||||
|
||||
@@ -11,12 +11,12 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestRecommendationApplyCommand_Run(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
testutil.WaitForResult(func() (bool, error) {
|
||||
@@ -47,9 +47,9 @@ func TestRecommendationApplyCommand_Run(t *testing.T) {
|
||||
// Register a test job to write a recommendation against.
|
||||
testJob := testJob("recommendation_apply")
|
||||
regResp, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
|
||||
require.Equal(0, registerCode)
|
||||
must.Zero(t, registerCode)
|
||||
|
||||
// Write a recommendation.
|
||||
rec := api.Recommendation{
|
||||
@@ -63,15 +63,15 @@ func TestRecommendationApplyCommand_Run(t *testing.T) {
|
||||
}
|
||||
recResp, _, err := client.Recommendations().Upsert(&rec, nil)
|
||||
if srv.Enterprise {
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Read the recommendation out to ensure it is there as a control on
|
||||
// later tests.
|
||||
recInfo, _, err := client.Recommendations().Info(recResp.ID, nil)
|
||||
require.NoError(err)
|
||||
require.NotNil(recInfo)
|
||||
must.NoError(t, err)
|
||||
must.NotNil(t, recInfo)
|
||||
} else {
|
||||
require.Error(err, "Nomad Enterprise only endpoint")
|
||||
must.ErrorContains(t, err, "Nomad Enterprise only endpoint")
|
||||
}
|
||||
|
||||
// Only perform the call if we are running enterprise tests. Otherwise the
|
||||
@@ -80,18 +80,18 @@ func TestRecommendationApplyCommand_Run(t *testing.T) {
|
||||
return
|
||||
}
|
||||
code := cmd.Run([]string{"-address=" + url, recResp.ID})
|
||||
require.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
// Perform an info call on the recommendation which should return not
|
||||
// found.
|
||||
recInfo, _, err := client.Recommendations().Info(recResp.ID, nil)
|
||||
require.Error(err, "not found")
|
||||
require.Nil(recInfo)
|
||||
must.ErrorContains(t, err, "not found")
|
||||
must.Nil(t, recInfo)
|
||||
|
||||
// Check the new jobspec to see if the resource value has changed.
|
||||
jobResp, _, err := client.Jobs().Info(*testJob.ID, nil)
|
||||
require.NoError(err)
|
||||
require.Equal(1, *jobResp.TaskGroups[0].Tasks[0].Resources.CPU)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, 1, *jobResp.TaskGroups[0].Tasks[0].Resources.CPU)
|
||||
}
|
||||
|
||||
func TestRecommendationApplyCommand_AutocompleteArgs(t *testing.T) {
|
||||
|
||||
@@ -7,19 +7,18 @@ import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/command/agent"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestRecommendationDismissCommand_Run(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
testutil.WaitForResult(func() (bool, error) {
|
||||
@@ -51,9 +50,9 @@ func TestRecommendationDismissCommand_Run(t *testing.T) {
|
||||
// Register a test job to write a recommendation against.
|
||||
testJob := testJob("recommendation_dismiss")
|
||||
regResp, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
|
||||
require.Equal(0, registerCode)
|
||||
must.Zero(t, registerCode)
|
||||
|
||||
// Write a recommendation.
|
||||
rec := api.Recommendation{
|
||||
@@ -67,15 +66,15 @@ func TestRecommendationDismissCommand_Run(t *testing.T) {
|
||||
}
|
||||
recResp, _, err := client.Recommendations().Upsert(&rec, nil)
|
||||
if srv.Enterprise {
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Read the recommendation out to ensure it is there as a control on
|
||||
// later tests.
|
||||
recInfo, _, err := client.Recommendations().Info(recResp.ID, nil)
|
||||
require.NoError(err)
|
||||
require.NotNil(recInfo)
|
||||
must.NoError(t, err)
|
||||
must.NotNil(t, recInfo)
|
||||
} else {
|
||||
require.Error(err, "Nomad Enterprise only endpoint")
|
||||
must.ErrorContains(t, err, "Nomad Enterprise only endpoint")
|
||||
}
|
||||
|
||||
// Only perform the call if we are running enterprise tests. Otherwise the
|
||||
@@ -84,15 +83,15 @@ func TestRecommendationDismissCommand_Run(t *testing.T) {
|
||||
return
|
||||
}
|
||||
code := cmd.Run([]string{"-address=" + url, recResp.ID})
|
||||
require.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(out, "Successfully dismissed recommendation")
|
||||
must.StrContains(t, out, "Successfully dismissed recommendation")
|
||||
|
||||
// Perform an info call on the recommendation which should return not
|
||||
// found.
|
||||
recInfo, _, err := client.Recommendations().Info(recResp.ID, nil)
|
||||
require.Error(err, "not found")
|
||||
require.Nil(recInfo)
|
||||
must.ErrorContains(t, err, "not found")
|
||||
must.Nil(t, recInfo)
|
||||
}
|
||||
|
||||
func TestRecommendationDismissCommand_AutocompleteArgs(t *testing.T) {
|
||||
@@ -114,12 +113,10 @@ func TestRecommendationDismissCommand_AutocompleteArgs(t *testing.T) {
|
||||
}
|
||||
|
||||
func testRecommendationAutocompleteCommand(t *testing.T, client *api.Client, srv *agent.TestAgent, cmd *RecommendationAutocompleteCommand) {
|
||||
require := require.New(t)
|
||||
|
||||
// Register a test job to write a recommendation against.
|
||||
testJob := testJob("recommendation_autocomplete")
|
||||
_, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Write a recommendation.
|
||||
rec := &api.Recommendation{
|
||||
@@ -133,9 +130,9 @@ func testRecommendationAutocompleteCommand(t *testing.T, client *api.Client, srv
|
||||
}
|
||||
rec, _, err = client.Recommendations().Upsert(rec, nil)
|
||||
if srv.Enterprise {
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
} else {
|
||||
require.Error(err, "Nomad Enterprise only endpoint")
|
||||
must.ErrorContains(t, err, "Nomad Enterprise only endpoint")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -144,6 +141,6 @@ func testRecommendationAutocompleteCommand(t *testing.T, client *api.Client, srv
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(1, len(res))
|
||||
require.Equal(rec.ID, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, rec.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -7,17 +7,16 @@ import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestRecommendationInfoCommand_Run(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
testutil.WaitForResult(func() (bool, error) {
|
||||
@@ -46,20 +45,20 @@ func TestRecommendationInfoCommand_Run(t *testing.T) {
|
||||
// Perform an initial call, which should return a not found error.
|
||||
code := cmd.Run([]string{"-address=" + url, "2c13f001-f5b6-ce36-03a5-e37afe160df5"})
|
||||
if srv.Enterprise {
|
||||
require.Equal(1, code)
|
||||
must.One(t, code)
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Contains(out, "Recommendation not found")
|
||||
must.StrContains(t, out, "Recommendation not found")
|
||||
} else {
|
||||
require.Equal(1, code)
|
||||
require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
}
|
||||
|
||||
// Register a test job to write a recommendation against.
|
||||
testJob := testJob("recommendation_info")
|
||||
regResp, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
|
||||
require.Equal(0, registerCode)
|
||||
must.Zero(t, registerCode)
|
||||
|
||||
// Write a recommendation.
|
||||
rec := api.Recommendation{
|
||||
@@ -73,21 +72,21 @@ func TestRecommendationInfoCommand_Run(t *testing.T) {
|
||||
}
|
||||
recResp, _, err := client.Recommendations().Upsert(&rec, nil)
|
||||
if srv.Enterprise {
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
} else {
|
||||
require.Error(err, "Nomad Enterprise only endpoint")
|
||||
must.ErrorContains(t, err, "Nomad Enterprise only endpoint")
|
||||
}
|
||||
|
||||
// Only perform the call if we are running enterprise tests. Otherwise the
|
||||
// recResp object will be nil.
|
||||
if srv.Enterprise {
|
||||
code = cmd.Run([]string{"-address=" + url, recResp.ID})
|
||||
require.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(out, "test-meta-entry")
|
||||
require.Contains(out, "p13")
|
||||
require.Contains(out, "1.13")
|
||||
require.Contains(out, recResp.ID)
|
||||
must.StrContains(t, out, "test-meta-entry")
|
||||
must.StrContains(t, out, "p13")
|
||||
must.StrContains(t, out, "1.13")
|
||||
must.StrContains(t, out, recResp.ID)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,13 +11,12 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestRecommendationListCommand_Run(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
srv, client, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
|
||||
@@ -31,20 +30,20 @@ func TestRecommendationListCommand_Run(t *testing.T) {
|
||||
// Perform an initial list, which should return zero results.
|
||||
code := cmd.Run([]string{"-address=" + url})
|
||||
if srv.Enterprise {
|
||||
require.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(out, "No recommendations found")
|
||||
must.StrContains(t, out, "No recommendations found")
|
||||
} else {
|
||||
require.Equal(1, code)
|
||||
require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
}
|
||||
|
||||
// Register a test job to write a recommendation against.
|
||||
testJob := testJob("recommendation_list")
|
||||
regResp, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
|
||||
require.Equal(0, registerCode)
|
||||
must.Zero(t, registerCode)
|
||||
|
||||
// Write a recommendation.
|
||||
rec := api.Recommendation{
|
||||
@@ -58,26 +57,26 @@ func TestRecommendationListCommand_Run(t *testing.T) {
|
||||
}
|
||||
_, _, err = client.Recommendations().Upsert(&rec, nil)
|
||||
if srv.Enterprise {
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
} else {
|
||||
require.Error(err, "Nomad Enterprise only endpoint")
|
||||
must.ErrorContains(t, err, "Nomad Enterprise only endpoint")
|
||||
}
|
||||
|
||||
// Perform a new list which should yield results.
|
||||
code = cmd.Run([]string{"-address=" + url})
|
||||
if srv.Enterprise {
|
||||
require.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(out, "ID")
|
||||
require.Contains(out, "Job")
|
||||
require.Contains(out, "Group")
|
||||
require.Contains(out, "Task")
|
||||
require.Contains(out, "Resource")
|
||||
require.Contains(out, "Value")
|
||||
require.Contains(out, "CPU")
|
||||
must.StrContains(t, out, "ID")
|
||||
must.StrContains(t, out, "Job")
|
||||
must.StrContains(t, out, "Group")
|
||||
must.StrContains(t, out, "Task")
|
||||
must.StrContains(t, out, "Resource")
|
||||
must.StrContains(t, out, "Value")
|
||||
must.StrContains(t, out, "CPU")
|
||||
} else {
|
||||
require.Equal(1, code)
|
||||
require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,7 +162,7 @@ func TestRecommendationListCommand_Sort(t *testing.T) {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
sortedRecs := recommendationList{r: tc.inputRecommendationList}
|
||||
sort.Sort(sortedRecs)
|
||||
assert.Equal(t, tc.expectedOutputList, sortedRecs.r, tc.name)
|
||||
must.Eq(t, tc.expectedOutputList, sortedRecs.r)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,12 +10,12 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/helper/pointer"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestScalingPolicyListCommand_Run(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
srv, client, url := testServer(t, false, nil)
|
||||
defer srv.Shutdown()
|
||||
|
||||
@@ -24,9 +24,9 @@ func TestScalingPolicyListCommand_Run(t *testing.T) {
|
||||
|
||||
// Perform an initial list, which should return zero results.
|
||||
code := cmd.Run([]string{"-address=" + url})
|
||||
require.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
out := ui.OutputWriter.String()
|
||||
require.Contains(out, "No policies found")
|
||||
must.StrContains(t, out, "No policies found")
|
||||
|
||||
// Generate two test jobs.
|
||||
jobs := []*api.Job{testJob("scaling_policy_list_1"), testJob("scaling_policy_list_2")}
|
||||
@@ -43,17 +43,17 @@ func TestScalingPolicyListCommand_Run(t *testing.T) {
|
||||
for _, job := range jobs {
|
||||
job.TaskGroups[0].Scaling = &scalingPolicy
|
||||
_, _, err := client.Jobs().Register(job, nil)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
|
||||
// Perform a new list which should yield results..
|
||||
code = cmd.Run([]string{"-address=" + url})
|
||||
require.Equal(0, code)
|
||||
must.Zero(t, code)
|
||||
out = ui.OutputWriter.String()
|
||||
require.Contains(out, "ID")
|
||||
require.Contains(out, "Enabled")
|
||||
require.Contains(out, "Type")
|
||||
require.Contains(out, "Target")
|
||||
require.Contains(out, "scaling_policy_list_1")
|
||||
require.Contains(out, "scaling_policy_list_2")
|
||||
must.StrContains(t, out, "ID")
|
||||
must.StrContains(t, out, "Enabled")
|
||||
must.StrContains(t, out, "Type")
|
||||
must.StrContains(t, out, "Target")
|
||||
must.StrContains(t, out, "scaling_policy_list_1")
|
||||
must.StrContains(t, out, "scaling_policy_list_2")
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func Test_formatScalingPolicyTarget(t *testing.T) {
|
||||
@@ -49,7 +49,7 @@ func Test_formatScalingPolicyTarget(t *testing.T) {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
actualOutput := formatScalingPolicyTarget(tc.inputMap)
|
||||
assert.Equal(t, tc.expectedOutput, actualOutput, tc.name)
|
||||
must.Eq(t, tc.expectedOutput, actualOutput)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,8 +13,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestServiceDeleteCommand_Run(t *testing.T) {
|
||||
@@ -42,7 +41,7 @@ func TestServiceDeleteCommand_Run(t *testing.T) {
|
||||
}
|
||||
return true, nil
|
||||
}, func(err error) {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
})
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
@@ -55,26 +54,26 @@ func TestServiceDeleteCommand_Run(t *testing.T) {
|
||||
|
||||
// Run the command without any arguments to ensure we are performing this
|
||||
// check.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url}))
|
||||
require.Contains(t, ui.ErrorWriter.String(),
|
||||
must.One(t, cmd.Run([]string{"-address=" + url}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(),
|
||||
"This command takes two arguments: <service_name> and <service_id>")
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Create an upsert some service registrations.
|
||||
serviceRegs := mock.ServiceRegistrations()
|
||||
assert.NoError(t,
|
||||
must.NoError(t,
|
||||
srv.Agent.Server().State().UpsertServiceRegistrations(structs.MsgTypeTestSetup, 10, serviceRegs))
|
||||
|
||||
// Detail the service within the default namespace as we need the ID.
|
||||
defaultNSService, _, err := client.Services().Get(serviceRegs[0].ServiceName, nil)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, defaultNSService, 1)
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 1, defaultNSService)
|
||||
|
||||
// Attempt to manually delete the service registration within the default
|
||||
// namespace.
|
||||
code := cmd.Run([]string{"-address=" + url, "service-discovery-nomad-delete", defaultNSService[0].ID})
|
||||
require.Equal(t, 0, code)
|
||||
require.Contains(t, ui.OutputWriter.String(), "Successfully deleted service registration")
|
||||
must.Zero(t, code)
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted service registration")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -83,15 +82,15 @@ func TestServiceDeleteCommand_Run(t *testing.T) {
|
||||
platformNSService, _, err := client.Services().Get(serviceRegs[1].ServiceName, &api.QueryOptions{
|
||||
Namespace: serviceRegs[1].Namespace},
|
||||
)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, platformNSService, 1)
|
||||
must.NoError(t, err)
|
||||
must.Len(t, 1, platformNSService)
|
||||
|
||||
// Attempt to manually delete the service registration within the platform
|
||||
// namespace.
|
||||
code = cmd.Run([]string{"-address=" + url, "-namespace=" + platformNSService[0].Namespace,
|
||||
"service-discovery-nomad-delete", platformNSService[0].ID})
|
||||
require.Equal(t, 0, code)
|
||||
require.Contains(t, ui.OutputWriter.String(), "Successfully deleted service registration")
|
||||
must.Zero(t, code)
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted service registration")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -5,6 +5,7 @@ package command
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -12,7 +13,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
@@ -36,7 +37,7 @@ func TestServiceInfoCommand_Run(t *testing.T) {
|
||||
}
|
||||
return true, nil
|
||||
}, func(err error) {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
})
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
@@ -49,8 +50,8 @@ func TestServiceInfoCommand_Run(t *testing.T) {
|
||||
|
||||
// Run the command without any arguments to ensure we are performing this
|
||||
// check.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url}))
|
||||
require.Contains(t, ui.ErrorWriter.String(),
|
||||
must.One(t, cmd.Run([]string{"-address=" + url}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(),
|
||||
"This command takes one argument: <service_name>")
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -61,9 +62,9 @@ func TestServiceInfoCommand_Run(t *testing.T) {
|
||||
|
||||
// Register that job.
|
||||
regResp, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
|
||||
require.Equal(t, 0, registerCode)
|
||||
must.Zero(t, registerCode)
|
||||
|
||||
// Reset the output writer, otherwise we will have additional information here.
|
||||
ui.OutputWriter.Reset()
|
||||
@@ -72,6 +73,8 @@ func TestServiceInfoCommand_Run(t *testing.T) {
|
||||
// therefore needs this wrapper to account for eventual service
|
||||
// registration. One this has completed, we can perform lookups without
|
||||
// similar wraps.
|
||||
//
|
||||
// TODO(shoenig) clean this up
|
||||
require.Eventually(t, func() bool {
|
||||
|
||||
defer ui.OutputWriter.Reset()
|
||||
@@ -83,25 +86,25 @@ func TestServiceInfoCommand_Run(t *testing.T) {
|
||||
|
||||
// Test each header and data entry.
|
||||
s := ui.OutputWriter.String()
|
||||
if !assert.Contains(t, s, "Job ID") {
|
||||
if !strings.Contains(s, "Job ID") {
|
||||
return false
|
||||
}
|
||||
if !assert.Contains(t, s, "Address") {
|
||||
if !strings.Contains(s, "Address") {
|
||||
return false
|
||||
}
|
||||
if !assert.Contains(t, s, "Node ID") {
|
||||
if !strings.Contains(s, "Node ID") {
|
||||
return false
|
||||
}
|
||||
if !assert.Contains(t, s, "Alloc ID") {
|
||||
if !strings.Contains(s, "Alloc ID") {
|
||||
return false
|
||||
}
|
||||
if !assert.Contains(t, s, "service-discovery-nomad-info") {
|
||||
if !strings.Contains(s, "service-discovery-nomad-info") {
|
||||
return false
|
||||
}
|
||||
if !assert.Contains(t, s, ":9999") {
|
||||
if !strings.Contains(s, ":9999") {
|
||||
return false
|
||||
}
|
||||
if !assert.Contains(t, s, "[foo,bar]") {
|
||||
if !strings.Contains(s, "[foo,bar]") {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
@@ -109,16 +112,16 @@ func TestServiceInfoCommand_Run(t *testing.T) {
|
||||
|
||||
// Perform a verbose lookup.
|
||||
code := cmd.Run([]string{"-address=" + url, "-verbose", "service-discovery-nomad-info"})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
// Test KV entries.
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, "Service Name = service-discovery-nomad-info")
|
||||
require.Contains(t, s, "Namespace = default")
|
||||
require.Contains(t, s, "Job ID = service-discovery-nomad-info")
|
||||
require.Contains(t, s, "Datacenter = dc1")
|
||||
require.Contains(t, s, "Address = :9999")
|
||||
require.Contains(t, s, "Tags = [foo,bar]")
|
||||
must.StrContains(t, s, "Service Name = service-discovery-nomad-info")
|
||||
must.StrContains(t, s, "Namespace = default")
|
||||
must.StrContains(t, s, "Job ID = service-discovery-nomad-info")
|
||||
must.StrContains(t, s, "Datacenter = dc1")
|
||||
must.StrContains(t, s, "Address = :9999")
|
||||
must.StrContains(t, s, "Tags = [foo,bar]")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
@@ -174,7 +177,7 @@ func Test_argsWithNewPageToken(t *testing.T) {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
actualOutput := argsWithNewPageToken(tc.inputOsArgs, tc.inputNextToken)
|
||||
require.Equal(t, tc.expectedOutput, actualOutput)
|
||||
must.Eq(t, tc.expectedOutput, actualOutput)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -36,7 +37,7 @@ func TestServiceListCommand_Run(t *testing.T) {
|
||||
}
|
||||
return true, nil
|
||||
}, func(err error) {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
})
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
@@ -49,8 +50,8 @@ func TestServiceListCommand_Run(t *testing.T) {
|
||||
|
||||
// Run the command with some random arguments to ensure we are performing
|
||||
// this check.
|
||||
require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "pretty-please"}))
|
||||
require.Contains(t, ui.ErrorWriter.String(), "This command takes no arguments")
|
||||
must.One(t, cmd.Run([]string{"-address=" + url, "pretty-please"}))
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "This command takes no arguments")
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
// Create a test job with a Nomad service.
|
||||
@@ -60,9 +61,9 @@ func TestServiceListCommand_Run(t *testing.T) {
|
||||
|
||||
// Register that job.
|
||||
regResp, _, err := client.Jobs().Register(testJob, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID)
|
||||
require.Equal(t, 0, registerCode)
|
||||
must.Zero(t, registerCode)
|
||||
|
||||
// Reset the output writer, otherwise we will have additional information here.
|
||||
ui.OutputWriter.Reset()
|
||||
@@ -71,6 +72,8 @@ func TestServiceListCommand_Run(t *testing.T) {
|
||||
// therefore needs this wrapper to account for eventual service
|
||||
// registration. One this has completed, we can perform lookups without
|
||||
// similar wraps.
|
||||
//
|
||||
// TODO(shoenig) clean this up
|
||||
require.Eventually(t, func() bool {
|
||||
|
||||
defer ui.OutputWriter.Reset()
|
||||
@@ -99,16 +102,16 @@ func TestServiceListCommand_Run(t *testing.T) {
|
||||
|
||||
// Perform a wildcard namespace lookup.
|
||||
code := cmd.Run([]string{"-address=" + url, "-namespace", "*"})
|
||||
require.Equal(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
// Test each header and data entry.
|
||||
s := ui.OutputWriter.String()
|
||||
require.Contains(t, s, "Service Name")
|
||||
require.Contains(t, s, "Namespace")
|
||||
require.Contains(t, s, "Tags")
|
||||
require.Contains(t, s, "service-discovery-nomad-list")
|
||||
require.Contains(t, s, "default")
|
||||
require.Contains(t, s, "[bar,foo]")
|
||||
must.StrContains(t, s, "Service Name")
|
||||
must.StrContains(t, s, "Namespace")
|
||||
must.StrContains(t, s, "Tags")
|
||||
must.StrContains(t, s, "service-discovery-nomad-list")
|
||||
must.StrContains(t, s, "default")
|
||||
must.StrContains(t, s, "[bar,foo]")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
ui.ErrorWriter.Reset()
|
||||
|
||||
@@ -7,13 +7,12 @@ import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/command/agent"
|
||||
"github.com/hashicorp/nomad/helper/pointer"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestSetupVaultCommand_Run(t *testing.T) {
|
||||
|
||||
@@ -15,13 +15,11 @@ import (
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestStatusCommand_Run_JobStatus(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -32,22 +30,20 @@ func TestStatusCommand_Run_JobStatus(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
j := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
|
||||
// Query to check the job status
|
||||
if code := cmd.Run([]string{"-address=" + url, j.ID}); code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d", code)
|
||||
}
|
||||
code := cmd.Run([]string{"-address=" + url, j.ID})
|
||||
must.Zero(t, code)
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
assert.Contains(out, j.ID)
|
||||
must.StrContains(t, out, j.ID)
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func TestStatusCommand_Run_JobStatus_MultiMatch(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
assert := assert.New(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
defer srv.Shutdown()
|
||||
@@ -60,22 +56,20 @@ func TestStatusCommand_Run_JobStatus_MultiMatch(t *testing.T) {
|
||||
j := mock.Job()
|
||||
j2 := mock.Job()
|
||||
j2.ID = fmt.Sprintf("%s-more", j.ID)
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1001, nil, j2))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1001, nil, j2))
|
||||
|
||||
// Query to check the job status
|
||||
if code := cmd.Run([]string{"-address=" + url, j.ID}); code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d", code)
|
||||
}
|
||||
code := cmd.Run([]string{"-address=" + url, j.ID})
|
||||
must.Zero(t, code)
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
assert.Contains(out, j.ID)
|
||||
must.StrContains(t, out, j.ID)
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func TestStatusCommand_Run_EvalStatus(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
ci.Parallel(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
@@ -87,7 +81,7 @@ func TestStatusCommand_Run_EvalStatus(t *testing.T) {
|
||||
// Create a fake eval
|
||||
state := srv.Agent.Server().State()
|
||||
eval := mock.Eval()
|
||||
assert.Nil(state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{eval}))
|
||||
must.NoError(t, state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{eval}))
|
||||
|
||||
// Query to check the eval status
|
||||
if code := cmd.Run([]string{"-address=" + url, eval.ID}); code != 0 {
|
||||
@@ -95,13 +89,12 @@ func TestStatusCommand_Run_EvalStatus(t *testing.T) {
|
||||
}
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
assert.Contains(out, eval.ID[:shortId])
|
||||
must.StrContains(t, out, eval.ID[:shortId])
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func TestStatusCommand_Run_NodeStatus(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
ci.Parallel(t)
|
||||
|
||||
// Start in dev mode so we get a node registration
|
||||
@@ -135,13 +128,12 @@ func TestStatusCommand_Run_NodeStatus(t *testing.T) {
|
||||
}
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
assert.Contains(out, "mynode")
|
||||
must.StrContains(t, out, "mynode")
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func TestStatusCommand_Run_AllocStatus(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
ci.Parallel(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
@@ -153,20 +145,18 @@ func TestStatusCommand_Run_AllocStatus(t *testing.T) {
|
||||
// Create a fake alloc
|
||||
state := srv.Agent.Server().State()
|
||||
alloc := mock.Alloc()
|
||||
assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{alloc}))
|
||||
must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{alloc}))
|
||||
|
||||
if code := cmd.Run([]string{"-address=" + url, alloc.ID}); code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d", code)
|
||||
}
|
||||
code := cmd.Run([]string{"-address=" + url, alloc.ID})
|
||||
must.Zero(t, code)
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
assert.Contains(out, alloc.ID[:shortId])
|
||||
must.StrContains(t, out, alloc.ID[:shortId])
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func TestStatusCommand_Run_DeploymentStatus(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
ci.Parallel(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
@@ -178,21 +168,19 @@ func TestStatusCommand_Run_DeploymentStatus(t *testing.T) {
|
||||
// Create a fake deployment
|
||||
state := srv.Agent.Server().State()
|
||||
deployment := mock.Deployment()
|
||||
assert.Nil(state.UpsertDeployment(1000, deployment))
|
||||
must.NoError(t, state.UpsertDeployment(1000, deployment))
|
||||
|
||||
// Query to check the deployment status
|
||||
if code := cmd.Run([]string{"-address=" + url, deployment.ID}); code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d", code)
|
||||
}
|
||||
code := cmd.Run([]string{"-address=" + url, deployment.ID})
|
||||
must.Zero(t, code)
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
assert.Contains(out, deployment.ID[:shortId])
|
||||
must.StrContains(t, out, deployment.ID[:shortId])
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func TestStatusCommand_Run_NoPrefix(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
ci.Parallel(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
@@ -204,21 +192,19 @@ func TestStatusCommand_Run_NoPrefix(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
job := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job))
|
||||
|
||||
// Query to check status
|
||||
if code := cmd.Run([]string{"-address=" + url}); code != 0 {
|
||||
t.Fatalf("expected exit 0, got: %d", code)
|
||||
}
|
||||
code := cmd.Run([]string{"-address=" + url})
|
||||
must.Zero(t, code)
|
||||
|
||||
out := ui.OutputWriter.String()
|
||||
assert.Contains(out, job.ID)
|
||||
must.StrContains(t, out, job.ID)
|
||||
|
||||
ui.OutputWriter.Reset()
|
||||
}
|
||||
|
||||
func TestStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
ci.Parallel(t)
|
||||
|
||||
srv, _, url := testServer(t, true, nil)
|
||||
@@ -230,14 +216,14 @@ func TestStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a fake job
|
||||
state := srv.Agent.Server().State()
|
||||
job := mock.Job()
|
||||
assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job))
|
||||
must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job))
|
||||
|
||||
prefix := job.ID[:len(job.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
assert.Contains(res, job.ID)
|
||||
must.SliceContains(t, res, job.ID)
|
||||
}
|
||||
|
||||
func TestStatusCommand_Run_HostNetwork(t *testing.T) {
|
||||
@@ -261,7 +247,7 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) {
|
||||
verbose: false,
|
||||
assertions: func(out string) {
|
||||
hostNetworksRegexpStr := `Host Networks\s+=\s+internal\n`
|
||||
require.Regexp(t, regexp.MustCompile(hostNetworksRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(hostNetworksRegexpStr), out)
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -274,10 +260,10 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) {
|
||||
verbose: true,
|
||||
assertions: func(out string) {
|
||||
verboseHostNetworksHeadRegexpStr := `Name\s+CIDR\s+Interface\s+ReservedPorts\n`
|
||||
require.Regexp(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out)
|
||||
|
||||
verboseHostNetworksBodyRegexpStr := `internal\s+127\.0\.0\.1/8\s+lo\s+<none>\n`
|
||||
require.Regexp(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -289,10 +275,10 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) {
|
||||
verbose: true,
|
||||
assertions: func(out string) {
|
||||
verboseHostNetworksHeadRegexpStr := `Name\s+CIDR\s+Interface\s+ReservedPorts\n`
|
||||
require.Regexp(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out)
|
||||
|
||||
verboseHostNetworksBodyRegexpStr := `public\s+10\.199\.0\.200/24\s+<none>\s+<none>\n`
|
||||
require.Regexp(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -305,10 +291,10 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) {
|
||||
verbose: true,
|
||||
assertions: func(out string) {
|
||||
verboseHostNetworksHeadRegexpStr := `Name\s+CIDR\s+Interface\s+ReservedPorts\n`
|
||||
require.Regexp(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out)
|
||||
|
||||
verboseHostNetworksBodyRegexpStr := `public\s+10\.199\.0\.200/24\s+<none>\s+8080,8081\n`
|
||||
require.Regexp(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
|
||||
must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -11,14 +11,14 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestCACreateCommand(t *testing.T) {
|
||||
testDir := t.TempDir()
|
||||
previousDirectory, err := os.Getwd()
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, os.Chdir(testDir))
|
||||
must.NoError(t, err)
|
||||
must.NoError(t, os.Chdir(testDir))
|
||||
defer os.Chdir(previousDirectory)
|
||||
|
||||
type testcase struct {
|
||||
@@ -35,9 +35,9 @@ func TestCACreateCommand(t *testing.T) {
|
||||
"nomad-agent-ca.pem",
|
||||
"nomad-agent-ca-key.pem",
|
||||
func(t *testing.T, cert *x509.Certificate) {
|
||||
require.Equal(t, 1825*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour))
|
||||
require.False(t, cert.PermittedDNSDomainsCritical)
|
||||
require.Len(t, cert.PermittedDNSDomains, 0)
|
||||
must.Eq(t, 1825*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour))
|
||||
must.False(t, cert.PermittedDNSDomainsCritical)
|
||||
must.SliceEmpty(t, cert.PermittedDNSDomains)
|
||||
},
|
||||
},
|
||||
{"ca custom domain",
|
||||
@@ -48,7 +48,7 @@ func TestCACreateCommand(t *testing.T) {
|
||||
"foo.com-agent-ca.pem",
|
||||
"foo.com-agent-ca-key.pem",
|
||||
func(t *testing.T, cert *x509.Certificate) {
|
||||
require.ElementsMatch(t, cert.PermittedDNSDomains, []string{"nomad", "foo.com", "localhost"})
|
||||
must.SliceContainsAll(t, cert.PermittedDNSDomains, []string{"nomad", "foo.com", "localhost"})
|
||||
},
|
||||
},
|
||||
{"ca options",
|
||||
@@ -65,14 +65,14 @@ func TestCACreateCommand(t *testing.T) {
|
||||
"foo-agent-ca.pem",
|
||||
"foo-agent-ca-key.pem",
|
||||
func(t *testing.T, cert *x509.Certificate) {
|
||||
require.Equal(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour))
|
||||
require.True(t, cert.PermittedDNSDomainsCritical)
|
||||
require.Len(t, cert.PermittedDNSDomains, 4)
|
||||
require.ElementsMatch(t, cert.PermittedDNSDomains, []string{"nomad", "foo", "localhost", "bar"})
|
||||
require.Equal(t, cert.Issuer.Organization, []string{"CustOrg"})
|
||||
require.Equal(t, cert.Issuer.OrganizationalUnit, []string{"CustOrgUnit"})
|
||||
require.Equal(t, cert.Issuer.Country, []string{"ZZ"})
|
||||
require.Contains(t, cert.Issuer.CommonName, "CustomCA")
|
||||
must.Eq(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour))
|
||||
must.True(t, cert.PermittedDNSDomainsCritical)
|
||||
must.Len(t, 4, cert.PermittedDNSDomains)
|
||||
must.SliceContainsAll(t, cert.PermittedDNSDomains, []string{"nomad", "foo", "localhost", "bar"})
|
||||
must.Eq(t, cert.Issuer.Organization, []string{"CustOrg"})
|
||||
must.Eq(t, cert.Issuer.OrganizationalUnit, []string{"CustOrgUnit"})
|
||||
must.Eq(t, cert.Issuer.Country, []string{"ZZ"})
|
||||
must.StrHasPrefix(t, "CustomCA", cert.Issuer.CommonName)
|
||||
},
|
||||
},
|
||||
{"ca custom date",
|
||||
@@ -82,7 +82,7 @@ func TestCACreateCommand(t *testing.T) {
|
||||
"nomad-agent-ca.pem",
|
||||
"nomad-agent-ca-key.pem",
|
||||
func(t *testing.T, cert *x509.Certificate) {
|
||||
require.Equal(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour))
|
||||
must.Eq(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour))
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -91,20 +91,20 @@ func TestCACreateCommand(t *testing.T) {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &TLSCACreateCommand{Meta: Meta{Ui: ui}}
|
||||
require.Equal(t, 0, cmd.Run(tc.args), ui.ErrorWriter.String())
|
||||
require.Equal(t, "", ui.ErrorWriter.String())
|
||||
must.Zero(t, cmd.Run(tc.args))
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
// is a valid key
|
||||
key := testutil.IsValidSigner(t, tc.keyPath)
|
||||
require.True(t, key)
|
||||
must.True(t, key)
|
||||
// is a valid ca expects the ca
|
||||
ca := testutil.IsValidCertificate(t, tc.caPath)
|
||||
require.True(t, ca.BasicConstraintsValid)
|
||||
require.Equal(t, x509.KeyUsageCertSign|x509.KeyUsageCRLSign|x509.KeyUsageDigitalSignature, ca.KeyUsage)
|
||||
require.True(t, ca.IsCA)
|
||||
require.Equal(t, ca.AuthorityKeyId, ca.SubjectKeyId)
|
||||
must.True(t, ca.BasicConstraintsValid)
|
||||
must.Eq(t, x509.KeyUsageCertSign|x509.KeyUsageCRLSign|x509.KeyUsageDigitalSignature, ca.KeyUsage)
|
||||
must.True(t, ca.IsCA)
|
||||
must.Eq(t, ca.AuthorityKeyId, ca.SubjectKeyId)
|
||||
tc.extraCheck(t, ca)
|
||||
require.NoError(t, os.Remove(tc.caPath))
|
||||
require.NoError(t, os.Remove(tc.keyPath))
|
||||
must.NoError(t, os.Remove(tc.caPath))
|
||||
must.NoError(t, os.Remove(tc.keyPath))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestTlsCertCreateCommand_InvalidArgs(t *testing.T) {
|
||||
@@ -48,12 +48,12 @@ func TestTlsCertCreateCommand_InvalidArgs(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &TLSCertCreateCommand{Meta: Meta{Ui: ui}}
|
||||
require.NotEqual(t, 0, cmd.Run(tc.args))
|
||||
must.Positive(t, cmd.Run(tc.args))
|
||||
got := ui.ErrorWriter.String()
|
||||
if tc.expectErr == "" {
|
||||
require.NotEmpty(t, got) // don't care
|
||||
must.NotNil(t, got)
|
||||
} else {
|
||||
require.Contains(t, got, tc.expectErr)
|
||||
must.StrContains(t, got, tc.expectErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -62,8 +62,8 @@ func TestTlsCertCreateCommand_InvalidArgs(t *testing.T) {
|
||||
func TestTlsCertCreateCommandDefaults_fileCreate(t *testing.T) {
|
||||
testDir := t.TempDir()
|
||||
previousDirectory, err := os.Getwd()
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, os.Chdir(testDir))
|
||||
must.NoError(t, err)
|
||||
must.NoError(t, os.Chdir(testDir))
|
||||
defer os.Chdir(previousDirectory)
|
||||
|
||||
ui := cli.NewMockUi()
|
||||
@@ -143,34 +143,34 @@ func TestTlsCertCreateCommandDefaults_fileCreate(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
require.True(t, t.Run(tc.name, func(t *testing.T) {
|
||||
must.True(t, t.Run(tc.name, func(t *testing.T) {
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &TLSCertCreateCommand{Meta: Meta{Ui: ui}}
|
||||
require.Equal(t, 0, cmd.Run(tc.args))
|
||||
require.Equal(t, tc.errOut, ui.ErrorWriter.String())
|
||||
must.Zero(t, cmd.Run(tc.args))
|
||||
must.Eq(t, tc.errOut, ui.ErrorWriter.String())
|
||||
|
||||
// is a valid cert expects the cert
|
||||
cert := testutil.IsValidCertificate(t, tc.certPath)
|
||||
require.Equal(t, tc.expectCN, cert.Subject.CommonName)
|
||||
require.True(t, cert.BasicConstraintsValid)
|
||||
require.Equal(t, x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment, cert.KeyUsage)
|
||||
must.Eq(t, tc.expectCN, cert.Subject.CommonName)
|
||||
must.True(t, cert.BasicConstraintsValid)
|
||||
must.Eq(t, x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment, cert.KeyUsage)
|
||||
switch tc.typ {
|
||||
case "server":
|
||||
require.Equal(t,
|
||||
must.Eq(t,
|
||||
[]x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},
|
||||
cert.ExtKeyUsage)
|
||||
case "client":
|
||||
require.Equal(t,
|
||||
must.Eq(t,
|
||||
[]x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},
|
||||
cert.ExtKeyUsage)
|
||||
case "cli":
|
||||
require.Equal(t,
|
||||
must.Eq(t,
|
||||
[]x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},
|
||||
cert.ExtKeyUsage)
|
||||
}
|
||||
require.False(t, cert.IsCA)
|
||||
require.Equal(t, tc.expectDNS, cert.DNSNames)
|
||||
require.Equal(t, tc.expectIP, cert.IPAddresses)
|
||||
must.False(t, cert.IsCA)
|
||||
must.Eq(t, tc.expectDNS, cert.DNSNames)
|
||||
must.Eq(t, tc.expectIP, cert.IPAddresses)
|
||||
}))
|
||||
}
|
||||
}
|
||||
@@ -310,7 +310,7 @@ func TestTlsRecordPreparation(t *testing.T) {
|
||||
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
require.True(t, t.Run(tc.name, func(t *testing.T) {
|
||||
must.True(t, t.Run(tc.name, func(t *testing.T) {
|
||||
var ipAddresses []net.IP
|
||||
for _, i := range tc.ipAddresses {
|
||||
if len(i) > 0 {
|
||||
@@ -319,11 +319,11 @@ func TestTlsRecordPreparation(t *testing.T) {
|
||||
}
|
||||
|
||||
ipAddresses, dnsNames, name, extKeyUsage, prefix := recordPreparation(tc.certType, tc.regionName, tc.domain, tc.dnsNames, ipAddresses)
|
||||
require.Equal(t, tc.expectedipAddresses, ipAddresses)
|
||||
require.Equal(t, tc.expectedDNSNames, dnsNames)
|
||||
require.Equal(t, tc.expectedName, name)
|
||||
require.Equal(t, tc.expectedextKeyUsage, extKeyUsage)
|
||||
require.Equal(t, tc.expectedPrefix, prefix)
|
||||
must.Eq(t, tc.expectedipAddresses, ipAddresses)
|
||||
must.Eq(t, tc.expectedDNSNames, dnsNames)
|
||||
must.Eq(t, tc.expectedName, name)
|
||||
must.Eq(t, tc.expectedextKeyUsage, extKeyUsage)
|
||||
must.Eq(t, tc.expectedPrefix, prefix)
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestCommand_Ui(t *testing.T) {
|
||||
@@ -102,13 +102,12 @@ func TestCommand_Ui(t *testing.T) {
|
||||
// Don't try to open a browser.
|
||||
args := append(tc.Args, "-show-url")
|
||||
|
||||
if code := cmd.Run(args); code != 0 {
|
||||
require.Equal(t, 0, code, "expected exit code 0, got %d", code)
|
||||
}
|
||||
code := cmd.Run(args)
|
||||
must.Zero(t, code)
|
||||
|
||||
got := ui.OutputWriter.String()
|
||||
expected := fmt.Sprintf("URL for web UI: %s", tc.ExpectedURL)
|
||||
require.Equal(t, expected, strings.TrimSpace(got))
|
||||
must.Eq(t, expected, strings.TrimSpace(got))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestVarGetCommand_Implements(t *testing.T) {
|
||||
@@ -28,18 +28,17 @@ func TestVarGetCommand_Fails(t *testing.T) {
|
||||
cmd := &VarGetCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d")
|
||||
require.Contains(t, out, commandErrorText(cmd), "expected help output, got: %s", out)
|
||||
must.One(t, code)
|
||||
must.StrContains(t, out, commandErrorText(cmd))
|
||||
})
|
||||
t.Run("bad_address", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &VarGetCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{"-address=nope", "foo"})
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d")
|
||||
require.Contains(t, ui.ErrorWriter.String(), "retrieving variable", "connection error, got: %s", out)
|
||||
require.Zero(t, ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "retrieving variable")
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
})
|
||||
t.Run("missing_template", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -47,9 +46,9 @@ func TestVarGetCommand_Fails(t *testing.T) {
|
||||
cmd := &VarGetCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-out=go-template`, "foo"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, errMissingTemplate+"\n"+commandErrorText(cmd), out)
|
||||
require.Zero(t, ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
must.Eq(t, errMissingTemplate+"\n"+commandErrorText(cmd), out)
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
})
|
||||
t.Run("unexpected_template", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -57,9 +56,9 @@ func TestVarGetCommand_Fails(t *testing.T) {
|
||||
cmd := &VarGetCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-out=json`, `-template="bad"`, "foo"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out)
|
||||
require.Zero(t, ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
must.Eq(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out)
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
})
|
||||
}
|
||||
|
||||
@@ -110,7 +109,7 @@ func TestVarGetCommand(t *testing.T) {
|
||||
// Create a namespace for the test case
|
||||
testNS := strings.Map(validNS, t.Name())
|
||||
_, err = client.Namespaces().Register(&api.Namespace{Name: testNS}, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
_, _ = client.Namespaces().Delete(testNS, nil)
|
||||
})
|
||||
@@ -119,7 +118,7 @@ func TestVarGetCommand(t *testing.T) {
|
||||
sv := testVariable()
|
||||
sv.Namespace = testNS
|
||||
sv, _, err = client.Variables().Create(sv, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
_, _ = client.Variables().Delete(sv.Path, nil)
|
||||
})
|
||||
@@ -143,22 +142,22 @@ func TestVarGetCommand(t *testing.T) {
|
||||
code := cmd.Run(args)
|
||||
|
||||
// Check the output
|
||||
require.Equal(t, tc.exitCode, code, "expected exit %v, got: %d; %v", tc.exitCode, code, ui.ErrorWriter.String())
|
||||
must.Eq(t, tc.exitCode, code)
|
||||
if tc.isError {
|
||||
require.Equal(t, tc.expected, strings.TrimSpace(ui.ErrorWriter.String()))
|
||||
must.Eq(t, tc.expected, strings.TrimSpace(ui.ErrorWriter.String()))
|
||||
return
|
||||
}
|
||||
switch tc.format {
|
||||
case "json":
|
||||
require.Equal(t, sv.AsPrettyJSON(), strings.TrimSpace(ui.OutputWriter.String()))
|
||||
must.Eq(t, sv.AsPrettyJSON(), strings.TrimSpace(ui.OutputWriter.String()))
|
||||
case "table":
|
||||
out := ui.OutputWriter.String()
|
||||
outs := strings.Split(out, "\n")
|
||||
require.Len(t, outs, 9)
|
||||
require.Equal(t, "Namespace = "+testNS, outs[0])
|
||||
require.Equal(t, "Path = test/var", outs[1])
|
||||
must.Len(t, 9, outs)
|
||||
must.Eq(t, "Namespace = "+testNS, outs[0])
|
||||
must.Eq(t, "Path = test/var", outs[1])
|
||||
case "go-template":
|
||||
require.Equal(t, tc.expected, strings.TrimSpace(ui.OutputWriter.String()))
|
||||
must.Eq(t, tc.expected, strings.TrimSpace(ui.OutputWriter.String()))
|
||||
default:
|
||||
t.Fatalf("invalid format: %q", tc.format)
|
||||
}
|
||||
@@ -173,7 +172,7 @@ func TestVarGetCommand(t *testing.T) {
|
||||
// Create a var
|
||||
testNS := strings.Map(validNS, t.Name())
|
||||
_, err := client.Namespaces().Register(&api.Namespace{Name: testNS}, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
_, _ = client.Namespaces().Delete(testNS, nil)
|
||||
})
|
||||
@@ -182,7 +181,7 @@ func TestVarGetCommand(t *testing.T) {
|
||||
sv.Path = "special/variable"
|
||||
sv.Namespace = testNS
|
||||
sv, _, err = client.Variables().Create(sv, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
t.Cleanup(func() {
|
||||
_, _ = client.Variables().Delete(sv.Path, nil)
|
||||
})
|
||||
@@ -191,8 +190,8 @@ func TestVarGetCommand(t *testing.T) {
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(t, 1, len(res))
|
||||
require.Equal(t, sv.Path, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, sv.Path, res[0])
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestVarInitCommand_Implements(t *testing.T) {
|
||||
@@ -22,9 +22,9 @@ func TestVarInitCommand_Run(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
dir := t.TempDir()
|
||||
origDir, err := os.Getwd()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
err = os.Chdir(dir)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
t.Cleanup(func() { os.Chdir(origDir) })
|
||||
|
||||
t.Run("hcl", func(t *testing.T) {
|
||||
@@ -35,41 +35,41 @@ func TestVarInitCommand_Run(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
ec := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, ec)
|
||||
require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
require.Empty(t, ui.OutputWriter.String())
|
||||
must.One(t, ec)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd))
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
reset(ui)
|
||||
|
||||
// Works if the file doesn't exist
|
||||
ec = cmd.Run([]string{"-out", "hcl"})
|
||||
require.Empty(t, ui.ErrorWriter.String())
|
||||
require.Equal(t, "Example variable specification written to spec.nv.hcl\n", ui.OutputWriter.String())
|
||||
require.Zero(t, ec)
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
must.Eq(t, "Example variable specification written to spec.nv.hcl\n", ui.OutputWriter.String())
|
||||
must.Zero(t, ec)
|
||||
reset(ui)
|
||||
t.Cleanup(func() { os.Remove(path.Join(dir, "spec.nv.hcl")) })
|
||||
|
||||
content, err := os.ReadFile(DefaultHclVarInitName)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultHclVarSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultHclVarSpec, string(content))
|
||||
|
||||
// Fails if the file exists
|
||||
ec = cmd.Run([]string{"-out", "hcl"})
|
||||
require.Contains(t, ui.ErrorWriter.String(), "exists")
|
||||
require.Empty(t, ui.OutputWriter.String())
|
||||
require.Equal(t, 1, ec)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "exists")
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
must.One(t, ec)
|
||||
reset(ui)
|
||||
|
||||
// Works if file is passed
|
||||
ec = cmd.Run([]string{"-out", "hcl", "myTest.hcl"})
|
||||
require.Empty(t, ui.ErrorWriter.String())
|
||||
require.Equal(t, "Example variable specification written to myTest.hcl\n", ui.OutputWriter.String())
|
||||
require.Zero(t, ec)
|
||||
must.Eq(t, "", ui.ErrorWriter.String())
|
||||
must.Eq(t, "Example variable specification written to myTest.hcl\n", ui.OutputWriter.String())
|
||||
must.Zero(t, ec)
|
||||
reset(ui)
|
||||
|
||||
t.Cleanup(func() { os.Remove(path.Join(dir, "myTest.hcl")) })
|
||||
content, err = os.ReadFile("myTest.hcl")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultHclVarSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultHclVarSpec, string(content))
|
||||
})
|
||||
t.Run("json", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -79,41 +79,41 @@ func TestVarInitCommand_Run(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
require.Contains(t, ui.ErrorWriter.String(), "This command takes no arguments or one")
|
||||
require.Empty(t, ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "This command takes no arguments or one")
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
reset(ui)
|
||||
|
||||
// Works if the file doesn't exist
|
||||
code = cmd.Run([]string{"-out", "json"})
|
||||
require.Contains(t, ui.ErrorWriter.String(), "REMINDER: While keys")
|
||||
require.Contains(t, ui.OutputWriter.String(), "Example variable specification written to spec.nv.json\n")
|
||||
require.Zero(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "REMINDER: While keys")
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Example variable specification written to spec.nv.json\n")
|
||||
must.Zero(t, code)
|
||||
reset(ui)
|
||||
|
||||
t.Cleanup(func() { os.Remove(path.Join(dir, "spec.nv.json")) })
|
||||
content, err := os.ReadFile(DefaultJsonVarInitName)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultJsonVarSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultJsonVarSpec, string(content))
|
||||
|
||||
// Fails if the file exists
|
||||
code = cmd.Run([]string{"-out", "json"})
|
||||
require.Contains(t, ui.ErrorWriter.String(), "exists")
|
||||
require.Empty(t, ui.OutputWriter.String())
|
||||
require.Equal(t, 1, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "exists")
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
reset(ui)
|
||||
|
||||
// Works if file is passed
|
||||
code = cmd.Run([]string{"-out", "json", "myTest.json"})
|
||||
require.Contains(t, ui.ErrorWriter.String(), "REMINDER: While keys")
|
||||
require.Contains(t, ui.OutputWriter.String(), "Example variable specification written to myTest.json\n")
|
||||
require.Zero(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "REMINDER: While keys")
|
||||
must.StrContains(t, ui.OutputWriter.String(), "Example variable specification written to myTest.json\n")
|
||||
must.Zero(t, code)
|
||||
reset(ui)
|
||||
|
||||
t.Cleanup(func() { os.Remove(path.Join(dir, "myTest.json")) })
|
||||
content, err = os.ReadFile("myTest.json")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, defaultJsonVarSpec, string(content))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, defaultJsonVarSpec, string(content))
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestVarListCommand_Implements(t *testing.T) {
|
||||
@@ -81,36 +80,29 @@ func TestVarListCommand_Offline(t *testing.T) {
|
||||
errOut := ui.ErrorWriter.String()
|
||||
defer resetUiWriters(ui)
|
||||
|
||||
require.Equal(t, tC.exitCode, ec,
|
||||
"Expected exit code %v; got: %v\nstdout: %s\nstderr: %s",
|
||||
tC.exitCode, ec, stdOut, errOut,
|
||||
)
|
||||
must.Eq(t, tC.exitCode, ec)
|
||||
if tC.expectUsage {
|
||||
help := cmd.Help()
|
||||
require.Equal(t, help, strings.TrimSpace(stdOut))
|
||||
must.Eq(t, help, strings.TrimSpace(stdOut))
|
||||
// Test that stdout ends with a linefeed since we trim them for
|
||||
// convenience in the equality tests.
|
||||
require.True(t, strings.HasSuffix(stdOut, "\n"),
|
||||
"stdout does not end with a linefeed")
|
||||
must.True(t, strings.HasSuffix(stdOut, "\n"))
|
||||
}
|
||||
if tC.expectUsageError {
|
||||
require.Contains(t, errOut, commandErrorText(cmd))
|
||||
must.StrContains(t, errOut, commandErrorText(cmd))
|
||||
}
|
||||
if tC.expectStdOut != "" {
|
||||
require.Equal(t, tC.expectStdOut, strings.TrimSpace(stdOut))
|
||||
must.Eq(t, tC.expectStdOut, strings.TrimSpace(stdOut))
|
||||
// Test that stdout ends with a linefeed since we trim them for
|
||||
// convenience in the equality tests.
|
||||
require.True(t, strings.HasSuffix(stdOut, "\n"),
|
||||
"stdout does not end with a linefeed")
|
||||
must.True(t, strings.HasSuffix(stdOut, "\n"))
|
||||
}
|
||||
if tC.expectStdErrPrefix != "" {
|
||||
require.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix),
|
||||
"Expected stderr to start with %q; got %s",
|
||||
tC.expectStdErrPrefix, errOut)
|
||||
must.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix))
|
||||
|
||||
// Test that stderr ends with a linefeed since we trim them for
|
||||
// convenience in the equality tests.
|
||||
require.True(t, strings.HasSuffix(errOut, "\n"),
|
||||
"stderr does not end with a linefeed")
|
||||
must.True(t, strings.HasSuffix(errOut, "\n"))
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -140,10 +132,10 @@ func TestVarListCommand_Online(t *testing.T) {
|
||||
|
||||
expect := expect
|
||||
exp, ok := expect.(NSPather)
|
||||
require.True(t, ok, "expect is not an NSPather, got %T", expect)
|
||||
must.True(t, ok)
|
||||
in, ok := check.(NSPather)
|
||||
require.True(t, ok, "check is not an NSPather, got %T", check)
|
||||
require.ElementsMatch(t, exp.NSPaths(), in.NSPaths())
|
||||
must.True(t, ok)
|
||||
must.Eq(t, exp.NSPaths(), in.NSPaths())
|
||||
}
|
||||
return out
|
||||
}
|
||||
@@ -153,11 +145,9 @@ func TestVarListCommand_Online(t *testing.T) {
|
||||
|
||||
length := length
|
||||
in, ok := check.(NSPather)
|
||||
require.True(t, ok, "check is not an NSPather, got %T", check)
|
||||
must.True(t, ok)
|
||||
inLen := in.NSPaths().Len()
|
||||
require.Equal(t, length, inLen,
|
||||
"expected length of %v, got %v. \nvalues: %v",
|
||||
length, inLen, in.NSPaths())
|
||||
must.Eq(t, length, inLen)
|
||||
}
|
||||
return out
|
||||
}
|
||||
@@ -285,34 +275,28 @@ func TestVarListCommand_Online(t *testing.T) {
|
||||
errOut := ui.ErrorWriter.String()
|
||||
defer resetUiWriters(ui)
|
||||
|
||||
require.Equal(t, tC.exitCode, code,
|
||||
"Expected exit code %v; got: %v\nstdout: %s\nstderr: %s",
|
||||
tC.exitCode, code, stdOut, errOut)
|
||||
must.Eq(t, tC.exitCode, code)
|
||||
|
||||
if tC.expectStdOut != "" {
|
||||
require.Equal(t, tC.expectStdOut, strings.TrimSpace(stdOut))
|
||||
must.Eq(t, tC.expectStdOut, strings.TrimSpace(stdOut))
|
||||
|
||||
// Test that stdout ends with a linefeed since we trim them for
|
||||
// convenience in the equality tests.
|
||||
require.True(t, strings.HasSuffix(stdOut, "\n"),
|
||||
"stdout does not end with a linefeed")
|
||||
must.True(t, strings.HasSuffix(stdOut, "\n"))
|
||||
}
|
||||
|
||||
if tC.expectStdErrPrefix != "" {
|
||||
require.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix),
|
||||
"Expected stderr to start with %q; got %s",
|
||||
tC.expectStdErrPrefix, errOut)
|
||||
must.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix))
|
||||
|
||||
// Test that stderr ends with a linefeed since this test only
|
||||
// considers prefixes.
|
||||
require.True(t, strings.HasSuffix(stdOut, "\n"),
|
||||
"stderr does not end with a linefeed")
|
||||
must.True(t, strings.HasSuffix(stdOut, "\n"))
|
||||
}
|
||||
|
||||
if tC.jsonTest != nil {
|
||||
jtC := tC.jsonTest
|
||||
err := json.Unmarshal([]byte(stdOut), &jtC.jsonDest)
|
||||
require.NoError(t, err, "stdout: %s", stdOut)
|
||||
must.NoError(t, err)
|
||||
|
||||
for _, fn := range jtC.expectFns {
|
||||
fn(t, jtC.jsonDest)
|
||||
|
||||
@@ -12,7 +12,6 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestVarLockCommand_Implements(t *testing.T) {
|
||||
@@ -99,7 +98,7 @@ func TestVarLockCommand_Good(t *testing.T) {
|
||||
|
||||
// Get the variable
|
||||
code := cmd.Run([]string{"-address=" + url, "test/var/shell", "touch ", filePath})
|
||||
require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
sv, _, err := srv.APIClient().Variables().Peek("test/var/shell", nil)
|
||||
must.NoError(t, err)
|
||||
@@ -133,7 +132,7 @@ func TestVarLockCommand_Good_NoShell(t *testing.T) {
|
||||
|
||||
// Get the variable
|
||||
code := cmd.Run([]string{"-address=" + url, "-shell=false", "test/var/noShell", "touch", filePath})
|
||||
require.Zero(t, 0, code)
|
||||
must.Zero(t, code)
|
||||
|
||||
sv, _, err := srv.APIClient().Variables().Peek("test/var/noShell", nil)
|
||||
must.NoError(t, err)
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestVarPurgeCommand_Implements(t *testing.T) {
|
||||
@@ -27,18 +27,17 @@ func TestVarPurgeCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d")
|
||||
require.Contains(t, out, commandErrorText(cmd), "expected help output, got: %s", out)
|
||||
must.One(t, code)
|
||||
must.StrContains(t, out, commandErrorText(cmd))
|
||||
})
|
||||
t.Run("bad_address", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
ui := cli.NewMockUi()
|
||||
cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{"-address=nope", "foo"})
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d")
|
||||
require.Contains(t, ui.ErrorWriter.String(), "purging variable", "connection error, got: %s", out)
|
||||
require.Zero(t, ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
must.StrContains(t, ui.ErrorWriter.String(), "purging variable")
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
})
|
||||
t.Run("bad_check_index/syntax", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -46,9 +45,9 @@ func TestVarPurgeCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-check-index=a`, "foo"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, `Invalid -check-index value "a": not parsable as uint64`, out)
|
||||
require.Zero(t, ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
must.Eq(t, `Invalid -check-index value "a": not parsable as uint64`, out)
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
})
|
||||
t.Run("bad_check_index/range", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -56,9 +55,9 @@ func TestVarPurgeCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-check-index=18446744073709551616`, "foo"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, `Invalid -check-index value "18446744073709551616": out of range for uint64`, out)
|
||||
require.Zero(t, ui.OutputWriter.String())
|
||||
must.One(t, code)
|
||||
must.Eq(t, `Invalid -check-index value "18446744073709551616": out of range for uint64`, out)
|
||||
must.Eq(t, "", ui.OutputWriter.String())
|
||||
})
|
||||
}
|
||||
|
||||
@@ -76,16 +75,16 @@ func TestVarPurgeCommand_Online(t *testing.T) {
|
||||
// Create a var to delete
|
||||
sv := testVariable()
|
||||
_, _, err := client.Variables().Create(sv, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
t.Cleanup(func() { _, _ = client.Variables().Delete(sv.Path, nil) })
|
||||
|
||||
// Delete the variable
|
||||
code := cmd.Run([]string{"-address=" + url, sv.Path})
|
||||
require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
vars, _, err := client.Variables().List(nil)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, vars, 0)
|
||||
must.NoError(t, err)
|
||||
must.SliceEmpty(t, vars)
|
||||
})
|
||||
|
||||
t.Run("unchecked", func(t *testing.T) {
|
||||
@@ -96,20 +95,20 @@ func TestVarPurgeCommand_Online(t *testing.T) {
|
||||
// Create a var to delete
|
||||
sv := testVariable()
|
||||
sv, _, err := client.Variables().Create(sv, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
// Delete a variable
|
||||
code := cmd.Run([]string{"-address=" + url, "-check-index=1", sv.Path})
|
||||
stderr := ui.ErrorWriter.String()
|
||||
require.Equal(t, 1, code, "expected exit 1, got: %d; %v", code, stderr)
|
||||
require.Contains(t, stderr, "\nCheck-and-Set conflict\n\n Your provided check-index (1)")
|
||||
must.One(t, code)
|
||||
must.StrContains(t, stderr, "\nCheck-and-Set conflict\n\n Your provided check-index (1)")
|
||||
|
||||
code = cmd.Run([]string{"-address=" + url, fmt.Sprintf("-check-index=%v", sv.ModifyIndex), sv.Path})
|
||||
require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
vars, _, err := client.Variables().List(nil)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, vars, 0)
|
||||
must.NoError(t, err)
|
||||
must.SliceEmpty(t, vars)
|
||||
})
|
||||
|
||||
t.Run("autocompleteArgs", func(t *testing.T) {
|
||||
@@ -121,14 +120,14 @@ func TestVarPurgeCommand_Online(t *testing.T) {
|
||||
sv := testVariable()
|
||||
sv.Path = "autocomplete/test"
|
||||
_, _, err := client.Variables().Create(sv, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
t.Cleanup(func() { client.Variables().Delete(sv.Path, nil) })
|
||||
|
||||
args := complete.Args{Last: "aut"}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(t, 1, len(res))
|
||||
require.Equal(t, sv.Path, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, sv.Path, res[0])
|
||||
})
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ import (
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestVarPutCommand_Implements(t *testing.T) {
|
||||
@@ -31,8 +30,8 @@ func TestVarPutCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPutCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{"-bad-flag"})
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d")
|
||||
require.Contains(t, out, commandErrorText(cmd), "expected help output, got: %s", out)
|
||||
must.One(t, code)
|
||||
must.StrContains(t, out, commandErrorText(cmd))
|
||||
})
|
||||
t.Run("bad_address", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -40,8 +39,8 @@ func TestVarPutCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPutCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{"-address=nope", "foo", "-"})
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d")
|
||||
require.Contains(t, out, "Error creating variable", "expected error creating variable, got: %s", out)
|
||||
must.One(t, code)
|
||||
must.StrContains(t, out, "Error creating variable")
|
||||
})
|
||||
t.Run("missing_template", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -49,8 +48,8 @@ func TestVarPutCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPutCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-out=go-template`, "foo", "-"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, errMissingTemplate+"\n"+commandErrorText(cmd), out)
|
||||
must.One(t, code)
|
||||
must.Eq(t, errMissingTemplate+"\n"+commandErrorText(cmd), out)
|
||||
})
|
||||
t.Run("unexpected_template", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -58,8 +57,8 @@ func TestVarPutCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPutCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-out=json`, `-template="bad"`, "foo", "-"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out)
|
||||
must.One(t, code)
|
||||
must.Eq(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out)
|
||||
})
|
||||
t.Run("bad_in", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -67,8 +66,8 @@ func TestVarPutCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPutCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-in=bad`, "foo", "-"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, errInvalidInFormat+"\n"+commandErrorText(cmd), out)
|
||||
must.One(t, code)
|
||||
must.Eq(t, errInvalidInFormat+"\n"+commandErrorText(cmd), out)
|
||||
})
|
||||
t.Run("wildcard_namespace", func(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
@@ -76,8 +75,8 @@ func TestVarPutCommand_Fails(t *testing.T) {
|
||||
cmd := &VarPutCommand{Meta: Meta{Ui: ui}}
|
||||
code := cmd.Run([]string{`-namespace=*`, "foo", "-"})
|
||||
out := strings.TrimSpace(ui.ErrorWriter.String())
|
||||
require.Equal(t, 1, code, "expected exit code 1, got: %d", code)
|
||||
require.Equal(t, errWildcardNamespaceNotAllowed, out)
|
||||
must.One(t, code)
|
||||
must.Eq(t, errWildcardNamespaceNotAllowed, out)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -93,7 +92,7 @@ func TestVarPutCommand_GoodJson(t *testing.T) {
|
||||
|
||||
// Get the variable
|
||||
code := cmd.Run([]string{"-address=" + url, "-out=json", "test/var", "k1=v1", "k2=v2"})
|
||||
require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String())
|
||||
must.Zero(t, code)
|
||||
|
||||
t.Cleanup(func() {
|
||||
_, _ = client.Variables().Delete("test/var", nil)
|
||||
@@ -102,10 +101,10 @@ func TestVarPutCommand_GoodJson(t *testing.T) {
|
||||
var outVar api.Variable
|
||||
b := ui.OutputWriter.Bytes()
|
||||
err := json.Unmarshal(b, &outVar)
|
||||
require.NoError(t, err, "error unmarshaling json: %v\nb: %s", err, b)
|
||||
require.Equal(t, "default", outVar.Namespace)
|
||||
require.Equal(t, "test/var", outVar.Path)
|
||||
require.Equal(t, api.VariableItems{"k1": "v1", "k2": "v2"}, outVar.Items)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, "default", outVar.Namespace)
|
||||
must.Eq(t, "test/var", outVar.Path)
|
||||
must.Eq(t, api.VariableItems{"k1": "v1", "k2": "v2"}, outVar.Items)
|
||||
}
|
||||
|
||||
func TestVarPutCommand_FlagsWithSpec(t *testing.T) {
|
||||
@@ -153,14 +152,14 @@ func TestVarPutCommand_AutocompleteArgs(t *testing.T) {
|
||||
// Create a var
|
||||
sv := testVariable()
|
||||
_, _, err := client.Variables().Create(sv, nil)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
args := complete.Args{Last: "t"}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(t, 1, len(res))
|
||||
require.Equal(t, sv.Path, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, sv.Path, res[0])
|
||||
}
|
||||
|
||||
func TestVarPutCommand_KeyWarning(t *testing.T) {
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"github.com/hashicorp/hcl"
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestVolumeDispatchParse(t *testing.T) {
|
||||
@@ -35,13 +35,12 @@ rando = "bar"
|
||||
for _, c := range cases {
|
||||
t.Run(c.hcl, func(t *testing.T) {
|
||||
_, s, err := parseVolumeType(c.hcl)
|
||||
require.Equal(t, c.t, s)
|
||||
must.Eq(t, c.t, s)
|
||||
if c.err == "" {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
} else {
|
||||
require.Contains(t, err.Error(), c.err)
|
||||
must.ErrorContains(t, err, c.err)
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -193,16 +192,14 @@ topology_request {
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
ast, err := hcl.ParseString(c.hcl)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
vol, err := csiDecodeVolume(ast)
|
||||
if c.err == "" {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
} else {
|
||||
require.Contains(t, err.Error(), c.err)
|
||||
must.ErrorContains(t, err, c.err)
|
||||
}
|
||||
require.Equal(t, c.expected, vol)
|
||||
|
||||
must.Eq(t, c.expected, vol)
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/mitchellh/cli"
|
||||
"github.com/posener/complete"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestCSIVolumeStatusCommand_Implements(t *testing.T) {
|
||||
@@ -26,10 +26,10 @@ func TestCSIVolumeStatusCommand_Fails(t *testing.T) {
|
||||
|
||||
// Fails on misuse
|
||||
code := cmd.Run([]string{"some", "bad", "args"})
|
||||
require.Equal(t, 1, code)
|
||||
must.One(t, code)
|
||||
|
||||
out := ui.ErrorWriter.String()
|
||||
require.Contains(t, out, commandErrorText(cmd))
|
||||
must.StrContains(t, out, commandErrorText(cmd))
|
||||
ui.ErrorWriter.Reset()
|
||||
}
|
||||
|
||||
@@ -50,13 +50,13 @@ func TestCSIVolumeStatusCommand_AutocompleteArgs(t *testing.T) {
|
||||
PluginID: "glade",
|
||||
}
|
||||
|
||||
require.NoError(t, state.UpsertCSIVolume(1000, []*structs.CSIVolume{vol}))
|
||||
must.NoError(t, state.UpsertCSIVolume(1000, []*structs.CSIVolume{vol}))
|
||||
|
||||
prefix := vol.ID[:len(vol.ID)-5]
|
||||
args := complete.Args{Last: prefix}
|
||||
predictor := cmd.AutocompleteArgs()
|
||||
|
||||
res := predictor.Predict(args)
|
||||
require.Equal(t, 1, len(res))
|
||||
require.Equal(t, vol.ID, res[0])
|
||||
must.Len(t, 1, res)
|
||||
must.Eq(t, vol.ID, res[0])
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Copyright (c) HashiCorp, Inc.
|
||||
// SPDX-License-Identifier: BUSL-1.1
|
||||
|
||||
//go:build linux
|
||||
|
||||
package docker
|
||||
|
||||
import (
|
||||
|
||||
2
go.mod
2
go.mod
@@ -118,7 +118,7 @@ require (
|
||||
github.com/shirou/gopsutil/v3 v3.23.9
|
||||
github.com/shoenig/go-landlock v1.2.0
|
||||
github.com/shoenig/go-m1cpu v0.1.6
|
||||
github.com/shoenig/test v1.7.0
|
||||
github.com/shoenig/test v1.7.1
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
|
||||
github.com/zclconf/go-cty v1.12.1
|
||||
|
||||
4
go.sum
4
go.sum
@@ -1012,8 +1012,8 @@ github.com/shoenig/go-landlock v1.2.0/go.mod h1:S848L96G6iny3xexNb4sXUrKwEDIy5ul
|
||||
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
|
||||
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
|
||||
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk=
|
||||
github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI=
|
||||
github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY=
|
||||
github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
|
||||
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
capi "github.com/hashicorp/consul/api"
|
||||
"github.com/hashicorp/nomad/api"
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
// consts copied from nomad/structs package to keep jobspec isolated from rest of nomad
|
||||
@@ -1921,14 +1921,14 @@ func TestParse(t *testing.T) {
|
||||
t.Logf("Testing parse: %s", tc.File)
|
||||
|
||||
path, err := filepath.Abs(filepath.Join("./test-fixtures", tc.File))
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
actual, err := ParseFile(path)
|
||||
if tc.Err {
|
||||
require.Error(t, err)
|
||||
must.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tc.Result, actual)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, tc.Result, actual)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1999,15 +1999,15 @@ func TestPortParsing(t *testing.T) {
|
||||
var job *api.Job
|
||||
|
||||
path, err = filepath.Abs(filepath.Join("./test-fixtures", "parse-ports.hcl"))
|
||||
require.NoError(t, err, "Can't get absolute path for file: parse-ports.hcl")
|
||||
must.NoError(t, err, must.Sprint("Can't get absolute path for file: parse-ports.hcl"))
|
||||
|
||||
job, err = ParseFile(path)
|
||||
require.NoError(t, err, "cannot parse job")
|
||||
require.NotNil(t, job)
|
||||
require.Len(t, job.TaskGroups, 1)
|
||||
require.Len(t, job.TaskGroups[0].Networks, 1)
|
||||
require.Len(t, job.TaskGroups[0].Networks[0].ReservedPorts, 1)
|
||||
require.Len(t, job.TaskGroups[0].Networks[0].DynamicPorts, 1)
|
||||
require.Equal(t, 9000, job.TaskGroups[0].Networks[0].ReservedPorts[0].Value)
|
||||
require.Equal(t, 0, job.TaskGroups[0].Networks[0].DynamicPorts[0].Value)
|
||||
must.NoError(t, err)
|
||||
must.NotNil(t, job)
|
||||
must.Len(t, 1, job.TaskGroups)
|
||||
must.Len(t, 1, job.TaskGroups[0].Networks)
|
||||
must.Len(t, 1, job.TaskGroups[0].Networks[0].ReservedPorts)
|
||||
must.Len(t, 1, job.TaskGroups[0].Networks[0].DynamicPorts)
|
||||
must.Eq(t, 9000, job.TaskGroups[0].Networks[0].ReservedPorts[0].Value)
|
||||
must.Eq(t, 0, job.TaskGroups[0].Networks[0].DynamicPorts[0].Value)
|
||||
}
|
||||
|
||||
@@ -11,14 +11,13 @@ import (
|
||||
"github.com/hashicorp/nomad/ci"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/shared/hclspec"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
"github.com/zclconf/go-cty/cty/msgpack"
|
||||
)
|
||||
|
||||
func TestBasePlugin_PluginInfo_GRPC(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
var (
|
||||
apiVersions = []string{"v0.1.0", "v0.1.1"}
|
||||
@@ -69,22 +68,20 @@ func TestBasePlugin_PluginInfo_GRPC(t *testing.T) {
|
||||
}
|
||||
|
||||
resp, err := impl.PluginInfo()
|
||||
require.NoError(err)
|
||||
require.Equal(apiVersions, resp.PluginApiVersions)
|
||||
require.Equal(pluginVersion, resp.PluginVersion)
|
||||
require.Equal(pluginName, resp.Name)
|
||||
require.Equal(PluginTypeDriver, resp.Type)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, apiVersions, resp.PluginApiVersions)
|
||||
must.Eq(t, pluginVersion, resp.PluginVersion)
|
||||
must.Eq(t, pluginName, resp.Name)
|
||||
must.Eq(t, PluginTypeDriver, resp.Type)
|
||||
|
||||
// Swap the implementation to return an unknown type
|
||||
mock.PluginInfoF = unknownType
|
||||
_, err = impl.PluginInfo()
|
||||
require.Error(err)
|
||||
require.Contains(err.Error(), "unknown type")
|
||||
must.ErrorContains(t, err, "unknown type")
|
||||
}
|
||||
|
||||
func TestBasePlugin_ConfigSchema(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
mock := &MockPlugin{
|
||||
ConfigSchemaF: func() (*hclspec.Spec, error) {
|
||||
@@ -99,23 +96,18 @@ func TestBasePlugin_ConfigSchema(t *testing.T) {
|
||||
defer client.Close()
|
||||
|
||||
raw, err := client.Dispense(PluginTypeBase)
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
must.NoError(t, err)
|
||||
|
||||
impl, ok := raw.(BasePlugin)
|
||||
if !ok {
|
||||
t.Fatalf("bad: %#v", raw)
|
||||
}
|
||||
must.True(t, ok)
|
||||
|
||||
specOut, err := impl.ConfigSchema()
|
||||
require.NoError(err)
|
||||
require.True(pb.Equal(TestSpec, specOut))
|
||||
must.NoError(t, err)
|
||||
must.True(t, pb.Equal(TestSpec, specOut))
|
||||
}
|
||||
|
||||
func TestBasePlugin_SetConfig(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
var receivedData []byte
|
||||
mock := &MockPlugin{
|
||||
@@ -138,29 +130,25 @@ func TestBasePlugin_SetConfig(t *testing.T) {
|
||||
defer client.Close()
|
||||
|
||||
raw, err := client.Dispense(PluginTypeBase)
|
||||
if err != nil {
|
||||
t.Fatalf("err: %s", err)
|
||||
}
|
||||
|
||||
must.NoError(t, err)
|
||||
impl, ok := raw.(BasePlugin)
|
||||
if !ok {
|
||||
t.Fatalf("bad: %#v", raw)
|
||||
}
|
||||
must.True(t, ok)
|
||||
|
||||
config := cty.ObjectVal(map[string]cty.Value{
|
||||
"foo": cty.StringVal("v1"),
|
||||
"bar": cty.NumberIntVal(1337),
|
||||
"baz": cty.BoolVal(true),
|
||||
})
|
||||
|
||||
cdata, err := msgpack.Marshal(config, config.Type())
|
||||
require.NoError(err)
|
||||
require.NoError(impl.SetConfig(&Config{PluginConfig: cdata}))
|
||||
require.Equal(cdata, receivedData)
|
||||
must.NoError(t, err)
|
||||
must.NoError(t, impl.SetConfig(&Config{PluginConfig: cdata}))
|
||||
must.Eq(t, cdata, receivedData)
|
||||
|
||||
// Decode the value back
|
||||
var actual TestConfig
|
||||
require.NoError(structs.Decode(receivedData, &actual))
|
||||
require.Equal("v1", actual.Foo)
|
||||
require.EqualValues(1337, actual.Bar)
|
||||
require.True(actual.Baz)
|
||||
must.NoError(t, structs.Decode(receivedData, &actual))
|
||||
must.Eq(t, "v1", actual.Foo)
|
||||
must.Eq(t, 1337, actual.Bar)
|
||||
must.True(t, actual.Baz)
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import (
|
||||
csipbv1 "github.com/container-storage-interface/spec/lib/go/csi"
|
||||
"github.com/golang/protobuf/ptypes/wrappers"
|
||||
"github.com/shoenig/test/must"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
@@ -102,10 +101,10 @@ func TestClient_RPC_PluginProbe(t *testing.T) {
|
||||
|
||||
resp, err := client.PluginProbe(context.TODO())
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.ExpectedResponse, resp)
|
||||
must.Eq(t, tc.ExpectedResponse, resp)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -156,11 +155,11 @@ func TestClient_RPC_PluginInfo(t *testing.T) {
|
||||
|
||||
name, version, err := client.PluginGetInfo(context.TODO())
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.ExpectedResponseName, name)
|
||||
require.Equal(t, tc.ExpectedResponseVersion, version)
|
||||
must.Eq(t, tc.ExpectedResponseName, name)
|
||||
must.Eq(t, tc.ExpectedResponseVersion, version)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -223,10 +222,10 @@ func TestClient_RPC_PluginGetCapabilities(t *testing.T) {
|
||||
|
||||
resp, err := client.PluginGetCapabilities(context.TODO())
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.ExpectedResponse, resp)
|
||||
must.Eq(t, tc.ExpectedResponse, resp)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -323,10 +322,10 @@ func TestClient_RPC_ControllerGetCapabilities(t *testing.T) {
|
||||
|
||||
resp, err := client.ControllerGetCapabilities(context.TODO())
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.ExpectedResponse, resp)
|
||||
must.Eq(t, tc.ExpectedResponse, resp)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -383,10 +382,10 @@ func TestClient_RPC_NodeGetCapabilities(t *testing.T) {
|
||||
|
||||
resp, err := client.NodeGetCapabilities(context.TODO())
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.ExpectedResponse, resp)
|
||||
must.Eq(t, tc.ExpectedResponse, resp)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -450,10 +449,10 @@ func TestClient_RPC_ControllerPublishVolume(t *testing.T) {
|
||||
|
||||
resp, err := client.ControllerPublishVolume(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.ExpectedResponse, resp)
|
||||
must.Eq(t, tc.ExpectedResponse, resp)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -498,10 +497,10 @@ func TestClient_RPC_ControllerUnpublishVolume(t *testing.T) {
|
||||
|
||||
resp, err := client.ControllerUnpublishVolume(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
}
|
||||
|
||||
require.Equal(t, tc.ExpectedResponse, resp)
|
||||
must.Eq(t, tc.ExpectedResponse, resp)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -723,9 +722,9 @@ func TestClient_RPC_ControllerValidateVolume(t *testing.T) {
|
||||
|
||||
err := client.ControllerValidateCapabilities(context.TODO(), req)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
} else {
|
||||
require.NoError(t, err, tc.Name)
|
||||
must.NoError(t, err, must.Sprint("name", tc.Name))
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -832,24 +831,24 @@ func TestClient_RPC_ControllerCreateVolume(t *testing.T) {
|
||||
|
||||
resp, err := client.ControllerCreateVolume(context.TODO(), req)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
return
|
||||
}
|
||||
require.NoError(t, err, tc.Name)
|
||||
must.NoError(t, err, must.Sprint("name", tc.Name))
|
||||
if tc.Response == nil {
|
||||
require.Nil(t, resp)
|
||||
must.Nil(t, resp)
|
||||
return
|
||||
}
|
||||
if tc.CapacityRange != nil {
|
||||
require.Greater(t, resp.Volume.CapacityBytes, int64(0))
|
||||
must.Greater(t, 0, resp.Volume.CapacityBytes)
|
||||
}
|
||||
if tc.ContentSource != nil {
|
||||
require.Equal(t, tc.ContentSource.CloneID, resp.Volume.ContentSource.CloneID)
|
||||
require.Equal(t, tc.ContentSource.SnapshotID, resp.Volume.ContentSource.SnapshotID)
|
||||
must.Eq(t, tc.ContentSource.CloneID, resp.Volume.ContentSource.CloneID)
|
||||
must.Eq(t, tc.ContentSource.SnapshotID, resp.Volume.ContentSource.SnapshotID)
|
||||
}
|
||||
if tc.Response != nil && tc.Response.Volume != nil {
|
||||
require.Len(t, resp.Volume.AccessibleTopology, 1)
|
||||
require.Equal(t,
|
||||
must.SliceLen(t, 1, resp.Volume.AccessibleTopology)
|
||||
must.Eq(t,
|
||||
req.AccessibilityRequirements.Requisite[0].Segments,
|
||||
resp.Volume.AccessibleTopology[0].Segments,
|
||||
)
|
||||
@@ -894,10 +893,10 @@ func TestClient_RPC_ControllerDeleteVolume(t *testing.T) {
|
||||
cc.NextErr = tc.ResponseErr
|
||||
err := client.ControllerDeleteVolume(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
return
|
||||
}
|
||||
require.NoError(t, err, tc.Name)
|
||||
must.NoError(t, err, must.Sprint("name", tc.Name))
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -987,11 +986,11 @@ func TestClient_RPC_ControllerListVolume(t *testing.T) {
|
||||
|
||||
resp, err := client.ControllerListVolumes(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
return
|
||||
}
|
||||
require.NoError(t, err, tc.Name)
|
||||
require.NotNil(t, resp)
|
||||
must.NoError(t, err, must.Sprint("name", tc.Name))
|
||||
must.NotNil(t, resp)
|
||||
|
||||
})
|
||||
}
|
||||
@@ -1054,11 +1053,11 @@ func TestClient_RPC_ControllerCreateSnapshot(t *testing.T) {
|
||||
// from protobuf to our struct
|
||||
resp, err := client.ControllerCreateSnapshot(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
} else {
|
||||
require.NoError(t, err, tc.Name)
|
||||
require.NotZero(t, resp.Snapshot.CreateTime)
|
||||
require.Equal(t, now.Second(), time.Unix(resp.Snapshot.CreateTime, 0).Second())
|
||||
must.NoError(t, err, must.Sprint("name", tc.Name))
|
||||
must.Positive(t, resp.Snapshot.CreateTime)
|
||||
must.Eq(t, now.Second(), time.Unix(resp.Snapshot.CreateTime, 0).Second())
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1099,10 +1098,10 @@ func TestClient_RPC_ControllerDeleteSnapshot(t *testing.T) {
|
||||
cc.NextErr = tc.ResponseErr
|
||||
err := client.ControllerDeleteSnapshot(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
return
|
||||
}
|
||||
require.NoError(t, err, tc.Name)
|
||||
must.NoError(t, err, must.Sprint("name", tc.Name))
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1162,14 +1161,14 @@ func TestClient_RPC_ControllerListSnapshots(t *testing.T) {
|
||||
|
||||
resp, err := client.ControllerListSnapshots(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
return
|
||||
}
|
||||
require.NoError(t, err, tc.Name)
|
||||
require.NotNil(t, resp)
|
||||
require.Len(t, resp.Entries, 1)
|
||||
require.NotZero(t, resp.Entries[0].Snapshot.CreateTime)
|
||||
require.Equal(t, now.Second(),
|
||||
must.NoError(t, err, must.Sprint("name", tc.Name))
|
||||
must.NotNil(t, resp)
|
||||
must.Len(t, 1, resp.Entries)
|
||||
must.Positive(t, resp.Entries[0].Snapshot.CreateTime)
|
||||
must.Eq(t, now.Second(),
|
||||
time.Unix(resp.Entries[0].Snapshot.CreateTime, 0).Second())
|
||||
})
|
||||
}
|
||||
@@ -1359,9 +1358,9 @@ func TestClient_RPC_NodeStageVolume(t *testing.T) {
|
||||
VolumeCapability: &VolumeCapability{},
|
||||
})
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
} else {
|
||||
require.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1398,9 +1397,9 @@ func TestClient_RPC_NodeUnstageVolume(t *testing.T) {
|
||||
|
||||
err := client.NodeUnstageVolume(context.TODO(), "foo", "/foo")
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
} else {
|
||||
require.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1456,9 +1455,9 @@ func TestClient_RPC_NodePublishVolume(t *testing.T) {
|
||||
|
||||
err := client.NodePublishVolume(context.TODO(), tc.Request)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
} else {
|
||||
require.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -1511,9 +1510,9 @@ func TestClient_RPC_NodeUnpublishVolume(t *testing.T) {
|
||||
|
||||
err := client.NodeUnpublishVolume(context.TODO(), tc.ExternalID, tc.TargetPath)
|
||||
if tc.ExpectedErr != nil {
|
||||
require.EqualError(t, err, tc.ExpectedErr.Error())
|
||||
must.EqError(t, err, tc.ExpectedErr.Error())
|
||||
} else {
|
||||
require.Nil(t, err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
@@ -20,7 +19,7 @@ import (
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
dproto "github.com/hashicorp/nomad/plugins/drivers/proto"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func ExecTaskStreamingConformanceTests(t *testing.T, driver *DriverHarness, taskID string) {
|
||||
@@ -121,30 +120,29 @@ func TestExecTaskStreamingBasicResponses(t *testing.T, driver *DriverHarness, ta
|
||||
|
||||
result := execTask(t, driver, taskID, c.Command, c.Tty, c.Stdin)
|
||||
|
||||
require.Equal(t, c.ExitCode, result.exitCode)
|
||||
must.Eq(t, c.ExitCode, result.exitCode)
|
||||
|
||||
switch s := c.Stdout.(type) {
|
||||
case string:
|
||||
require.Equal(t, s, result.stdout)
|
||||
must.Eq(t, s, result.stdout)
|
||||
case *regexp.Regexp:
|
||||
require.Regexp(t, s, result.stdout)
|
||||
must.RegexMatch(t, s, result.stdout)
|
||||
case nil:
|
||||
require.Empty(t, result.stdout)
|
||||
must.Eq(t, "", result.stdout)
|
||||
default:
|
||||
require.Fail(t, "unexpected stdout type", "found %v (%v), but expected string or regexp", s, reflect.TypeOf(s))
|
||||
t.Fatal("unexpected type")
|
||||
}
|
||||
|
||||
switch s := c.Stderr.(type) {
|
||||
case string:
|
||||
require.Equal(t, s, result.stderr)
|
||||
must.Eq(t, s, result.stderr)
|
||||
case *regexp.Regexp:
|
||||
require.Regexp(t, s, result.stderr)
|
||||
must.RegexMatch(t, s, result.stderr)
|
||||
case nil:
|
||||
require.Empty(t, result.stderr)
|
||||
must.Eq(t, "", result.stderr)
|
||||
default:
|
||||
require.Fail(t, "unexpected stderr type", "found %v (%v), but expected string or regexp", s, reflect.TypeOf(s))
|
||||
t.Fatal("unexpected type")
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -154,7 +152,7 @@ func TestExecTaskStreamingBasicResponses(t *testing.T, driver *DriverHarness, ta
|
||||
func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) {
|
||||
t.Run("isolation", func(t *testing.T) {
|
||||
caps, err := driver.Capabilities()
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
isolated := (caps.FSIsolation != drivers.FSIsolationNone)
|
||||
|
||||
@@ -164,7 +162,7 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) {
|
||||
w := execTask(t, driver, taskID,
|
||||
fmt.Sprintf(`FILE=$(mktemp); echo "$FILE"; echo %q >> "${FILE}"`, text),
|
||||
false, "")
|
||||
require.Zero(t, w.exitCode)
|
||||
must.Zero(t, w.exitCode)
|
||||
|
||||
tempfile := strings.TrimSpace(w.stdout)
|
||||
if !isolated {
|
||||
@@ -176,26 +174,26 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) {
|
||||
// read from host
|
||||
b, err := os.ReadFile(tempfile)
|
||||
if !isolated {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, text, strings.TrimSpace(string(b)))
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, text, strings.TrimSpace(string(b)))
|
||||
} else {
|
||||
require.Error(t, err)
|
||||
require.True(t, os.IsNotExist(err))
|
||||
must.Error(t, err)
|
||||
must.True(t, os.IsNotExist(err))
|
||||
}
|
||||
|
||||
// read should succeed from task again
|
||||
r := execTask(t, driver, taskID,
|
||||
fmt.Sprintf("cat %q", tempfile),
|
||||
false, "")
|
||||
require.Zero(t, r.exitCode)
|
||||
require.Equal(t, text, strings.TrimSpace(r.stdout))
|
||||
must.Zero(t, r.exitCode)
|
||||
must.Eq(t, text, strings.TrimSpace(r.stdout))
|
||||
|
||||
// we always run in a cgroup - testing freezer cgroup
|
||||
r = execTask(t, driver, taskID,
|
||||
"cat /proc/self/cgroup",
|
||||
false, "",
|
||||
)
|
||||
require.Zero(t, r.exitCode)
|
||||
must.Zero(t, r.exitCode)
|
||||
|
||||
switch cgroupslib.GetMode() {
|
||||
|
||||
@@ -214,7 +212,7 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) {
|
||||
}
|
||||
}
|
||||
if !ok {
|
||||
require.Fail(t, "unexpected freezer cgroup", "expected freezer to be /nomad/ or /docker/, but found:\n%s", r.stdout)
|
||||
t.Fatal("unexpected freezer cgroup")
|
||||
}
|
||||
case cgroupslib.CG2:
|
||||
info, _ := driver.PluginInfo()
|
||||
@@ -225,7 +223,7 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) {
|
||||
t.Skip("/proc/self/cgroup not useful in docker cgroups.v2")
|
||||
}
|
||||
// e.g. 0::/testing.slice/5bdbd6c2-8aba-3ab2-728b-0ff3a81727a9.sleep.scope
|
||||
require.True(t, strings.HasSuffix(strings.TrimSpace(r.stdout), ".scope"), "actual stdout %q", r.stdout)
|
||||
must.True(t, strings.HasSuffix(strings.TrimSpace(r.stdout), ".scope"), must.Sprintf("actual stdout %q", r.stdout))
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -249,27 +247,27 @@ func execTask(t *testing.T, driver *DriverHarness, taskID string, cmd string, tt
|
||||
isRaw = true
|
||||
err := raw.ExecTaskStreamingRaw(ctx, taskID,
|
||||
command, tty, stream)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
} else if d, ok := driver.impl.(drivers.ExecTaskStreamingDriver); ok {
|
||||
execOpts, errCh := drivers.StreamToExecOptions(ctx, command, tty, stream)
|
||||
|
||||
r, err := d.ExecTaskStreaming(ctx, taskID, execOpts)
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
|
||||
select {
|
||||
case err := <-errCh:
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
default:
|
||||
// all good
|
||||
}
|
||||
|
||||
exitCode = r.ExitCode
|
||||
} else {
|
||||
require.Fail(t, "driver does not support exec")
|
||||
t.Fatal("driver does not support exec")
|
||||
}
|
||||
|
||||
result := stream.currentResult()
|
||||
require.NoError(t, result.err)
|
||||
must.NoError(t, result.err)
|
||||
|
||||
if !isRaw {
|
||||
result.exitCode = exitCode
|
||||
|
||||
@@ -25,7 +25,7 @@ import (
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
"github.com/hashicorp/nomad/plugins/shared/hclspec"
|
||||
testing "github.com/mitchellh/go-testing-interface"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
type DriverHarness struct {
|
||||
@@ -55,7 +55,7 @@ func NewDriverHarness(t testing.T, d drivers.DriverPlugin) *DriverHarness {
|
||||
)
|
||||
|
||||
raw, err := client.Dispense(base.PluginTypeDriver)
|
||||
require.NoError(t, err, "failed to dispense plugin")
|
||||
must.NoError(t, err)
|
||||
|
||||
dClient := raw.(drivers.DriverPlugin)
|
||||
return &DriverHarness{
|
||||
@@ -80,21 +80,21 @@ func (h *DriverHarness) Kill() {
|
||||
// between tests.
|
||||
func (h *DriverHarness) MkAllocDir(t *drivers.TaskConfig, enableLogs bool) func() {
|
||||
dir, err := os.MkdirTemp("", "nomad_driver_harness-")
|
||||
require.NoError(h.t, err)
|
||||
must.NoError(h.t, err)
|
||||
|
||||
allocDir := allocdir.NewAllocDir(h.logger, dir, t.AllocID)
|
||||
require.NoError(h.t, allocDir.Build())
|
||||
must.NoError(h.t, allocDir.Build())
|
||||
|
||||
t.AllocDir = allocDir.AllocDir
|
||||
|
||||
taskDir := allocDir.NewTaskDir(t.Name)
|
||||
|
||||
caps, err := h.Capabilities()
|
||||
require.NoError(h.t, err)
|
||||
must.NoError(h.t, err)
|
||||
|
||||
fsi := caps.FSIsolation
|
||||
h.logger.Trace("FS isolation", "fsi", fsi)
|
||||
require.NoError(h.t, taskDir.Build(fsi == drivers.FSIsolationChroot, ci.TinyChroot))
|
||||
must.NoError(h.t, taskDir.Build(fsi == drivers.FSIsolationChroot, ci.TinyChroot))
|
||||
|
||||
task := &structs.Task{
|
||||
Name: t.Name,
|
||||
@@ -142,7 +142,7 @@ func (h *DriverHarness) MkAllocDir(t *drivers.TaskConfig, enableLogs bool) func(
|
||||
MaxFiles: 10,
|
||||
MaxFileSizeMB: 10,
|
||||
})
|
||||
require.NoError(h.t, err)
|
||||
must.NoError(h.t, err)
|
||||
|
||||
return func() {
|
||||
lm.Stop()
|
||||
|
||||
@@ -16,7 +16,7 @@ import (
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
pstructs "github.com/hashicorp/nomad/plugins/shared/structs"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
var _ drivers.DriverPlugin = (*MockDriver)(nil)
|
||||
@@ -34,8 +34,8 @@ func TestDriverHarness(t *testing.T) {
|
||||
harness := NewDriverHarness(t, d)
|
||||
defer harness.Kill()
|
||||
actual, _, err := harness.StartTask(&drivers.TaskConfig{})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, handle.Config.Name, actual.Config.Name)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, handle.Config.Name, actual.Config.Name)
|
||||
}
|
||||
|
||||
type testDriverState struct {
|
||||
@@ -45,7 +45,6 @@ type testDriverState struct {
|
||||
|
||||
func TestBaseDriver_Fingerprint(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
fingerprints := []*drivers.Fingerprint{
|
||||
{
|
||||
@@ -81,7 +80,7 @@ func TestBaseDriver_Fingerprint(t *testing.T) {
|
||||
defer harness.Kill()
|
||||
|
||||
ch, err := harness.Fingerprint(context.Background())
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(1)
|
||||
@@ -89,25 +88,24 @@ func TestBaseDriver_Fingerprint(t *testing.T) {
|
||||
defer wg.Done()
|
||||
select {
|
||||
case f := <-ch:
|
||||
require.Exactly(f, fingerprints[0])
|
||||
must.Eq(t, f, fingerprints[0])
|
||||
case <-time.After(1 * time.Second):
|
||||
require.Fail("did not receive fingerprint[0]")
|
||||
t.Fatal("did not receive fingerprint[0]")
|
||||
}
|
||||
select {
|
||||
case f := <-ch:
|
||||
require.Exactly(f, fingerprints[1])
|
||||
must.Eq(t, f, fingerprints[1])
|
||||
case <-time.After(1 * time.Second):
|
||||
require.Fail("did not receive fingerprint[1]")
|
||||
t.Fatal("did not receive fingerprint[1]")
|
||||
}
|
||||
}()
|
||||
require.False(complete.Load().(bool))
|
||||
must.False(t, complete.Load().(bool))
|
||||
wg.Wait()
|
||||
require.True(complete.Load().(bool))
|
||||
must.True(t, complete.Load().(bool))
|
||||
}
|
||||
|
||||
func TestBaseDriver_RecoverTask(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
// build driver state and encode it into proto msg
|
||||
state := testDriverState{Pid: 1, Log: "foo"}
|
||||
@@ -119,8 +117,8 @@ func TestBaseDriver_RecoverTask(t *testing.T) {
|
||||
impl := &MockDriver{
|
||||
RecoverTaskF: func(h *drivers.TaskHandle) error {
|
||||
var actual testDriverState
|
||||
require.NoError(h.GetDriverState(&actual))
|
||||
require.Equal(state, actual)
|
||||
must.NoError(t, h.GetDriverState(&actual))
|
||||
must.Eq(t, state, actual)
|
||||
return nil
|
||||
},
|
||||
}
|
||||
@@ -132,12 +130,11 @@ func TestBaseDriver_RecoverTask(t *testing.T) {
|
||||
DriverState: buf.Bytes(),
|
||||
}
|
||||
err := harness.RecoverTask(handle)
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestBaseDriver_StartTask(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
cfg := &drivers.TaskConfig{
|
||||
ID: "foo",
|
||||
@@ -157,19 +154,18 @@ func TestBaseDriver_StartTask(t *testing.T) {
|
||||
harness := NewDriverHarness(t, impl)
|
||||
defer harness.Kill()
|
||||
resp, _, err := harness.StartTask(cfg)
|
||||
require.NoError(err)
|
||||
require.Equal(cfg.ID, resp.Config.ID)
|
||||
require.Equal(handle.State, resp.State)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, cfg.ID, resp.Config.ID)
|
||||
must.Eq(t, handle.State, resp.State)
|
||||
|
||||
var actualState testDriverState
|
||||
require.NoError(resp.GetDriverState(&actualState))
|
||||
require.Equal(*state, actualState)
|
||||
must.NoError(t, resp.GetDriverState(&actualState))
|
||||
must.Eq(t, *state, actualState)
|
||||
|
||||
}
|
||||
|
||||
func TestBaseDriver_WaitTask(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
result := &drivers.ExitResult{ExitCode: 1, Signal: 9}
|
||||
|
||||
@@ -194,20 +190,19 @@ func TestBaseDriver_WaitTask(t *testing.T) {
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ch, err := harness.WaitTask(context.TODO(), "foo")
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
actualResult := <-ch
|
||||
finished = true
|
||||
require.Exactly(result, actualResult)
|
||||
must.Eq(t, result, actualResult)
|
||||
}()
|
||||
require.False(finished)
|
||||
must.False(t, finished)
|
||||
close(signalTask)
|
||||
wg.Wait()
|
||||
require.True(finished)
|
||||
must.True(t, finished)
|
||||
}
|
||||
|
||||
func TestBaseDriver_TaskEvents(t *testing.T) {
|
||||
ci.Parallel(t)
|
||||
require := require.New(t)
|
||||
|
||||
now := time.Now().UTC().Truncate(time.Millisecond)
|
||||
events := []*drivers.TaskEvent{
|
||||
@@ -254,14 +249,14 @@ func TestBaseDriver_TaskEvents(t *testing.T) {
|
||||
defer harness.Kill()
|
||||
|
||||
ch, err := harness.TaskEvents(context.Background())
|
||||
require.NoError(err)
|
||||
must.NoError(t, err)
|
||||
|
||||
for _, event := range events {
|
||||
select {
|
||||
case actual := <-ch:
|
||||
require.Exactly(actual, event)
|
||||
must.Eq(t, actual, event)
|
||||
case <-time.After(500 * time.Millisecond):
|
||||
require.Fail("failed to receive event")
|
||||
t.Fatal("failed to receive event")
|
||||
|
||||
}
|
||||
}
|
||||
@@ -291,6 +286,6 @@ func TestBaseDriver_Capabilities(t *testing.T) {
|
||||
defer harness.Kill()
|
||||
|
||||
caps, err := harness.Capabilities()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, capabilities, caps)
|
||||
must.NoError(t, err)
|
||||
must.Eq(t, capabilities, caps)
|
||||
}
|
||||
|
||||
@@ -9,8 +9,7 @@ import (
|
||||
"github.com/hashicorp/nomad/helper/uuid"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers/proto"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestResourceUsageRoundTrip(t *testing.T) {
|
||||
@@ -36,8 +35,7 @@ func TestResourceUsageRoundTrip(t *testing.T) {
|
||||
}
|
||||
|
||||
parsed := resourceUsageFromProto(resourceUsageToProto(input))
|
||||
|
||||
require.EqualValues(t, parsed, input)
|
||||
must.Eq(t, parsed, input)
|
||||
}
|
||||
|
||||
func TestTaskConfigRoundTrip(t *testing.T) {
|
||||
@@ -109,8 +107,7 @@ func TestTaskConfigRoundTrip(t *testing.T) {
|
||||
}
|
||||
|
||||
parsed := taskConfigFromProto(taskConfigToProto(input))
|
||||
|
||||
require.EqualValues(t, input, parsed)
|
||||
must.Eq(t, input, parsed)
|
||||
|
||||
}
|
||||
|
||||
@@ -140,7 +137,7 @@ func Test_networkCreateRequestFromProto(t *testing.T) {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
actualOutput := networkCreateRequestFromProto(tc.inputPB)
|
||||
assert.Equal(t, tc.expectedOutput, actualOutput, tc.name)
|
||||
must.Eq(t, tc.expectedOutput, actualOutput)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/nomad/helper/pointer"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/shoenig/test/must"
|
||||
)
|
||||
|
||||
func TestAttribute_Validate(t *testing.T) {
|
||||
@@ -77,7 +77,7 @@ func TestAttribute_Validate(t *testing.T) {
|
||||
for _, c := range cases {
|
||||
t.Run(c.Input.GoString(), func(t *testing.T) {
|
||||
if err := c.Input.Validate(); err != nil && !c.Fail {
|
||||
require.NoError(t, err)
|
||||
must.NoError(t, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -538,7 +538,7 @@ func testComparison(t *testing.T, cases []*compareTestCase) {
|
||||
if !ok && !c.NotComparable {
|
||||
t.Fatal("should be comparable")
|
||||
} else if ok {
|
||||
require.Equal(t, c.Expected, v)
|
||||
must.Eq(t, c.Expected, v)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -662,8 +662,8 @@ func TestAttribute_ParseAndValidate(t *testing.T) {
|
||||
for _, c := range cases {
|
||||
t.Run(c.Input, func(t *testing.T) {
|
||||
a := ParseAttribute(c.Input)
|
||||
require.Equal(t, c.Expected, a)
|
||||
require.NoError(t, a.Validate())
|
||||
must.Eq(t, c.Expected, a)
|
||||
must.NoError(t, a.Validate())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user