From 21e2f5c06209fccefacfbc3904bc2592f68a594f Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Wed, 19 May 2021 15:47:12 +0200 Subject: [PATCH] use interceptor to implement ACI-specific flags Signed-off-by: Nicolas De Loof --- cli/cmd/compose/up.go | 8 -------- cli/main.go | 27 ++++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/cli/cmd/compose/up.go b/cli/cmd/compose/up.go index b7a4b125b..88fe33f03 100644 --- a/cli/cmd/compose/up.go +++ b/cli/cmd/compose/up.go @@ -45,8 +45,6 @@ type composeOptions struct { *projectOptions Build bool noBuild bool - // ACI only - DomainName string } type upOptions struct { @@ -186,8 +184,6 @@ func upCommand(p *projectOptions, contextType string, backend compose.Service) * flags.BoolVar(&opts.noPrefix, "no-log-prefix", false, "Don't print prefix in logs.") switch contextType { - case store.AciContextType: - flags.StringVar(&opts.DomainName, "domainname", "", "Container NIS domain name") case store.LocalContextType, store.DefaultContextType, store.EcsLocalSimulationContextType: flags.BoolVar(&opts.forceRecreate, "force-recreate", false, "Recreate containers even if their configuration and image haven't changed.") flags.BoolVar(&opts.noRecreate, "no-recreate", false, "If containers already exist, don't recreate them. Incompatible with --force-recreate.") @@ -360,10 +356,6 @@ func setup(opts composeOptions, services []string) (*types.Project, error) { return nil, err } - if opts.DomainName != "" { - // arbitrarily set the domain name on the first service ; ACI backend will expose the entire project - project.Services[0].DomainName = opts.DomainName - } if opts.Build { for i, service := range project.Services { service.PullPolicy = types.PullPolicyBuild diff --git a/cli/main.go b/cli/main.go index 3057c9066..548957816 100644 --- a/cli/main.go +++ b/cli/main.go @@ -28,12 +28,14 @@ import ( "syscall" "time" + "github.com/compose-spec/compose-go/types" "github.com/docker/cli/cli" "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/docker/compose-cli/api/backend" + api "github.com/docker/compose-cli/api/compose" "github.com/docker/compose-cli/api/config" apicontext "github.com/docker/compose-cli/api/context" "github.com/docker/compose-cli/api/context/store" @@ -223,7 +225,14 @@ func main() { if ctype != store.DefaultContextType { // On default context, "compose" is implemented by CLI Plugin - root.AddCommand(compose.RootCommand(ctype, service.ComposeService())) + proxy := api.NewServiceProxy().WithService(service.ComposeService()) + command := compose.RootCommand(ctype, proxy) + + if ctype == store.AciContextType { + customizeCliForACI(command, proxy) + } + + root.AddCommand(command) } if err = root.ExecuteContext(ctx); err != nil { @@ -232,6 +241,22 @@ func main() { metrics.Track(ctype, os.Args[1:], metrics.SuccessStatus) } +func customizeCliForACI(command *cobra.Command, proxy *api.ServiceProxy) { + var domainName string + for _, c := range command.Commands() { + if c.Name() == "up" { + c.Flags().StringVar(&domainName, "domainname", "", "Container NIS domain name") + proxy.WithInterceptor(func(ctx context.Context, project *types.Project) { + if domainName != "" { + // arbitrarily set the domain name on the first service ; ACI backend will expose the entire project + project.Services[0].DomainName = domainName + } + + }) + } + } +} + func getBackend(ctype string, configDir string, opts cliopts.GlobalOpts) (backend.Service, error) { switch ctype { case store.DefaultContextType, store.LocalContextType: