From ad21055bac543889fc145a58f1ea65176c581689 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sat, 8 Mar 2025 18:25:20 +0100 Subject: [PATCH] opts: move swarm-specific options to a separate package This prevents users of the CLI that don't implement swarm-related features from depending on the swarm API types. Signed-off-by: Sebastiaan van Stijn --- cli/command/service/create_test.go | 11 +++++------ cli/command/service/opts.go | 7 ++++--- cli/command/service/update.go | 11 ++++++----- cli/compose/loader/loader.go | 3 ++- opts/opts_deprecated.go | 18 ++++++++++++++++++ opts/{ => swarmopts}/config.go | 2 +- opts/{ => swarmopts}/config_test.go | 2 +- opts/{ => swarmopts}/port.go | 2 +- opts/{ => swarmopts}/port_test.go | 2 +- opts/{ => swarmopts}/secret.go | 2 +- opts/{ => swarmopts}/secret_test.go | 2 +- 11 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 opts/opts_deprecated.go rename opts/{ => swarmopts}/config.go (99%) rename opts/{ => swarmopts}/config_test.go (99%) rename opts/{ => swarmopts}/port.go (99%) rename opts/{ => swarmopts}/port_test.go (99%) rename opts/{ => swarmopts}/secret.go (99%) rename opts/{ => swarmopts}/secret_test.go (99%) diff --git a/cli/command/service/create_test.go b/cli/command/service/create_test.go index 169a9e2fed..9ae4f2db45 100644 --- a/cli/command/service/create_test.go +++ b/cli/command/service/create_test.go @@ -4,12 +4,11 @@ import ( "context" "testing" + "github.com/docker/cli/opts/swarmopts" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" - - cliopts "github.com/docker/cli/opts" ) // fakeConfigAPIClientList is used to let us pass a closure as a @@ -43,8 +42,8 @@ func (fakeConfigAPIClientList) ConfigUpdate(_ context.Context, _ string, _ swarm func TestSetConfigsWithCredSpecAndConfigs(t *testing.T) { // we can't directly access the internal fields of the ConfigOpt struct, so // we need to let it do the parsing - configOpt := &cliopts.ConfigOpt{} - configOpt.Set("bar") + configOpt := &swarmopts.ConfigOpt{} + assert.Check(t, configOpt.Set("bar")) opts := &serviceOptions{ credentialSpec: credentialSpecOpt{ value: &swarm.CredentialSpec{ @@ -187,8 +186,8 @@ func TestSetConfigsOnlyCredSpec(t *testing.T) { // TestSetConfigsOnlyConfigs verifies setConfigs when only configs (and not a // CredentialSpec) is needed. func TestSetConfigsOnlyConfigs(t *testing.T) { - configOpt := &cliopts.ConfigOpt{} - configOpt.Set("bar") + configOpt := &swarmopts.ConfigOpt{} + assert.Check(t, configOpt.Set("bar")) opts := &serviceOptions{ configs: *configOpt, } diff --git a/cli/command/service/opts.go b/cli/command/service/opts.go index 983e2233be..bd5ea0435d 100644 --- a/cli/command/service/opts.go +++ b/cli/command/service/opts.go @@ -13,6 +13,7 @@ import ( "github.com/docker/cli/cli/command" "github.com/docker/cli/opts" + "github.com/docker/cli/opts/swarmopts" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/swarm" @@ -395,7 +396,7 @@ func convertNetworks(networks opts.NetworkOpt) []swarm.NetworkAttachmentConfig { type endpointOptions struct { mode string - publishPorts opts.PortOpt + publishPorts swarmopts.PortOpt } func (e *endpointOptions) ToEndpointSpec() *swarm.EndpointSpec { @@ -553,8 +554,8 @@ type serviceOptions struct { logDriver logDriverOptions healthcheck healthCheckOptions - secrets opts.SecretOpt - configs opts.ConfigOpt + secrets swarmopts.SecretOpt + configs swarmopts.ConfigOpt isolation string } diff --git a/cli/command/service/update.go b/cli/command/service/update.go index 36f09bfa59..f69e8f4fb4 100644 --- a/cli/command/service/update.go +++ b/cli/command/service/update.go @@ -11,6 +11,7 @@ import ( "github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command/completion" "github.com/docker/cli/opts" + "github.com/docker/cli/opts/swarmopts" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" @@ -55,7 +56,7 @@ func newUpdateCommand(dockerCLI command.Cli) *cobra.Command { flags.Var(newListOptsVar(), flagContainerLabelRemove, "Remove a container label by its key") flags.Var(newListOptsVar(), flagMountRemove, "Remove a mount by its target path") // flags.Var(newListOptsVar().WithValidator(validatePublishRemove), flagPublishRemove, "Remove a published port by its target port") - flags.Var(&opts.PortOpt{}, flagPublishRemove, "Remove a published port by its target port") + flags.Var(&swarmopts.PortOpt{}, flagPublishRemove, "Remove a published port by its target port") flags.Var(newListOptsVar(), flagConstraintRemove, "Remove a constraint") flags.Var(newListOptsVar(), flagDNSRemove, "Remove a custom DNS server") flags.SetAnnotation(flagDNSRemove, "version", []string{"1.25"}) @@ -804,7 +805,7 @@ func getUpdatedSecrets(ctx context.Context, apiClient client.SecretAPIClient, fl } if flags.Changed(flagSecretAdd) { - values := flags.Lookup(flagSecretAdd).Value.(*opts.SecretOpt).Value() + values := flags.Lookup(flagSecretAdd).Value.(*swarmopts.SecretOpt).Value() addSecrets, err := ParseSecrets(ctx, apiClient, values) if err != nil { @@ -852,7 +853,7 @@ func getUpdatedConfigs(ctx context.Context, apiClient client.ConfigAPIClient, fl resolveConfigs := []*swarm.ConfigReference{} if flags.Changed(flagConfigAdd) { - resolveConfigs = append(resolveConfigs, flags.Lookup(flagConfigAdd).Value.(*opts.ConfigOpt).Value()...) + resolveConfigs = append(resolveConfigs, flags.Lookup(flagConfigAdd).Value.(*swarmopts.ConfigOpt).Value()...) } // if credSpecConfigNameis non-empty at this point, it means its a new @@ -1091,7 +1092,7 @@ func updatePorts(flags *pflag.FlagSet, portConfig *[]swarm.PortConfig) error { newPorts := []swarm.PortConfig{} // Clean current ports - toRemove := flags.Lookup(flagPublishRemove).Value.(*opts.PortOpt).Value() + toRemove := flags.Lookup(flagPublishRemove).Value.(*swarmopts.PortOpt).Value() portLoop: for _, port := range portSet { for _, pConfig := range toRemove { @@ -1107,7 +1108,7 @@ portLoop: // Check to see if there are any conflict in flags. if flags.Changed(flagPublishAdd) { - ports := flags.Lookup(flagPublishAdd).Value.(*opts.PortOpt).Value() + ports := flags.Lookup(flagPublishAdd).Value.(*swarmopts.PortOpt).Value() for _, port := range ports { if _, ok := portSet[portConfigToString(&port)]; ok { diff --git a/cli/compose/loader/loader.go b/cli/compose/loader/loader.go index 6cd2d2031d..e63c86e12b 100644 --- a/cli/compose/loader/loader.go +++ b/cli/compose/loader/loader.go @@ -18,6 +18,7 @@ import ( "github.com/docker/cli/cli/compose/template" "github.com/docker/cli/cli/compose/types" "github.com/docker/cli/opts" + "github.com/docker/cli/opts/swarmopts" "github.com/docker/docker/api/types/versions" "github.com/docker/go-connections/nat" units "github.com/docker/go-units" @@ -925,7 +926,7 @@ func toServicePortConfigs(value string) ([]any, error) { for _, key := range keys { // Reuse ConvertPortToPortConfig so that it is consistent - portConfig, err := opts.ConvertPortToPortConfig(nat.Port(key), portBindings) + portConfig, err := swarmopts.ConvertPortToPortConfig(nat.Port(key), portBindings) if err != nil { return nil, err } diff --git a/opts/opts_deprecated.go b/opts/opts_deprecated.go new file mode 100644 index 0000000000..2eab7a1258 --- /dev/null +++ b/opts/opts_deprecated.go @@ -0,0 +1,18 @@ +package opts + +import "github.com/docker/cli/opts/swarmopts" + +// PortOpt represents a port config in swarm mode. +// +// Deprecated: use [swarmopts.PortOpt] +type PortOpt = swarmopts.PortOpt + +// ConfigOpt is a Value type for parsing configs. +// +// Deprecated: use [swarmopts.ConfigOpt] +type ConfigOpt = swarmopts.ConfigOpt + +// SecretOpt is a Value type for parsing secrets +// +// Deprecated: use [swarmopts.SecretOpt] +type SecretOpt = swarmopts.SecretOpt diff --git a/opts/config.go b/opts/swarmopts/config.go similarity index 99% rename from opts/config.go rename to opts/swarmopts/config.go index 1fc0eb356b..1dc9de55f0 100644 --- a/opts/config.go +++ b/opts/swarmopts/config.go @@ -1,4 +1,4 @@ -package opts +package swarmopts import ( "encoding/csv" diff --git a/opts/config_test.go b/opts/swarmopts/config_test.go similarity index 99% rename from opts/config_test.go rename to opts/swarmopts/config_test.go index ab7d0c5b2b..43683f4129 100644 --- a/opts/config_test.go +++ b/opts/swarmopts/config_test.go @@ -1,4 +1,4 @@ -package opts +package swarmopts import ( "os" diff --git a/opts/port.go b/opts/swarmopts/port.go similarity index 99% rename from opts/port.go rename to opts/swarmopts/port.go index f0394eb281..e15c6b8302 100644 --- a/opts/port.go +++ b/opts/swarmopts/port.go @@ -1,4 +1,4 @@ -package opts +package swarmopts import ( "encoding/csv" diff --git a/opts/port_test.go b/opts/swarmopts/port_test.go similarity index 99% rename from opts/port_test.go rename to opts/swarmopts/port_test.go index fdca0770f1..c13c6cd4d0 100644 --- a/opts/port_test.go +++ b/opts/swarmopts/port_test.go @@ -1,4 +1,4 @@ -package opts +package swarmopts import ( "bytes" diff --git a/opts/secret.go b/opts/swarmopts/secret.go similarity index 99% rename from opts/secret.go rename to opts/swarmopts/secret.go index bdf232de63..d8c53a34fa 100644 --- a/opts/secret.go +++ b/opts/swarmopts/secret.go @@ -1,4 +1,4 @@ -package opts +package swarmopts import ( "encoding/csv" diff --git a/opts/secret_test.go b/opts/swarmopts/secret_test.go similarity index 99% rename from opts/secret_test.go rename to opts/swarmopts/secret_test.go index 88f4f96027..c8656f615b 100644 --- a/opts/secret_test.go +++ b/opts/swarmopts/secret_test.go @@ -1,4 +1,4 @@ -package opts +package swarmopts import ( "os"