From 42c72c365c83f01da94e3951f3c3b8e3e90cafb6 Mon Sep 17 00:00:00 2001 From: Djordje Lukic Date: Thu, 14 May 2020 20:55:40 +0200 Subject: [PATCH] Split context comands into own files --- cli/cmd/context.go | 193 ----------------------------------- cli/cmd/context/context.go | 51 +++++++++ cli/cmd/context/create.go | 48 +++++++++ cli/cmd/context/createaci.go | 20 ++++ cli/cmd/context/ls.go | 43 ++++++++ cli/cmd/context/rm.go | 36 +++++++ cli/cmd/context/use.go | 38 +++++++ cli/main.go | 3 +- 8 files changed, 238 insertions(+), 194 deletions(-) delete mode 100644 cli/cmd/context.go create mode 100644 cli/cmd/context/context.go create mode 100644 cli/cmd/context/create.go create mode 100644 cli/cmd/context/createaci.go create mode 100644 cli/cmd/context/ls.go create mode 100644 cli/cmd/context/rm.go create mode 100644 cli/cmd/context/use.go diff --git a/cli/cmd/context.go b/cli/cmd/context.go deleted file mode 100644 index 52ac4b8d2..000000000 --- a/cli/cmd/context.go +++ /dev/null @@ -1,193 +0,0 @@ -/* - Copyright (c) 2020 Docker Inc. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, - INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH - THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -package cmd - -import ( - "context" - "fmt" - "os" - "text/tabwriter" - - "github.com/spf13/cobra" - - cliconfig "github.com/docker/api/cli/config" - cliopts "github.com/docker/api/cli/options" - "github.com/docker/api/context/store" - "github.com/docker/api/multierror" -) - -// ContextCommand manages contexts -func ContextCommand(opts *cliopts.GlobalOpts) *cobra.Command { - cmd := &cobra.Command{ - Use: "context", - Short: "Manage contexts", - } - - cmd.AddCommand( - createCommand(), - listCommand(), - removeCommand(), - useCommand(opts), - ) - - return cmd -} - -type createOpts struct { - description string - aciLocation string - aciSubscriptionID string - aciResourceGroup string -} - -func createCommand() *cobra.Command { - var opts createOpts - cmd := &cobra.Command{ - Use: "create CONTEXT BACKEND [OPTIONS]", - Short: "Create a context", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - return runCreate(cmd.Context(), opts, args[0], args[1]) - }, - } - - cmd.Flags().StringVar(&opts.description, "description", "", "Description of the context") - cmd.Flags().StringVar(&opts.aciLocation, "aci-location", "eastus", "Location") - cmd.Flags().StringVar(&opts.aciSubscriptionID, "aci-subscription-id", "", "Location") - cmd.Flags().StringVar(&opts.aciResourceGroup, "aci-resource-group", "", "Resource group") - - return cmd -} - -func listCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "list", - Short: "List available contexts", - Aliases: []string{"ls"}, - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - return runList(cmd.Context()) - }, - } - return cmd -} - -func removeCommand() *cobra.Command { - return &cobra.Command{ - Use: "rm CONTEXT [CONTEXT...]", - Short: "Remove one or more contexts", - Aliases: []string{"remove"}, - Args: cobra.MinimumNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runRemove(cmd.Context(), args) - }, - } -} - -func useCommand(opts *cliopts.GlobalOpts) *cobra.Command { - return &cobra.Command{ - Use: "use CONTEXT", - Short: "Set the default context", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - return runUse(cmd.Context(), opts.Config, args[0]) - }, - } -} - -func runCreate(ctx context.Context, opts createOpts, name string, contextType string) error { - switch contextType { - case "aci": - return createACIContext(ctx, name, opts) - default: - s := store.ContextStore(ctx) - return s.Create(name, store.TypedContext{ - Type: contextType, - Description: opts.description, - }) - } -} - -func createACIContext(ctx context.Context, name string, opts createOpts) error { - s := store.ContextStore(ctx) - return s.Create(name, store.TypedContext{ - Type: "aci", - Description: opts.description, - Data: store.AciContext{ - SubscriptionID: opts.aciSubscriptionID, - Location: opts.aciLocation, - ResourceGroup: opts.aciResourceGroup, - }, - }) -} - -func runList(ctx context.Context) error { - s := store.ContextStore(ctx) - contexts, err := s.List() - if err != nil { - return err - } - - w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0) - fmt.Fprintln(w, "NAME\tDESCRIPTION\tTYPE") - format := "%s\t%s\t%s\n" - - for _, c := range contexts { - fmt.Fprintf(w, format, c.Name, c.Metadata.Description, c.Metadata.Type) - } - - return w.Flush() -} - -func runRemove(ctx context.Context, args []string) error { - s := store.ContextStore(ctx) - var errs *multierror.Error - for _, n := range args { - if err := s.Remove(n); err != nil { - errs = multierror.Append(errs, err) - } else { - fmt.Println(n) - } - } - return errs.ErrorOrNil() -} - -func runUse(ctx context.Context, configDir string, name string) error { - s := store.ContextStore(ctx) - // Match behavior of existing CLI - if name != store.DefaultContextName { - if _, err := s.Get(name, nil); err != nil { - return err - } - } - if err := cliconfig.WriteCurrentContext(configDir, name); err != nil { - return err - } - fmt.Println(name) - return nil -} diff --git a/cli/cmd/context/context.go b/cli/cmd/context/context.go new file mode 100644 index 000000000..aea5e7bf3 --- /dev/null +++ b/cli/cmd/context/context.go @@ -0,0 +1,51 @@ +/* + Copyright (c) 2020 Docker Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH + THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package context + +import ( + "github.com/spf13/cobra" + + cliopts "github.com/docker/api/cli/options" +) + +// Command manages contexts +func Command(opts *cliopts.GlobalOpts) *cobra.Command { + cmd := &cobra.Command{ + Use: "context", + Short: "Manage contexts", + } + + cmd.AddCommand( + createCommand(), + listCommand(), + removeCommand(), + useCommand(opts), + ) + + return cmd +} diff --git a/cli/cmd/context/create.go b/cli/cmd/context/create.go new file mode 100644 index 000000000..4c1a260da --- /dev/null +++ b/cli/cmd/context/create.go @@ -0,0 +1,48 @@ +package context + +import ( + "context" + + "github.com/spf13/cobra" + + "github.com/docker/api/context/store" +) + +type createOpts struct { + description string + aciLocation string + aciSubscriptionID string + aciResourceGroup string +} + +func createCommand() *cobra.Command { + var opts createOpts + cmd := &cobra.Command{ + Use: "create CONTEXT BACKEND [OPTIONS]", + Short: "Create a context", + Args: cobra.ExactArgs(2), + RunE: func(cmd *cobra.Command, args []string) error { + return runCreate(cmd.Context(), opts, args[0], args[1]) + }, + } + + cmd.Flags().StringVar(&opts.description, "description", "", "Description of the context") + cmd.Flags().StringVar(&opts.aciLocation, "aci-location", "eastus", "Location") + cmd.Flags().StringVar(&opts.aciSubscriptionID, "aci-subscription-id", "", "Location") + cmd.Flags().StringVar(&opts.aciResourceGroup, "aci-resource-group", "", "Resource group") + + return cmd +} + +func runCreate(ctx context.Context, opts createOpts, name string, contextType string) error { + switch contextType { + case "aci": + return createACIContext(ctx, name, opts) + default: + s := store.ContextStore(ctx) + return s.Create(name, store.TypedContext{ + Type: contextType, + Description: opts.description, + }) + } +} diff --git a/cli/cmd/context/createaci.go b/cli/cmd/context/createaci.go new file mode 100644 index 000000000..63a21edac --- /dev/null +++ b/cli/cmd/context/createaci.go @@ -0,0 +1,20 @@ +package context + +import ( + "context" + + "github.com/docker/api/context/store" +) + +func createACIContext(ctx context.Context, name string, opts createOpts) error { + s := store.ContextStore(ctx) + return s.Create(name, store.TypedContext{ + Type: "aci", + Description: opts.description, + Data: store.AciContext{ + SubscriptionID: opts.aciSubscriptionID, + Location: opts.aciLocation, + ResourceGroup: opts.aciResourceGroup, + }, + }) +} diff --git a/cli/cmd/context/ls.go b/cli/cmd/context/ls.go new file mode 100644 index 000000000..6240d1383 --- /dev/null +++ b/cli/cmd/context/ls.go @@ -0,0 +1,43 @@ +package context + +import ( + "context" + "fmt" + "os" + "text/tabwriter" + + "github.com/spf13/cobra" + + "github.com/docker/api/context/store" +) + +func listCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "List available contexts", + Aliases: []string{"ls"}, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + return runList(cmd.Context()) + }, + } + return cmd +} + +func runList(ctx context.Context) error { + s := store.ContextStore(ctx) + contexts, err := s.List() + if err != nil { + return err + } + + w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0) + fmt.Fprintln(w, "NAME\tDESCRIPTION\tTYPE") + format := "%s\t%s\t%s\n" + + for _, c := range contexts { + fmt.Fprintf(w, format, c.Name, c.Metadata.Description, c.Metadata.Type) + } + + return w.Flush() +} diff --git a/cli/cmd/context/rm.go b/cli/cmd/context/rm.go new file mode 100644 index 000000000..fd22e7b78 --- /dev/null +++ b/cli/cmd/context/rm.go @@ -0,0 +1,36 @@ +package context + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + + "github.com/docker/api/context/store" + "github.com/docker/api/multierror" +) + +func removeCommand() *cobra.Command { + return &cobra.Command{ + Use: "rm CONTEXT [CONTEXT...]", + Short: "Remove one or more contexts", + Aliases: []string{"remove"}, + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + return runRemove(cmd.Context(), args) + }, + } +} + +func runRemove(ctx context.Context, args []string) error { + s := store.ContextStore(ctx) + var errs *multierror.Error + for _, n := range args { + if err := s.Remove(n); err != nil { + errs = multierror.Append(errs, err) + } else { + fmt.Println(n) + } + } + return errs.ErrorOrNil() +} diff --git a/cli/cmd/context/use.go b/cli/cmd/context/use.go new file mode 100644 index 000000000..8d3b625b4 --- /dev/null +++ b/cli/cmd/context/use.go @@ -0,0 +1,38 @@ +package context + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + + cliconfig "github.com/docker/api/cli/config" + cliopts "github.com/docker/api/cli/options" + "github.com/docker/api/context/store" +) + +func useCommand(opts *cliopts.GlobalOpts) *cobra.Command { + return &cobra.Command{ + Use: "use CONTEXT", + Short: "Set the default context", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + return runUse(cmd.Context(), opts.Config, args[0]) + }, + } +} + +func runUse(ctx context.Context, configDir string, name string) error { + s := store.ContextStore(ctx) + // Match behavior of existing CLI + if name != store.DefaultContextName { + if _, err := s.Get(name, nil); err != nil { + return err + } + } + if err := cliconfig.WriteCurrentContext(configDir, name); err != nil { + return err + } + fmt.Println(name) + return nil +} diff --git a/cli/main.go b/cli/main.go index 649a799e6..bf9e9bdee 100644 --- a/cli/main.go +++ b/cli/main.go @@ -47,6 +47,7 @@ import ( "github.com/docker/api/cli/cmd" "github.com/docker/api/cli/cmd/compose" + contextcmd "github.com/docker/api/cli/cmd/context" "github.com/docker/api/cli/cmd/run" cliconfig "github.com/docker/api/cli/config" cliopts "github.com/docker/api/cli/options" @@ -100,7 +101,7 @@ func main() { } root.AddCommand( - cmd.ContextCommand(&opts), + contextcmd.Command(&opts), cmd.PsCommand(), cmd.ServeCommand(), run.Command(),