diff --git a/nomad/deployment_endpoint_test.go b/nomad/deployment_endpoint_test.go index 35c8d1fc8..88b85620d 100644 --- a/nomad/deployment_endpoint_test.go +++ b/nomad/deployment_endpoint_test.go @@ -622,250 +622,6 @@ func TestDeploymentEndpoint_Promote_ACL(t *testing.T) { } } -func TestDeploymentEndpoint_Cancel(t *testing.T) { - t.Parallel() - - s1, cleanupS1 := TestServer(t, func(c *Config) { - c.NumSchedulers = 0 // Prevent automatic dequeue - }) - defer cleanupS1() - codec := rpcClient(t, s1) - testutil.WaitForLeader(t, s1.RPC) - assert := assert.New(t) - - // Create the deployment - j := mock.Job() - d := mock.Deployment() - d.JobID = j.ID - state := s1.fsm.State() - - assert.Nil(state.UpsertJob(999, j), "UpsertJob") - assert.Nil(state.UpsertDeployment(1000, d), "UpsertDeployment") - - // Mark the deployment as failed - req := &structs.DeploymentCancelRequest{ - DeploymentID: d.ID, - WriteRequest: structs.WriteRequest{Region: "global"}, - } - - // Fetch the response - var resp structs.DeploymentUpdateResponse - assert.Nil(msgpackrpc.CallWithCodec(codec, "Deployment.Cancel", req, &resp), "RPC") - assert.NotEqual(resp.Index, uint64(0), "bad response index") - - // Lookup the deployment - ws := memdb.NewWatchSet() - dout, err := state.DeploymentByID(ws, d.ID) - assert.NoError(err, "DeploymentByID failed") - assert.Equal(structs.DeploymentStatusCancelled, dout.Status, "wrong status") - assert.Equal(structs.DeploymentStatusDescriptionNewerJob, dout.StatusDescription, "wrong status description") - assert.Equal(dout.ModifyIndex, resp.DeploymentModifyIndex, "wrong modify index") -} - -func TestDeploymentEndpoint_Cancel_ACL(t *testing.T) { - t.Parallel() - - s1, _, cleanupS1 := TestACLServer(t, func(c *Config) { - c.NumSchedulers = 0 // Prevent automatic dequeue - }) - defer cleanupS1() - codec := rpcClient(t, s1) - testutil.WaitForLeader(t, s1.RPC) - assert := assert.New(t) - - // Create the deployment - j := mock.Job() - d := mock.Deployment() - d.JobID = j.ID - state := s1.fsm.State() - - assert.Nil(state.UpsertJob(999, j), "UpsertJob") - assert.Nil(state.UpsertDeployment(1000, d), "UpsertDeployment") - - // Create the namespace policy and tokens - validToken := mock.CreatePolicyAndToken(t, state, 1001, "test-valid", - mock.NamespacePolicy(structs.DefaultNamespace, "", []string{acl.NamespaceCapabilitySubmitJob})) - invalidToken := mock.CreatePolicyAndToken(t, state, 1003, "test-invalid", - mock.NamespacePolicy(structs.DefaultNamespace, "", []string{acl.NamespaceCapabilityReadJob})) - - // Mark the deployment as cancelled - req := &structs.DeploymentCancelRequest{ - DeploymentID: d.ID, - WriteRequest: structs.WriteRequest{Region: "global"}, - } - - // Try with no token and expect permission denied - { - var resp structs.DeploymentUpdateResponse - err := msgpackrpc.CallWithCodec(codec, "Deployment.Cancel", req, &resp) - assert.EqualError(err, structs.ErrPermissionDenied.Error()) - } - // Try with an invalid token - { - req.AuthToken = invalidToken.SecretID - var resp structs.DeploymentUpdateResponse - err := msgpackrpc.CallWithCodec(codec, "Deployment.Cancel", req, &resp) - assert.EqualError(err, structs.ErrPermissionDenied.Error()) - } - // Try with a valid token - { - req.AuthToken = validToken.SecretID - var resp structs.DeploymentUpdateResponse - assert.NoError(msgpackrpc.CallWithCodec(codec, "Deployment.Cancel", req, &resp), "RPC") - assert.NotEqual(resp.Index, uint64(0), "bad response index") - - // Lookup the deployment - ws := memdb.NewWatchSet() - dout, err := state.DeploymentByID(ws, d.ID) - assert.NoError(err, "DeploymentByID failed") - assert.Equal(structs.DeploymentStatusCancelled, dout.Status, "wrong status") - assert.Equal(structs.DeploymentStatusDescriptionNewerJob, dout.StatusDescription, "wrong status description") - assert.Equal(dout.ModifyIndex, resp.DeploymentModifyIndex, "wrong modify index") - } -} - -func TestDeploymentEndpoint_Run(t *testing.T) { - t.Parallel() - - s1, cleanupS1 := TestServer(t, func(c *Config) { - c.NumSchedulers = 0 // Prevent automatic dequeue - }) - defer cleanupS1() - codec := rpcClient(t, s1) - testutil.WaitForLeader(t, s1.RPC) - assert := assert.New(t) - - // Create the deployment - j := mock.Job() - d := mock.Deployment() - d.JobID = j.ID - state := s1.fsm.State() - - assert.Nil(state.UpsertJob(999, j), "UpsertJob") - assert.Nil(state.UpsertDeployment(1000, d), "UpsertDeployment") - - // Mark the deployment as failed - req := &structs.DeploymentRunRequest{ - DeploymentID: d.ID, - WriteRequest: structs.WriteRequest{Region: "global"}, - } - - // Fetch the response - var resp structs.DeploymentUpdateResponse - assert.Nil(msgpackrpc.CallWithCodec(codec, "Deployment.Run", req, &resp), "RPC") - assert.NotEqual(resp.Index, uint64(0), "bad response index") - - // Lookup the deployment - ws := memdb.NewWatchSet() - dout, err := state.DeploymentByID(ws, d.ID) - assert.Nil(err, "DeploymentByID failed") - assert.Equal(structs.DeploymentStatusRunning, dout.Status, "wrong status") - assert.Equal(structs.DeploymentStatusDescriptionRunning, dout.StatusDescription, "wrong status description") - assert.Equal(dout.ModifyIndex, resp.DeploymentModifyIndex, "wrong modify index") -} - -func TestDeploymentEndpoint_Unblock(t *testing.T) { - t.Parallel() - - s1, cleanupS1 := TestServer(t, func(c *Config) { - c.NumSchedulers = 0 // Prevent automatic dequeue - }) - defer cleanupS1() - codec := rpcClient(t, s1) - testutil.WaitForLeader(t, s1.RPC) - assert := assert.New(t) - - // Create the deployment - j := mock.Job() - d := mock.Deployment() - d.JobID = j.ID - state := s1.fsm.State() - - assert.Nil(state.UpsertJob(999, j), "UpsertJob") - assert.Nil(state.UpsertDeployment(1000, d), "UpsertDeployment") - - // Mark the deployment as failed - req := &structs.DeploymentUnblockRequest{ - DeploymentID: d.ID, - WriteRequest: structs.WriteRequest{Region: "global"}, - } - - // Fetch the response - var resp structs.DeploymentUpdateResponse - assert.Nil(msgpackrpc.CallWithCodec(codec, "Deployment.Unblock", req, &resp), "RPC") - assert.NotEqual(resp.Index, uint64(0), "bad response index") - - // Lookup the deployment - ws := memdb.NewWatchSet() - dout, err := state.DeploymentByID(ws, d.ID) - assert.Nil(err, "DeploymentByID failed") - assert.Equal(structs.DeploymentStatusSuccessful, dout.Status, "wrong status") - assert.Equal(structs.DeploymentStatusDescriptionSuccessful, dout.StatusDescription, "wrong status description") - assert.Equal(dout.ModifyIndex, resp.DeploymentModifyIndex, "wrong modify index") -} - -func TestDeploymentEndpoint_Unblock_ACL(t *testing.T) { - t.Parallel() - - s1, _, cleanupS1 := TestACLServer(t, func(c *Config) { - c.NumSchedulers = 0 // Prevent automatic dequeue - }) - defer cleanupS1() - codec := rpcClient(t, s1) - testutil.WaitForLeader(t, s1.RPC) - assert := assert.New(t) - - // Create the deployment - j := mock.Job() - d := mock.Deployment() - d.JobID = j.ID - state := s1.fsm.State() - - assert.Nil(state.UpsertJob(999, j), "UpsertJob") - assert.Nil(state.UpsertDeployment(1000, d), "UpsertDeployment") - - // Create the namespace policy and tokens - validToken := mock.CreatePolicyAndToken(t, state, 1001, "test-valid", - mock.NamespacePolicy(structs.DefaultNamespace, "", []string{acl.NamespaceCapabilitySubmitJob})) - invalidToken := mock.CreatePolicyAndToken(t, state, 1003, "test-invalid", - mock.NamespacePolicy(structs.DefaultNamespace, "", []string{acl.NamespaceCapabilityReadJob})) - - // Mark the deployment as unblocked - req := &structs.DeploymentUnblockRequest{ - DeploymentID: d.ID, - WriteRequest: structs.WriteRequest{Region: "global"}, - } - - // Try with no token and expect permission denied - { - var resp structs.DeploymentUpdateResponse - err := msgpackrpc.CallWithCodec(codec, "Deployment.Unblock", req, &resp) - assert.EqualError(err, structs.ErrPermissionDenied.Error()) - } - // Try with an invalid token - { - req.AuthToken = invalidToken.SecretID - var resp structs.DeploymentUpdateResponse - err := msgpackrpc.CallWithCodec(codec, "Deployment.Unblock", req, &resp) - assert.EqualError(err, structs.ErrPermissionDenied.Error()) - } - // Try with a valid token - { - req.AuthToken = validToken.SecretID - var resp structs.DeploymentUpdateResponse - assert.NoError(msgpackrpc.CallWithCodec(codec, "Deployment.Unblock", req, &resp), "RPC") - assert.NotEqual(resp.Index, uint64(0), "bad response index") - - // Lookup the deployment - ws := memdb.NewWatchSet() - dout, err := state.DeploymentByID(ws, d.ID) - assert.NoError(err, "DeploymentByID failed") - assert.Equal(structs.DeploymentStatusSuccessful, dout.Status, "wrong status") - assert.Equal(structs.DeploymentStatusDescriptionSuccessful, dout.StatusDescription, "wrong status description") - assert.Equal(dout.ModifyIndex, resp.DeploymentModifyIndex, "wrong modify index") - } -} - func TestDeploymentEndpoint_SetAllocHealth(t *testing.T) { t.Parallel()