Files
nomad/command/volume_claim_delete_test.go
Piotr Kazmierczak 73a193f6d9 stateful deployments: task group host volume claims CLI (#25116)
CLI for interacting with task group host volume claims.
2025-02-27 17:04:48 +01:00

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()
}