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  }