launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/cmd/juju/synctools.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	"github.com/loggo/loggo"
     8  	"launchpad.net/gnuflag"
     9  
    10  	"launchpad.net/juju-core/cmd"
    11  	"launchpad.net/juju-core/environs"
    12  	"launchpad.net/juju-core/environs/configstore"
    13  	"launchpad.net/juju-core/environs/filestorage"
    14  	"launchpad.net/juju-core/environs/sync"
    15  	"launchpad.net/juju-core/errors"
    16  	"launchpad.net/juju-core/version"
    17  )
    18  
    19  var syncTools = sync.SyncTools
    20  
    21  // SyncToolsCommand copies all the tools from the us-east-1 bucket to the local
    22  // bucket.
    23  type SyncToolsCommand struct {
    24  	cmd.EnvCommandBase
    25  	allVersions  bool
    26  	versionStr   string
    27  	majorVersion int
    28  	minorVersion int
    29  	dryRun       bool
    30  	dev          bool
    31  	public       bool
    32  	source       string
    33  	localDir     string
    34  }
    35  
    36  var _ cmd.Command = (*SyncToolsCommand)(nil)
    37  
    38  func (c *SyncToolsCommand) Info() *cmd.Info {
    39  	return &cmd.Info{
    40  		Name:    "sync-tools",
    41  		Purpose: "copy tools from the official tool store into a local environment",
    42  		Doc: `
    43  This copies the Juju tools tarball from the official tools store (located
    44  at https://streams.canonical.com/juju) into your environment.
    45  This is generally done when you want Juju to be able to run without having to
    46  access the Internet. Alternatively you can specify a local directory as source.
    47  
    48  Sometimes this is because the environment does not have public access,
    49  and sometimes you just want to avoid having to access data outside of
    50  the local cloud.
    51  `,
    52  	}
    53  }
    54  
    55  func (c *SyncToolsCommand) SetFlags(f *gnuflag.FlagSet) {
    56  	c.EnvCommandBase.SetFlags(f)
    57  	f.BoolVar(&c.allVersions, "all", false, "copy all versions, not just the latest")
    58  	f.StringVar(&c.versionStr, "version", "", "copy a specific major[.minor] version")
    59  	f.BoolVar(&c.dryRun, "dry-run", false, "don't copy, just print what would be copied")
    60  	f.BoolVar(&c.dev, "dev", false, "consider development versions as well as released ones")
    61  	f.BoolVar(&c.public, "public", false, "tools are for a public cloud, so generate mirrors information")
    62  	f.StringVar(&c.source, "source", "", "local source directory")
    63  	f.StringVar(&c.localDir, "local-dir", "", "local destination directory")
    64  }
    65  
    66  func (c *SyncToolsCommand) Init(args []string) error {
    67  	if c.versionStr != "" {
    68  		var err error
    69  		if c.majorVersion, c.minorVersion, err = version.ParseMajorMinor(c.versionStr); err != nil {
    70  			return err
    71  		}
    72  	}
    73  	return cmd.CheckEmpty(args)
    74  }
    75  
    76  func (c *SyncToolsCommand) Run(ctx *cmd.Context) (resultErr error) {
    77  	// Register writer for output on screen.
    78  	loggo.RegisterWriter("synctools", cmd.NewCommandLogWriter("juju.environs.sync", ctx.Stdout, ctx.Stderr), loggo.INFO)
    79  	defer loggo.RemoveWriter("synctools")
    80  	store, err := configstore.Default()
    81  	if err != nil {
    82  		return err
    83  	}
    84  	var existing bool
    85  	if _, err := store.ReadInfo(c.EnvName); !errors.IsNotFoundError(err) {
    86  		existing = true
    87  	}
    88  	environ, err := environs.PrepareFromName(c.EnvName, store)
    89  	if err != nil {
    90  		return err
    91  	}
    92  	if !existing {
    93  		defer destroyPreparedEnviron(environ, store, &resultErr, "Sync-tools")
    94  	}
    95  
    96  	target := environ.Storage()
    97  	if c.localDir != "" {
    98  		target, err = filestorage.NewFileStorageWriter(c.localDir, filestorage.UseDefaultTmpDir)
    99  		if err != nil {
   100  			return err
   101  		}
   102  	}
   103  
   104  	// Prepare syncing.
   105  	sctx := &sync.SyncContext{
   106  		Target:       target,
   107  		AllVersions:  c.allVersions,
   108  		MajorVersion: c.majorVersion,
   109  		MinorVersion: c.minorVersion,
   110  		DryRun:       c.dryRun,
   111  		Dev:          c.dev,
   112  		Public:       c.public,
   113  		Source:       c.source,
   114  	}
   115  	return syncTools(sctx)
   116  }