diff --git a/cli/command/context/create.go b/cli/command/context/create.go index 1c93a1881a..e4a5258bfa 100644 --- a/cli/command/context/create.go +++ b/cli/command/context/create.go @@ -24,6 +24,10 @@ type CreateOptions struct { Description string Docker map[string]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 { @@ -94,7 +98,8 @@ func createNewContext(contextStore store.ReaderWriter, o *CreateOptions) error { docker.DockerEndpoint: dockerEP, }, Metadata: command.DockerContext{ - Description: o.Description, + Description: o.Description, + AdditionalFields: o.metaData, }, Name: o.Name, } diff --git a/cli/command/context/export-import_test.go b/cli/command/context/export-import_test.go index fc3952c300..9aabd6ab44 100644 --- a/cli/command/context/export-import_test.go +++ b/cli/command/context/export-import_test.go @@ -8,14 +8,18 @@ import ( "path/filepath" "testing" + "github.com/docker/cli/cli/command" "github.com/docker/cli/cli/streams" "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" ) func TestExportImportWithFile(t *testing.T) { contextFile := filepath.Join(t.TempDir(), "exported") cli := makeFakeCli(t) - createTestContext(t, cli, "test") + createTestContext(t, cli, "test", map[string]any{ + "MyCustomMetadata": t.Name(), + }) cli.ErrBuffer().Reset() assert.NilError(t, RunExport(cli, &ExportOptions{ ContextName: "test", @@ -29,18 +33,26 @@ func TestExportImportWithFile(t *testing.T) { assert.NilError(t, err) context2, err := cli.ContextStore().GetMetadata("test2") 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.Equal(t, "Successfully imported context \"test2\"\n", cli.ErrBuffer().String()) + assert.Check(t, is.DeepEqual(context1.Metadata, command.DockerContext{ + 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) { cli := makeFakeCli(t) - createTestContext(t, cli, "test") + createTestContext(t, cli, "test", map[string]any{ + "MyCustomMetadata": t.Name(), + }) cli.ErrBuffer().Reset() cli.OutBuffer().Reset() assert.NilError(t, RunExport(cli, &ExportOptions{ @@ -56,13 +68,19 @@ func TestExportImportPipe(t *testing.T) { assert.NilError(t, err) context2, err := cli.ContextStore().GetMetadata("test2") 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.Equal(t, "Successfully imported context \"test2\"\n", cli.ErrBuffer().String()) + assert.Check(t, is.DeepEqual(context1.Metadata, command.DockerContext{ + 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) { diff --git a/cli/command/context/inspect_test.go b/cli/command/context/inspect_test.go index 703898ed53..68ce35ffb0 100644 --- a/cli/command/context/inspect_test.go +++ b/cli/command/context/inspect_test.go @@ -10,7 +10,9 @@ import ( func TestInspect(t *testing.T) { cli := makeFakeCli(t) - createTestContext(t, cli, "current") + createTestContext(t, cli, "current", map[string]any{ + "MyCustomMetadata": "MyCustomMetadataValue", + }) cli.OutBuffer().Reset() assert.NilError(t, runInspect(cli, inspectOptions{ refs: []string{"current"}, diff --git a/cli/command/context/list_test.go b/cli/command/context/list_test.go index 1b264a6e85..9370bf6d2d 100644 --- a/cli/command/context/list_test.go +++ b/cli/command/context/list_test.go @@ -11,17 +11,19 @@ import ( func createTestContexts(t *testing.T, cli command.Cli, name ...string) { t.Helper() 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() err := RunCreate(cli, &CreateOptions{ Name: name, Description: "description of " + name, Docker: map[string]string{keyHost: "https://someswarmserver.example.com"}, + + metaData: metaData, }) assert.NilError(t, err) } diff --git a/cli/command/context/remove_test.go b/cli/command/context/remove_test.go index f42c4fe7eb..ab2f8ba216 100644 --- a/cli/command/context/remove_test.go +++ b/cli/command/context/remove_test.go @@ -57,7 +57,7 @@ func TestRemoveCurrentForce(t *testing.T) { func TestRemoveDefault(t *testing.T) { cli := makeFakeCli(t) - createTestContext(t, cli, "other") + createTestContext(t, cli, "other", nil) cli.SetCurrentContext("current") err := RunRemove(cli, RemoveOptions{}, []string{"default"}) assert.ErrorContains(t, err, `default: context "default" cannot be removed`) diff --git a/cli/command/context/show_test.go b/cli/command/context/show_test.go index 40ac58ad05..eab0941692 100644 --- a/cli/command/context/show_test.go +++ b/cli/command/context/show_test.go @@ -8,7 +8,7 @@ import ( func TestShow(t *testing.T) { cli := makeFakeCli(t) - createTestContext(t, cli, "current") + createTestContext(t, cli, "current", nil) cli.SetCurrentContext("current") cli.OutBuffer().Reset() diff --git a/cli/command/context/testdata/inspect.golden b/cli/command/context/testdata/inspect.golden index ffc790180d..a023169d7a 100644 --- a/cli/command/context/testdata/inspect.golden +++ b/cli/command/context/testdata/inspect.golden @@ -2,7 +2,8 @@ { "Name": "current", "Metadata": { - "Description": "description of current" + "Description": "description of current", + "MyCustomMetadata": "MyCustomMetadataValue" }, "Endpoints": { "docker": { diff --git a/cli/command/context/update_test.go b/cli/command/context/update_test.go index 553f67fd1a..0e4a639145 100644 --- a/cli/command/context/update_test.go +++ b/cli/command/context/update_test.go @@ -34,7 +34,7 @@ func TestUpdateDescriptionOnly(t *testing.T) { func TestUpdateDockerOnly(t *testing.T) { cli := makeFakeCli(t) - createTestContext(t, cli, "test") + createTestContext(t, cli, "test", nil) assert.NilError(t, RunUpdate(cli, &UpdateOptions{ Name: "test", Docker: map[string]string{