github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/model/exportbundle.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 package model 4 5 import ( 6 "fmt" 7 "os" 8 9 "github.com/juju/cmd" 10 "github.com/juju/errors" 11 "github.com/juju/gnuflag" 12 13 "github.com/juju/juju/api/bundle" 14 jujucmd "github.com/juju/juju/cmd" 15 "github.com/juju/juju/cmd/modelcmd" 16 ) 17 18 // NewExportBundleCommand returns a fully constructed export bundle command. 19 func NewExportBundleCommand() cmd.Command { 20 cmd := &exportBundleCommand{} 21 cmd.newAPIFunc = func() (ExportBundleAPI, error) { 22 return cmd.getAPI() 23 } 24 return modelcmd.Wrap(cmd) 25 } 26 27 type exportBundleCommand struct { 28 modelcmd.ModelCommandBase 29 out cmd.Output 30 newAPIFunc func() (ExportBundleAPI, error) 31 Filename string 32 } 33 34 const exportBundleHelpDoc = ` 35 Exports the current model configuration as a reusable bundle. 36 37 If --filename is not used, the configuration is printed to stdout. 38 --filename specifies an output file. 39 40 Examples: 41 42 juju export-bundle 43 juju export-bundle --filename mymodel.yaml 44 45 ` 46 47 // Info implements Command. 48 func (c *exportBundleCommand) Info() *cmd.Info { 49 return jujucmd.Info(&cmd.Info{ 50 Name: "export-bundle", 51 Purpose: "Exports the current model configuration as a reusable bundle.", 52 Doc: exportBundleHelpDoc, 53 }) 54 } 55 56 // SetFlags implements Command. 57 func (c *exportBundleCommand) SetFlags(f *gnuflag.FlagSet) { 58 c.ModelCommandBase.SetFlags(f) 59 f.StringVar(&c.Filename, "filename", "", "Bundle file") 60 } 61 62 // Init implements Command. 63 func (c *exportBundleCommand) Init(args []string) error { 64 return cmd.CheckEmpty(args) 65 } 66 67 // ExportBundleAPI specifies the used function calls of the BundleFacade. 68 type ExportBundleAPI interface { 69 Close() error 70 ExportBundle() (string, error) 71 } 72 73 func (c *exportBundleCommand) getAPI() (ExportBundleAPI, error) { 74 api, err := c.NewAPIRoot() 75 if err != nil { 76 return nil, err 77 } 78 79 return bundle.NewClient(api), nil 80 } 81 82 // Run implements Command. 83 func (c *exportBundleCommand) Run(ctx *cmd.Context) error { 84 client, err := c.newAPIFunc() 85 if err != nil { 86 return err 87 } 88 defer client.Close() 89 90 result, err := client.ExportBundle() 91 if err != nil { 92 return err 93 } 94 95 if c.Filename == "" { 96 _, err := fmt.Fprintf(ctx.Stdout, "%v", result) 97 return err 98 } 99 filename := c.Filename 100 file, err := os.Create(filename) 101 if err != nil { 102 return errors.Annotate(err, "while creating local file") 103 } 104 defer file.Close() 105 106 _, err = file.WriteString(result) 107 if err != nil { 108 return errors.Annotate(err, "while copying in local file") 109 } 110 111 fmt.Fprintln(ctx.Stdout, "Bundle successfully exported to", filename) 112 113 return nil 114 }