mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
108 lines
2.9 KiB
Go
108 lines
2.9 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package command
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/hashicorp/cli"
|
|
"github.com/hashicorp/nomad/ci"
|
|
"github.com/hashicorp/nomad/command/agent"
|
|
"github.com/hashicorp/nomad/helper/uuid"
|
|
"github.com/hashicorp/nomad/nomad/mock"
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
"github.com/shoenig/test/must"
|
|
)
|
|
|
|
func TestVolumeClaimDeleteCommand_Run(t *testing.T) {
|
|
ci.Parallel(t)
|
|
|
|
config := func(c *agent.Config) {
|
|
c.ACL.Enabled = true
|
|
}
|
|
|
|
srv, _, url := testServer(t, true, config)
|
|
state := srv.Agent.Server().State()
|
|
defer srv.Shutdown()
|
|
|
|
// get an ACL token
|
|
token := mock.CreatePolicyAndToken(t, state, 999, "good",
|
|
`namespace "*" { capabilities = ["host-volume-write"] }
|
|
node { policy = "write" }`)
|
|
must.NotNil(t, token)
|
|
|
|
longID := uuid.Generate()
|
|
shortID := longID[0:8]
|
|
longID2 := uuid.Generate()
|
|
longID2 = shortID + longID2[8:]
|
|
|
|
// Create some test claims
|
|
existingClaims := []*structs.TaskGroupHostVolumeClaim{
|
|
{
|
|
ID: longID,
|
|
Namespace: structs.DefaultNamespace,
|
|
JobID: "foo",
|
|
TaskGroupName: "foo",
|
|
VolumeID: uuid.Generate(),
|
|
VolumeName: "bar",
|
|
},
|
|
// different NS
|
|
{
|
|
ID: uuid.Generate(),
|
|
Namespace: "foo",
|
|
JobID: "foo",
|
|
TaskGroupName: "foo",
|
|
VolumeID: uuid.Generate(),
|
|
VolumeName: "foo",
|
|
},
|
|
{
|
|
ID: longID2, // same prefix as the longID
|
|
Namespace: structs.DefaultNamespace,
|
|
JobID: "bar",
|
|
TaskGroupName: "foo",
|
|
VolumeID: uuid.Generate(),
|
|
VolumeName: "foo",
|
|
},
|
|
}
|
|
|
|
for _, claim := range existingClaims {
|
|
must.NoError(t, state.UpsertTaskGroupHostVolumeClaim(structs.MsgTypeTestSetup, 1000, claim))
|
|
}
|
|
|
|
ui := cli.NewMockUi()
|
|
cmd := &VolumeClaimDeleteCommand{Meta: Meta{Ui: ui, flagAddress: url}}
|
|
|
|
// Delete with an invalid token fails
|
|
invalidToken := mock.ACLToken()
|
|
must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + invalidToken.SecretID, "-y", existingClaims[0].ID}))
|
|
out := ui.ErrorWriter.String()
|
|
must.StrContains(t, out, "Permission denied")
|
|
ui.ErrorWriter.Reset()
|
|
|
|
// Delete with a valid token, but short ID that matches multiple claims
|
|
must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-y", shortID}))
|
|
out = ui.ErrorWriter.String()
|
|
must.StrContains(t, out, "matched multiple claims")
|
|
ui.ErrorWriter.Reset()
|
|
|
|
// Delete with a valid token
|
|
must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-y", existingClaims[0].ID}))
|
|
out = ui.OutputWriter.String()
|
|
must.StrContains(t, out, "successfully deleted")
|
|
|
|
ui.OutputWriter.Reset()
|
|
|
|
// List and make sure there is just 1 claim left (we have no permissions to read foo ns)
|
|
listCmd := &VolumeClaimListCommand{Meta: Meta{Ui: ui, flagAddress: url}}
|
|
must.Zero(t, listCmd.Run([]string{
|
|
"-address=" + url,
|
|
"-token=" + token.SecretID,
|
|
}))
|
|
out = ui.OutputWriter.String()
|
|
|
|
must.StrContains(t, out, shortID)
|
|
|
|
ui.OutputWriter.Reset()
|
|
}
|