Before this change, running `docker context rm --force` would fail if the context did not exist. This behavior was different from other commands, which allowed ignoring non-existing objects. For example; when trying to remove a non-existing volume, the command would fail without "force": ```bash docker volume rm nosuchvolume Error: No such volume: nosuchvolume echo $? 1 ``` But using the `-f` / `--force` option would make the command complete successfully (the error itself is still printed for informational purposes); ```bash docker volume rm -f nosuchvolume nosuchvolume echo $? 0 ``` With this patch, `docker context rm` behaves the same: ```bash docker context rm nosuchcontext context "nosuchcontext" does not exist echo $? 1 ``` ```bash docker context rm -f nosuchcontext nosuchcontext echo $? 0 ``` This patch also simplifies how we check if the context exists; previously we would try to read the context's metadata; this could fail if a context was corrupted, or if an empty directory was present. This patch now only checks if the directory exists, without first validating the context's data. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
68 lines
2.1 KiB
Go
68 lines
2.1 KiB
Go
package context
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/docker/cli/cli/config"
|
|
"github.com/docker/cli/cli/config/configfile"
|
|
"github.com/docker/cli/cli/context/store"
|
|
"gotest.tools/v3/assert"
|
|
)
|
|
|
|
func TestRemove(t *testing.T) {
|
|
cli := makeFakeCli(t)
|
|
createTestContext(t, cli, "current")
|
|
createTestContext(t, cli, "other")
|
|
assert.NilError(t, RunRemove(cli, RemoveOptions{}, []string{"other"}))
|
|
_, err := cli.ContextStore().GetMetadata("current")
|
|
assert.NilError(t, err)
|
|
_, err = cli.ContextStore().GetMetadata("other")
|
|
assert.Check(t, store.IsErrContextDoesNotExist(err))
|
|
}
|
|
|
|
func TestRemoveNotAContext(t *testing.T) {
|
|
cli := makeFakeCli(t)
|
|
createTestContext(t, cli, "current")
|
|
createTestContext(t, cli, "other")
|
|
err := RunRemove(cli, RemoveOptions{}, []string{"not-a-context"})
|
|
assert.ErrorContains(t, err, `context "not-a-context" does not exist`)
|
|
|
|
err = RunRemove(cli, RemoveOptions{Force: true}, []string{"not-a-context"})
|
|
assert.NilError(t, err)
|
|
}
|
|
|
|
func TestRemoveCurrent(t *testing.T) {
|
|
cli := makeFakeCli(t)
|
|
createTestContext(t, cli, "current")
|
|
createTestContext(t, cli, "other")
|
|
cli.SetCurrentContext("current")
|
|
err := RunRemove(cli, RemoveOptions{}, []string{"current"})
|
|
assert.ErrorContains(t, err, "current: context is in use, set -f flag to force remove")
|
|
}
|
|
|
|
func TestRemoveCurrentForce(t *testing.T) {
|
|
configDir := t.TempDir()
|
|
configFilePath := filepath.Join(configDir, "config.json")
|
|
testCfg := configfile.New(configFilePath)
|
|
testCfg.CurrentContext = "current"
|
|
assert.NilError(t, testCfg.Save())
|
|
|
|
cli := makeFakeCli(t, withCliConfig(testCfg))
|
|
createTestContext(t, cli, "current")
|
|
createTestContext(t, cli, "other")
|
|
cli.SetCurrentContext("current")
|
|
assert.NilError(t, RunRemove(cli, RemoveOptions{Force: true}, []string{"current"}))
|
|
reloadedConfig, err := config.Load(configDir)
|
|
assert.NilError(t, err)
|
|
assert.Equal(t, "", reloadedConfig.CurrentContext)
|
|
}
|
|
|
|
func TestRemoveDefault(t *testing.T) {
|
|
cli := makeFakeCli(t)
|
|
createTestContext(t, cli, "other")
|
|
cli.SetCurrentContext("current")
|
|
err := RunRemove(cli, RemoveOptions{}, []string{"default"})
|
|
assert.ErrorContains(t, err, `default: context "default" cannot be removed`)
|
|
}
|