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 }