cli/command/context: test inspecting context with custom metadata

The CLI does not currently expose options to add custom metadata to
contexts, but contexts support them.

- update test-utilities to allow setting custom metadata
- update the inspect test to verify that custom metadata is included
  when inspecting a context.
- update the import/export tests to verify that custom metadata
  is preserved.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2024-05-31 10:40:04 +02:00
parent 54291dd47a
commit 2e9eff235d
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
8 changed files with 50 additions and 22 deletions

View File

@ -24,6 +24,10 @@ type CreateOptions struct {
Description string Description string
Docker map[string]string Docker map[string]string
From string From string
// Additional Metadata to store in the context. This option is not
// currently exposed to the user.
metaData map[string]any
} }
func longCreateDescription() string { func longCreateDescription() string {
@ -94,7 +98,8 @@ func createNewContext(contextStore store.ReaderWriter, o *CreateOptions) error {
docker.DockerEndpoint: dockerEP, docker.DockerEndpoint: dockerEP,
}, },
Metadata: command.DockerContext{ Metadata: command.DockerContext{
Description: o.Description, Description: o.Description,
AdditionalFields: o.metaData,
}, },
Name: o.Name, Name: o.Name,
} }

View File

@ -8,14 +8,18 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/streams" "github.com/docker/cli/cli/streams"
"gotest.tools/v3/assert" "gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
) )
func TestExportImportWithFile(t *testing.T) { func TestExportImportWithFile(t *testing.T) {
contextFile := filepath.Join(t.TempDir(), "exported") contextFile := filepath.Join(t.TempDir(), "exported")
cli := makeFakeCli(t) cli := makeFakeCli(t)
createTestContext(t, cli, "test") createTestContext(t, cli, "test", map[string]any{
"MyCustomMetadata": t.Name(),
})
cli.ErrBuffer().Reset() cli.ErrBuffer().Reset()
assert.NilError(t, RunExport(cli, &ExportOptions{ assert.NilError(t, RunExport(cli, &ExportOptions{
ContextName: "test", ContextName: "test",
@ -29,18 +33,26 @@ func TestExportImportWithFile(t *testing.T) {
assert.NilError(t, err) assert.NilError(t, err)
context2, err := cli.ContextStore().GetMetadata("test2") context2, err := cli.ContextStore().GetMetadata("test2")
assert.NilError(t, err) assert.NilError(t, err)
assert.DeepEqual(t, context1.Endpoints, context2.Endpoints)
assert.DeepEqual(t, context1.Metadata, context2.Metadata)
assert.Equal(t, "test", context1.Name)
assert.Equal(t, "test2", context2.Name)
assert.Equal(t, "test2\n", cli.OutBuffer().String()) assert.Check(t, is.DeepEqual(context1.Metadata, command.DockerContext{
assert.Equal(t, "Successfully imported context \"test2\"\n", cli.ErrBuffer().String()) Description: "description of test",
AdditionalFields: map[string]any{"MyCustomMetadata": t.Name()},
}))
assert.Check(t, is.DeepEqual(context1.Endpoints, context2.Endpoints))
assert.Check(t, is.DeepEqual(context1.Metadata, context2.Metadata))
assert.Check(t, is.Equal("test", context1.Name))
assert.Check(t, is.Equal("test2", context2.Name))
assert.Check(t, is.Equal("test2\n", cli.OutBuffer().String()))
assert.Check(t, is.Equal("Successfully imported context \"test2\"\n", cli.ErrBuffer().String()))
} }
func TestExportImportPipe(t *testing.T) { func TestExportImportPipe(t *testing.T) {
cli := makeFakeCli(t) cli := makeFakeCli(t)
createTestContext(t, cli, "test") createTestContext(t, cli, "test", map[string]any{
"MyCustomMetadata": t.Name(),
})
cli.ErrBuffer().Reset() cli.ErrBuffer().Reset()
cli.OutBuffer().Reset() cli.OutBuffer().Reset()
assert.NilError(t, RunExport(cli, &ExportOptions{ assert.NilError(t, RunExport(cli, &ExportOptions{
@ -56,13 +68,19 @@ func TestExportImportPipe(t *testing.T) {
assert.NilError(t, err) assert.NilError(t, err)
context2, err := cli.ContextStore().GetMetadata("test2") context2, err := cli.ContextStore().GetMetadata("test2")
assert.NilError(t, err) assert.NilError(t, err)
assert.DeepEqual(t, context1.Endpoints, context2.Endpoints)
assert.DeepEqual(t, context1.Metadata, context2.Metadata)
assert.Equal(t, "test", context1.Name)
assert.Equal(t, "test2", context2.Name)
assert.Equal(t, "test2\n", cli.OutBuffer().String()) assert.Check(t, is.DeepEqual(context1.Metadata, command.DockerContext{
assert.Equal(t, "Successfully imported context \"test2\"\n", cli.ErrBuffer().String()) Description: "description of test",
AdditionalFields: map[string]any{"MyCustomMetadata": t.Name()},
}))
assert.Check(t, is.DeepEqual(context1.Endpoints, context2.Endpoints))
assert.Check(t, is.DeepEqual(context1.Metadata, context2.Metadata))
assert.Check(t, is.Equal("test", context1.Name))
assert.Check(t, is.Equal("test2", context2.Name))
assert.Check(t, is.Equal("test2\n", cli.OutBuffer().String()))
assert.Check(t, is.Equal("Successfully imported context \"test2\"\n", cli.ErrBuffer().String()))
} }
func TestExportExistingFile(t *testing.T) { func TestExportExistingFile(t *testing.T) {

View File

@ -10,7 +10,9 @@ import (
func TestInspect(t *testing.T) { func TestInspect(t *testing.T) {
cli := makeFakeCli(t) cli := makeFakeCli(t)
createTestContext(t, cli, "current") createTestContext(t, cli, "current", map[string]any{
"MyCustomMetadata": "MyCustomMetadataValue",
})
cli.OutBuffer().Reset() cli.OutBuffer().Reset()
assert.NilError(t, runInspect(cli, inspectOptions{ assert.NilError(t, runInspect(cli, inspectOptions{
refs: []string{"current"}, refs: []string{"current"},

View File

@ -11,17 +11,19 @@ import (
func createTestContexts(t *testing.T, cli command.Cli, name ...string) { func createTestContexts(t *testing.T, cli command.Cli, name ...string) {
t.Helper() t.Helper()
for _, n := range name { for _, n := range name {
createTestContext(t, cli, n) createTestContext(t, cli, n, nil)
} }
} }
func createTestContext(t *testing.T, cli command.Cli, name string) { func createTestContext(t *testing.T, cli command.Cli, name string, metaData map[string]any) {
t.Helper() t.Helper()
err := RunCreate(cli, &CreateOptions{ err := RunCreate(cli, &CreateOptions{
Name: name, Name: name,
Description: "description of " + name, Description: "description of " + name,
Docker: map[string]string{keyHost: "https://someswarmserver.example.com"}, Docker: map[string]string{keyHost: "https://someswarmserver.example.com"},
metaData: metaData,
}) })
assert.NilError(t, err) assert.NilError(t, err)
} }

View File

@ -57,7 +57,7 @@ func TestRemoveCurrentForce(t *testing.T) {
func TestRemoveDefault(t *testing.T) { func TestRemoveDefault(t *testing.T) {
cli := makeFakeCli(t) cli := makeFakeCli(t)
createTestContext(t, cli, "other") createTestContext(t, cli, "other", nil)
cli.SetCurrentContext("current") cli.SetCurrentContext("current")
err := RunRemove(cli, RemoveOptions{}, []string{"default"}) err := RunRemove(cli, RemoveOptions{}, []string{"default"})
assert.ErrorContains(t, err, `default: context "default" cannot be removed`) assert.ErrorContains(t, err, `default: context "default" cannot be removed`)

View File

@ -8,7 +8,7 @@ import (
func TestShow(t *testing.T) { func TestShow(t *testing.T) {
cli := makeFakeCli(t) cli := makeFakeCli(t)
createTestContext(t, cli, "current") createTestContext(t, cli, "current", nil)
cli.SetCurrentContext("current") cli.SetCurrentContext("current")
cli.OutBuffer().Reset() cli.OutBuffer().Reset()

View File

@ -2,7 +2,8 @@
{ {
"Name": "current", "Name": "current",
"Metadata": { "Metadata": {
"Description": "description of current" "Description": "description of current",
"MyCustomMetadata": "MyCustomMetadataValue"
}, },
"Endpoints": { "Endpoints": {
"docker": { "docker": {

View File

@ -34,7 +34,7 @@ func TestUpdateDescriptionOnly(t *testing.T) {
func TestUpdateDockerOnly(t *testing.T) { func TestUpdateDockerOnly(t *testing.T) {
cli := makeFakeCli(t) cli := makeFakeCli(t)
createTestContext(t, cli, "test") createTestContext(t, cli, "test", nil)
assert.NilError(t, RunUpdate(cli, &UpdateOptions{ assert.NilError(t, RunUpdate(cli, &UpdateOptions{
Name: "test", Name: "test",
Docker: map[string]string{ Docker: map[string]string{