LEFT | RIGHT |
1 // Copyright 2013 Canonical Ltd. | 1 // Copyright 2013 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package main | 4 package main |
5 | 5 |
6 import ( | 6 import ( |
7 "fmt" | 7 "fmt" |
8 | 8 |
9 "launchpad.net/gnuflag" | 9 "launchpad.net/gnuflag" |
10 "launchpad.net/loggo" | 10 "launchpad.net/loggo" |
11 | 11 |
12 "launchpad.net/juju-core/cmd" | 12 "launchpad.net/juju-core/cmd" |
13 "launchpad.net/juju-core/environs/config" | 13 "launchpad.net/juju-core/environs/config" |
14 "launchpad.net/juju-core/environs/filestorage" | 14 "launchpad.net/juju-core/environs/filestorage" |
| 15 "launchpad.net/juju-core/environs/storage" |
15 "launchpad.net/juju-core/environs/sync" | 16 "launchpad.net/juju-core/environs/sync" |
16 "launchpad.net/juju-core/environs/tools" | 17 "launchpad.net/juju-core/environs/tools" |
17 "launchpad.net/juju-core/provider/ec2/httpstorage" | 18 "launchpad.net/juju-core/provider/ec2/httpstorage" |
| 19 coretools "launchpad.net/juju-core/tools" |
18 "launchpad.net/juju-core/utils" | 20 "launchpad.net/juju-core/utils" |
19 "launchpad.net/juju-core/version" | 21 "launchpad.net/juju-core/version" |
20 ) | 22 ) |
21 | 23 |
22 var DefaultToolsLocation = sync.DefaultToolsLocation | 24 var DefaultToolsLocation = sync.DefaultToolsLocation |
23 | 25 |
24 // ToolsMetadataCommand is used to generate simplestreams metadata for | 26 // ToolsMetadataCommand is used to generate simplestreams metadata for |
25 // juju tools. | 27 // juju tools. |
26 type ToolsMetadataCommand struct { | 28 type ToolsMetadataCommand struct { |
27 cmd.EnvCommandBase | 29 cmd.EnvCommandBase |
28 fetch bool | 30 fetch bool |
29 metadataDir string | 31 metadataDir string |
30 | 32 |
31 // noS3 is used in testing to disable the use of S3 public storage | 33 // noS3 is used in testing to disable the use of S3 public storage |
32 // as a backup. | 34 // as a backup. |
33 noS3 bool | 35 noS3 bool |
34 } | 36 } |
35 | 37 |
36 func (c *ToolsMetadataCommand) Info() *cmd.Info { | 38 func (c *ToolsMetadataCommand) Info() *cmd.Info { |
37 return &cmd.Info{ | 39 return &cmd.Info{ |
38 Name: "generate-tools", | 40 Name: "generate-tools", |
39 Purpose: "generate simplestreams tools metadata", | 41 Purpose: "generate simplestreams tools metadata", |
40 } | 42 } |
41 } | 43 } |
42 | 44 |
43 func (c *ToolsMetadataCommand) SetFlags(f *gnuflag.FlagSet) { | 45 func (c *ToolsMetadataCommand) SetFlags(f *gnuflag.FlagSet) { |
44 c.EnvCommandBase.SetFlags(f) | 46 c.EnvCommandBase.SetFlags(f) |
45 f.BoolVar(&c.fetch, "fetch", true, "fetch tools and compute content size
and hash") | |
46 f.StringVar(&c.metadataDir, "d", "", "local directory in which to store
metadata") | 47 f.StringVar(&c.metadataDir, "d", "", "local directory in which to store
metadata") |
47 } | 48 } |
48 | 49 |
49 func (c *ToolsMetadataCommand) Run(context *cmd.Context) error { | 50 func (c *ToolsMetadataCommand) Run(context *cmd.Context) error { |
50 loggo.RegisterWriter("toolsmetadata", cmd.NewCommandLogWriter("juju.envi
rons.tools", context.Stdout, context.Stderr), loggo.INFO) | 51 loggo.RegisterWriter("toolsmetadata", cmd.NewCommandLogWriter("juju.envi
rons.tools", context.Stdout, context.Stderr), loggo.INFO) |
51 defer loggo.RemoveWriter("toolsmetadata") | 52 defer loggo.RemoveWriter("toolsmetadata") |
52 if c.metadataDir == "" { | 53 if c.metadataDir == "" { |
53 c.metadataDir = config.JujuHome() | 54 c.metadataDir = config.JujuHome() |
54 } | 55 } |
55 c.metadataDir = utils.NormalizePath(c.metadataDir) | 56 c.metadataDir = utils.NormalizePath(c.metadataDir) |
(...skipping 10 matching lines...) Expand all Loading... |
66 toolsList, err = tools.ReadList(sourceStorage, version.Current.M
ajor, minorVersion) | 67 toolsList, err = tools.ReadList(sourceStorage, version.Current.M
ajor, minorVersion) |
67 } | 68 } |
68 if err != nil { | 69 if err != nil { |
69 return err | 70 return err |
70 } | 71 } |
71 | 72 |
72 targetStorage, err := filestorage.NewFileStorageWriter(c.metadataDir, fi
lestorage.UseDefaultTmpDir) | 73 targetStorage, err := filestorage.NewFileStorageWriter(c.metadataDir, fi
lestorage.UseDefaultTmpDir) |
73 if err != nil { | 74 if err != nil { |
74 return err | 75 return err |
75 } | 76 } |
76 » return tools.MergeAndWriteMetadata(targetStorage, toolsList, c.fetch) | 77 » return mergeAndWriteMetadata(targetStorage, toolsList) |
77 } | 78 } |
| 79 |
| 80 // This is essentially the same as tools.MergeAndWriteMetadata, but also |
| 81 // resolves metadata for existing tools by fetching them and computing |
| 82 // size/sha256 locally. |
| 83 func mergeAndWriteMetadata(stor storage.Storage, toolsList coretools.List) error
{ |
| 84 existing, err := tools.ReadMetadata(stor) |
| 85 if err != nil { |
| 86 return err |
| 87 } |
| 88 metadata := tools.MetadataFromTools(toolsList) |
| 89 if metadata, err = tools.MergeMetadata(metadata, existing); err != nil { |
| 90 return err |
| 91 } |
| 92 if err = tools.ResolveMetadata(stor, metadata); err != nil { |
| 93 return err |
| 94 } |
| 95 return tools.WriteMetadata(stor, metadata) |
| 96 } |
LEFT | RIGHT |