Merge lp:~wallyworld/juju-core/improve-image-metadata-command into lp:~go-bot/juju-core/trunk

Proposed by Ian Booth
Status: Merged
Approved by: Ian Booth
Approved revision: no longer in the source branch.
Merged at revision: 1987
Proposed branch: lp:~wallyworld/juju-core/improve-image-metadata-command
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 750 lines (+262/-148)
5 files modified
cmd/plugins/juju-metadata/imagemetadata.go (+99/-25)
cmd/plugins/juju-metadata/imagemetadata_test.go (+127/-66)
cmd/plugins/juju-metadata/validateimagemetadata_test.go (+22/-18)
environs/imagemetadata/generate.go (+9/-25)
environs/imagemetadata/validation_test.go (+5/-14)
To merge this branch: bzr merge lp:~wallyworld/juju-core/improve-image-metadata-command
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+190517@code.launchpad.net

Commit message

Improve the image metadata generation command

juju metadata generate-image was originally written
as a developer tool to aid simplestreams development.
It now is useful for setting up private clouds so has
been given a facelift to make it more user friendly.
The key feature is it will now use the current environment
to pick up most of what it needs, and the user just has to
supply the image id and architecture (if something different
to amd64 is required).

https://codereview.appspot.com/14502059/

Description of the change

Improve the image metadata generation command

juju metadata generate-image was originally written
as a developer tool to aid simplestreams development.
It now is useful for setting up private clouds so has
been given a facelift to make it more user friendly.
The key feature is it will now use the current environment
to pick up most of what it needs, and the user just has to
supply the image id and architecture (if something different
to amd64 is required).

https://codereview.appspot.com/14502059/

To post a comment you must log in.
Revision history for this message
Ian Booth (wallyworld) wrote :

Reviewers: mp+190517_code.launchpad.net,

Message:
Please take a look.

Description:
Improve the image metadata generation command

juju metadata generate-image was originally written
as a developer tool to aid simplestreams development.
It now is useful for setting up private clouds so has
been given a facelift to make it more user friendly.
The key feature is it will now use the current environment
to pick up most of what it needs, and the user just has to
supply the image id and architecture (if something different
to amd64 is required).

https://code.launchpad.net/~wallyworld/juju-core/improve-image-metadata-command/+merge/190517

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/14502059/

Affected files (+202, -133 lines):
   A [revision details]
   M cmd/plugins/juju-metadata/imagemetadata.go
   M cmd/plugins/juju-metadata/imagemetadata_test.go
   M cmd/plugins/juju-metadata/validateimagemetadata_test.go
   M environs/imagemetadata/generate.go

Revision history for this message
Andrew Wilkins (axwalk) wrote :

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata.go
File cmd/plugins/juju-metadata/imagemetadata.go (right):

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata.go#newcode72
cmd/plugins/juju-metadata/imagemetadata.go:72: return
fmt.Errorf("environment %q cannot provide region and endpoint",
environ.Name())
What if the user has specified -s, -r, and -e on the command line? Is
this
really an error then?

Just a thought: perhaps ImageMetadataCommand could implement HasRegion.
If environ doesn't implement HasRegion, fall back to
ImageMetadataCommand.

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go
File cmd/plugins/juju-metadata/imagemetadata_test.go (right):

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go#newcode20
cmd/plugins/juju-metadata/imagemetadata_test.go:20: "path/filepath"
Move me please

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go#newcode42
cmd/plugins/juju-metadata/imagemetadata_test.go:42: restore :=
testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
You can just use s.PatchEnvironment here, which wraps
testbase.PatchEnvironment & AddCleanup.

https://codereview.appspot.com/14502059/

Revision history for this message
Ian Booth (wallyworld) wrote :

Please take a look.

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata.go
File cmd/plugins/juju-metadata/imagemetadata.go (right):

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata.go#newcode72
cmd/plugins/juju-metadata/imagemetadata.go:72: return
fmt.Errorf("environment %q cannot provide region and endpoint",
environ.Name())
On 2013/10/15 07:08:34, axw wrote:
> What if the user has specified -s, -r, and -e on the command line? Is
this
> really an error then?

Hmmm. I thought yes when I wrote this. But I changed it so that it works
more as expected.

> Just a thought: perhaps ImageMetadataCommand could implement
HasRegion. If
> environ doesn't implement HasRegion, fall back to
ImageMetadataCommand.

See my changes - I think it's ok as is.

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go
File cmd/plugins/juju-metadata/imagemetadata_test.go (right):

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go#newcode20
cmd/plugins/juju-metadata/imagemetadata_test.go:20: "path/filepath"
On 2013/10/15 07:08:34, axw wrote:
> Move me please

Done.

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go#newcode42
cmd/plugins/juju-metadata/imagemetadata_test.go:42: restore :=
testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
On 2013/10/15 07:08:34, axw wrote:
> You can just use s.PatchEnvironment here, which wraps
testbase.PatchEnvironment
> & AddCleanup.

Done.

https://codereview.appspot.com/14502059/

Revision history for this message
Andrew Wilkins (axwalk) wrote :

On 2013/10/16 02:57:49, wallyworld wrote:
> Please take a look.

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata.go
> File cmd/plugins/juju-metadata/imagemetadata.go (right):

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata.go#newcode72
> cmd/plugins/juju-metadata/imagemetadata.go:72: return
fmt.Errorf("environment %q
> cannot provide region and endpoint", environ.Name())
> On 2013/10/15 07:08:34, axw wrote:
> > What if the user has specified -s, -r, and -e on the command line?
Is this
> > really an error then?
> >

> Hmmm. I thought yes when I wrote this. But I changed it so that it
works more as
> expected.

> > Just a thought: perhaps ImageMetadataCommand could implement
HasRegion. If
> > environ doesn't implement HasRegion, fall back to
ImageMetadataCommand.

> See my changes - I think it's ok as is.

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go
> File cmd/plugins/juju-metadata/imagemetadata_test.go (right):

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go#newcode20
> cmd/plugins/juju-metadata/imagemetadata_test.go:20: "path/filepath"
> On 2013/10/15 07:08:34, axw wrote:
> > Move me please

> Done.

https://codereview.appspot.com/14502059/diff/1/cmd/plugins/juju-metadata/imagemetadata_test.go#newcode42
> cmd/plugins/juju-metadata/imagemetadata_test.go:42: restore :=
> testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
> On 2013/10/15 07:08:34, axw wrote:
> > You can just use s.PatchEnvironment here, which wraps
> testbase.PatchEnvironment
> > & AddCleanup.

> Done.

Thanks, LGTM

https://codereview.appspot.com/14502059/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cmd/plugins/juju-metadata/imagemetadata.go'
--- cmd/plugins/juju-metadata/imagemetadata.go 2013-08-07 04:37:43 +0000
+++ cmd/plugins/juju-metadata/imagemetadata.go 2013-10-16 02:57:31 +0000
@@ -5,51 +5,102 @@
55
6import (6import (
7 "fmt"7 "fmt"
8 "strings"8 "os"
9 "path/filepath"
910
10 "launchpad.net/gnuflag"11 "launchpad.net/gnuflag"
11 "launchpad.net/goose/identity"
1212
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/environs"
14 "launchpad.net/juju-core/environs/config"15 "launchpad.net/juju-core/environs/config"
16 "launchpad.net/juju-core/environs/configstore"
15 "launchpad.net/juju-core/environs/imagemetadata"17 "launchpad.net/juju-core/environs/imagemetadata"
16 "launchpad.net/juju-core/environs/simplestreams"18 "launchpad.net/juju-core/environs/simplestreams"
17)19)
1820
19// ImageMetadataCommand is used to write out a boilerplate environments.yaml file.21// ImageMetadataCommand is used to write out simplestreams image metadata information.
20type ImageMetadataCommand struct {22type ImageMetadataCommand struct {
21 cmd.CommandBase23 cmd.EnvCommandBase
22 Name string24 Dir string
23 Series string25 Series string
24 Arch string26 Arch string
25 ImageId string27 ImageId string
26 Region string28 Region string
27 Endpoint string29 Endpoint string
30 privateStorage string
28}31}
2932
33var imageMetadataDoc = `
34generate-image creates simplestreams image metadata for the specified cloud.
35
36The cloud specification comes from the current Juju environment, as specified in
37the usual way from either ~/.juju/environments.yaml, the -e option, or JUJU_ENV.
38
39Using command arguments, it is possible to override cloud attributes region, endpoint, and series.
40By default, "amd64" is used for the architecture but this may also be changed.
41`
42
30func (c *ImageMetadataCommand) Info() *cmd.Info {43func (c *ImageMetadataCommand) Info() *cmd.Info {
31 return &cmd.Info{44 return &cmd.Info{
32 Name: "generate-image",45 Name: "generate-image",
33 Purpose: "generate simplestreams image metadata",46 Purpose: "generate simplestreams image metadata",
47 Doc: imageMetadataDoc,
34 }48 }
35}49}
3650
37func (c *ImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {51func (c *ImageMetadataCommand) SetFlags(f *gnuflag.FlagSet) {
38 f.StringVar(&c.Series, "s", "precise", "the charm series")52 c.EnvCommandBase.SetFlags(f)
53 f.StringVar(&c.Series, "s", "", "the charm series")
39 f.StringVar(&c.Arch, "a", "amd64", "the image achitecture")54 f.StringVar(&c.Arch, "a", "amd64", "the image achitecture")
40 f.StringVar(&c.Name, "n", "", "the cloud name, as a prefix for the generated file names")55 f.StringVar(&c.Dir, "d", "", "the destination directory in which to place the metadata files")
41 f.StringVar(&c.ImageId, "i", "", "the image id")56 f.StringVar(&c.ImageId, "i", "", "the image id")
42 f.StringVar(&c.Region, "r", "", "the region")57 f.StringVar(&c.Region, "r", "", "the region")
43 f.StringVar(&c.Endpoint, "u", "", "the cloud endpoint (for Openstack, this is the Identity Service endpoint)")58 f.StringVar(&c.Endpoint, "u", "", "the cloud endpoint (for Openstack, this is the Identity Service endpoint)")
44}59}
4560
46func (c *ImageMetadataCommand) Init(args []string) error {61func (c *ImageMetadataCommand) Init(args []string) error {
47 cred := identity.CredentialsFromEnv()62 c.privateStorage = "<private storage name>"
48 if c.Region == "" {63 var environ environs.Environ
49 c.Region = cred.Region64 if store, err := configstore.Default(); err == nil {
50 }65 if environ, err = environs.PrepareFromName(c.EnvName, store); err == nil {
51 if c.Endpoint == "" {66 logger.Infof("creating image metadata for environment %q", environ.Name())
52 c.Endpoint = cred.URL67 // If the user has not specified region and endpoint, try and get it from the environment.
68 if c.Region == "" || c.Endpoint == "" {
69 var cloudSpec simplestreams.CloudSpec
70 if inst, ok := environ.(simplestreams.HasRegion); ok {
71 if cloudSpec, err = inst.Region(); err != nil {
72 return err
73 }
74 } else {
75 return fmt.Errorf("environment %q cannot provide region and endpoint", environ.Name())
76 }
77 // If only one of region or endpoint is provided, that is a problem.
78 if cloudSpec.Region != cloudSpec.Endpoint && (cloudSpec.Region == "" || cloudSpec.Endpoint == "") {
79 return fmt.Errorf("cannot generate metadata without a complete cloud configuration")
80 }
81 if c.Region == "" {
82 c.Region = cloudSpec.Region
83 }
84 if c.Endpoint == "" {
85 c.Endpoint = cloudSpec.Endpoint
86 }
87 }
88 cfg := environ.Config()
89 if c.Series == "" {
90 c.Series = cfg.DefaultSeries()
91 }
92 if v, ok := cfg.AllAttrs()["control-bucket"]; ok {
93 c.privateStorage = v.(string)
94 }
95 } else {
96 logger.Warningf("environment %q could not be opened: %v", c.EnvName, err)
97 }
98 }
99 if environ == nil {
100 logger.Infof("no environment found, creating image metadata using user supplied data")
101 }
102 if c.Series == "" {
103 c.Series = config.DefaultSeries
53 }104 }
54 if c.ImageId == "" {105 if c.ImageId == "" {
55 return fmt.Errorf("image id must be specified")106 return fmt.Errorf("image id must be specified")
@@ -60,10 +111,36 @@
60 if c.Endpoint == "" {111 if c.Endpoint == "" {
61 return fmt.Errorf("cloud endpoint URL must be specified")112 return fmt.Errorf("cloud endpoint URL must be specified")
62 }113 }
114 if c.Dir == "" {
115 logger.Infof("no destination directory specified, using current directory")
116 var err error
117 if c.Dir, err = os.Getwd(); err != nil {
118 return err
119 }
120 }
63121
64 return cmd.CheckEmpty(args)122 return cmd.CheckEmpty(args)
65}123}
66124
125var helpDoc = `
126image metadata files have been written to:
127%q.
128For Juju to use this metadata, the files need to be put into the
129image metadata search path. There are 2 options:
130
1311. Use tools-url in $JUJU_HOME/environments.yaml
132Configure a http server to serve the contents of
133%q
134and set the value of tools-url accordingly.
135
1362. Upload the contents of
137%q
138to your cloud's private storage (for ec2 and openstack).
139eg for openstack
140"cd %s; swift upload %s streams/v1/*"
141
142`
143
67func (c *ImageMetadataCommand) Run(context *cmd.Context) error {144func (c *ImageMetadataCommand) Run(context *cmd.Context) error {
68 out := context.Stdout145 out := context.Stdout
69146
@@ -75,14 +152,11 @@
75 Region: c.Region,152 Region: c.Region,
76 Endpoint: c.Endpoint,153 Endpoint: c.Endpoint,
77 }154 }
78 files, err := imagemetadata.Boilerplate(c.Name, c.Series, &im, &cloudSpec)155 _, err := imagemetadata.GenerateMetadata(c.Series, &im, &cloudSpec, c.Dir)
79 if err != nil {156 if err != nil {
80 return fmt.Errorf("boilerplate image metadata files could not be created: %v", err)157 return fmt.Errorf("image metadata files could not be created: %v", err)
81 }158 }
82 fmt.Fprintf(159 dest := filepath.Join(c.Dir, "streams", "v1")
83 out,160 fmt.Fprintf(out, fmt.Sprintf(helpDoc, dest, c.Dir, c.Dir, c.Dir, c.privateStorage))
84 "Boilerplate image metadata files %q have been written to %s.\n", strings.Join(files, ", "), config.JujuHome())
85 fmt.Fprintf(out, `Copy the files to the path "streams/v1" in your cloud's public bucket.`)
86 fmt.Fprintln(out, "")
87 return nil161 return nil
88}162}
89163
=== modified file 'cmd/plugins/juju-metadata/imagemetadata_test.go'
--- cmd/plugins/juju-metadata/imagemetadata_test.go 2013-07-30 23:18:16 +0000
+++ cmd/plugins/juju-metadata/imagemetadata_test.go 2013-10-16 02:57:31 +0000
@@ -9,26 +9,45 @@
9 "fmt"9 "fmt"
10 "io/ioutil"10 "io/ioutil"
11 "os"11 "os"
12 "path/filepath"
12 "strings"13 "strings"
1314
14 gc "launchpad.net/gocheck"15 gc "launchpad.net/gocheck"
1516
16 "launchpad.net/juju-core/cmd"17 "launchpad.net/juju-core/cmd"
17 "launchpad.net/juju-core/testing"18 "launchpad.net/juju-core/testing"
19 jc "launchpad.net/juju-core/testing/checkers"
20 "launchpad.net/juju-core/testing/testbase"
18)21)
1922
20type ImageMetadataSuite struct {23type ImageMetadataSuite struct {
24 testbase.LoggingSuite
21 environ []string25 environ []string
26 home *testing.FakeHome
27 dir string
22}28}
2329
24var _ = gc.Suite(&ImageMetadataSuite{})30var _ = gc.Suite(&ImageMetadataSuite{})
2531
26func (s *ImageMetadataSuite) SetUpSuite(c *gc.C) {32func (s *ImageMetadataSuite) SetUpSuite(c *gc.C) {
33 s.LoggingSuite.SetUpSuite(c)
27 s.environ = os.Environ()34 s.environ = os.Environ()
28}35}
2936
30func (s *ImageMetadataSuite) SetUpTest(c *gc.C) {37func (s *ImageMetadataSuite) SetUpTest(c *gc.C) {
38 s.LoggingSuite.SetUpTest(c)
31 os.Clearenv()39 os.Clearenv()
40 s.dir = c.MkDir()
41 // Create a fake certificate so azure test environment can be opened.
42 certfile, err := ioutil.TempFile(s.dir, "")
43 c.Assert(err, gc.IsNil)
44 filename := certfile.Name()
45 err = ioutil.WriteFile(filename, []byte("test certificate"), 0644)
46 c.Assert(err, gc.IsNil)
47 envConfig := strings.Replace(metadataTestEnvConfig, "/home/me/azure.pem", filename, -1)
48 s.home = testing.MakeFakeHome(c, envConfig)
49 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
50 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret")
32}51}
3352
34func (s *ImageMetadataSuite) TearDownTest(c *gc.C) {53func (s *ImageMetadataSuite) TearDownTest(c *gc.C) {
@@ -36,6 +55,8 @@
36 kv := strings.SplitN(envstring, "=", 2)55 kv := strings.SplitN(envstring, "=", 2)
37 os.Setenv(kv[0], kv[1])56 os.Setenv(kv[0], kv[1])
38 }57 }
58 s.home.Restore()
59 s.LoggingSuite.TearDownTest(c)
39}60}
4061
41var seriesVersions map[string]string = map[string]string{62var seriesVersions map[string]string = map[string]string{
@@ -43,31 +64,46 @@
43 "raring": "13.04",64 "raring": "13.04",
44}65}
4566
46func (*ImageMetadataSuite) assertCommandOutput(c *gc.C, errOut, series, arch, indexFileName, imageFileName string) {67type expectedMetadata struct {
68 series string
69 arch string
70 region string
71 endpoint string
72}
73
74func (s *ImageMetadataSuite) assertCommandOutput(c *gc.C, expected expectedMetadata, errOut, indexFileName, imageFileName string) {
75 if expected.region == "" {
76 expected.region = "region"
77 }
78 if expected.endpoint == "" {
79 expected.endpoint = "endpoint"
80 }
47 strippedOut := strings.Replace(errOut, "\n", "", -1)81 strippedOut := strings.Replace(errOut, "\n", "", -1)
48 c.Check(strippedOut, gc.Matches, `Boilerplate image metadata files.*have been written.*Copy the files.*`)82 c.Check(strippedOut, gc.Matches, `image metadata files have been written to.*`)
49 indexpath := testing.HomePath(".juju", indexFileName)83 indexpath := filepath.Join(s.dir, "streams", "v1", indexFileName)
50 data, err := ioutil.ReadFile(indexpath)84 data, err := ioutil.ReadFile(indexpath)
51 c.Assert(err, gc.IsNil)85 c.Assert(err, gc.IsNil)
86 content := string(data)
52 var indices interface{}87 var indices interface{}
53 err = json.Unmarshal(data, &indices)88 err = json.Unmarshal(data, &indices)
54 c.Assert(err, gc.IsNil)89 c.Assert(err, gc.IsNil)
55 c.Assert(indices.(map[string]interface{})["format"], gc.Equals, "index:1.0")90 c.Assert(indices.(map[string]interface{})["format"], gc.Equals, "index:1.0")
56 prodId := fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", seriesVersions[series], arch)91 prodId := fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", seriesVersions[expected.series], expected.arch)
57 c.Assert(strings.Contains(string(data), prodId), gc.Equals, true)92 c.Assert(strings.Contains(content, prodId), jc.IsTrue)
58 c.Assert(strings.Contains(string(data), `"region": "region"`), gc.Equals, true)93 c.Assert(strings.Contains(content, fmt.Sprintf(`"region": %q`, expected.region)), jc.IsTrue)
59 c.Assert(strings.Contains(string(data), `"endpoint": "endpoint"`), gc.Equals, true)94 c.Assert(strings.Contains(content, fmt.Sprintf(`"endpoint": %q`, expected.endpoint)), jc.IsTrue)
60 c.Assert(strings.Contains(string(data), fmt.Sprintf(`"path": "streams/v1/%s"`, imageFileName)), gc.Equals, true)95 c.Assert(strings.Contains(content, fmt.Sprintf(`"path": "streams/v1/%s"`, imageFileName)), jc.IsTrue)
6196
62 imagepath := testing.HomePath(".juju", imageFileName)97 imagepath := filepath.Join(s.dir, "streams", "v1", imageFileName)
63 data, err = ioutil.ReadFile(imagepath)98 data, err = ioutil.ReadFile(imagepath)
64 c.Assert(err, gc.IsNil)99 c.Assert(err, gc.IsNil)
100 content = string(data)
65 var images interface{}101 var images interface{}
66 err = json.Unmarshal(data, &images)102 err = json.Unmarshal(data, &images)
67 c.Assert(err, gc.IsNil)103 c.Assert(err, gc.IsNil)
68 c.Assert(images.(map[string]interface{})["format"], gc.Equals, "products:1.0")104 c.Assert(images.(map[string]interface{})["format"], gc.Equals, "products:1.0")
69 c.Assert(strings.Contains(string(data), prodId), gc.Equals, true)105 c.Assert(strings.Contains(content, prodId), gc.Equals, true)
70 c.Assert(strings.Contains(string(data), `"id": "1234"`), gc.Equals, true)106 c.Assert(strings.Contains(content, `"id": "1234"`), gc.Equals, true)
71}107}
72108
73const (109const (
@@ -76,71 +112,92 @@
76)112)
77113
78func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) {114func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) {
79 defer testing.MakeEmptyFakeHome(c).Restore()115 ctx := testing.Context(c)
80116 code := cmd.Main(
81 ctx := testing.Context(c)117 &ImageMetadataCommand{}, ctx, []string{
82 code := cmd.Main(118 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"})
83 &ImageMetadataCommand{}, ctx, []string{"-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"})119 c.Assert(code, gc.Equals, 0)
84 c.Assert(code, gc.Equals, 0)120 errOut := ctx.Stdout.(*bytes.Buffer).String()
85 errOut := ctx.Stdout.(*bytes.Buffer).String()121 expected := expectedMetadata{
86 s.assertCommandOutput(c, errOut, "raring", "arch", defaultIndexFileName, defaultImageFileName)122 series: "raring",
87}123 arch: "arch",
88124 }
89func (s *ImageMetadataSuite) TestImageMetadataFilesWithName(c *gc.C) {125 s.assertCommandOutput(c, expected, errOut, defaultIndexFileName, defaultImageFileName)
90 defer testing.MakeEmptyFakeHome(c).Restore()
91
92 ctx := testing.Context(c)
93 code := cmd.Main(
94 &ImageMetadataCommand{}, ctx, []string{"-n", "foo", "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"})
95 c.Assert(code, gc.Equals, 0)
96 errOut := ctx.Stdout.(*bytes.Buffer).String()
97 s.assertCommandOutput(c, errOut, "raring", "arch", "foo-"+defaultIndexFileName, "foo-"+defaultImageFileName)
98}126}
99127
100func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) {128func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) {
101 defer testing.MakeEmptyFakeHome(c).Restore()
102
103 ctx := testing.Context(c)129 ctx := testing.Context(c)
104 code := cmd.Main(130 code := cmd.Main(
105 &ImageMetadataCommand{}, ctx, []string{"-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"})131 &ImageMetadataCommand{}, ctx, []string{
132 "-d", s.dir, "-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"})
106 c.Assert(code, gc.Equals, 0)133 c.Assert(code, gc.Equals, 0)
107 errOut := ctx.Stdout.(*bytes.Buffer).String()134 errOut := ctx.Stdout.(*bytes.Buffer).String()
108 s.assertCommandOutput(c, errOut, "raring", "amd64", defaultIndexFileName, defaultImageFileName)135 expected := expectedMetadata{
136 series: "raring",
137 arch: "amd64",
138 }
139 s.assertCommandOutput(c, expected, errOut, defaultIndexFileName, defaultImageFileName)
109}140}
110141
111func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultSeries(c *gc.C) {142func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultSeries(c *gc.C) {
112 defer testing.MakeEmptyFakeHome(c).Restore()143 ctx := testing.Context(c)
113144 code := cmd.Main(
114 ctx := testing.Context(c)145 &ImageMetadataCommand{}, ctx, []string{
115 code := cmd.Main(146 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"})
116 &ImageMetadataCommand{}, ctx, []string{"-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"})147 c.Assert(code, gc.Equals, 0)
117 c.Assert(code, gc.Equals, 0)148 errOut := ctx.Stdout.(*bytes.Buffer).String()
118 errOut := ctx.Stdout.(*bytes.Buffer).String()149 expected := expectedMetadata{
119 s.assertCommandOutput(c, errOut, "precise", "arch", defaultIndexFileName, defaultImageFileName)150 series: "precise",
120}151 arch: "arch",
121152 }
122func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvRegion(c *gc.C) {153 s.assertCommandOutput(c, expected, errOut, defaultIndexFileName, defaultImageFileName)
123 defer testing.MakeEmptyFakeHome(c).Restore()154}
124155
125 os.Setenv("OS_REGION_NAME", "region")156func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnv(c *gc.C) {
126 ctx := testing.Context(c)157 ctx := testing.Context(c)
127 code := cmd.Main(158 code := cmd.Main(
128 &ImageMetadataCommand{}, ctx, []string{"-i", "1234", "-u", "endpoint"})159 &ImageMetadataCommand{}, ctx, []string{"-d", s.dir, "-e", "ec2", "-i", "1234"})
129 c.Assert(code, gc.Equals, 0)160 c.Assert(code, gc.Equals, 0)
130 errOut := ctx.Stdout.(*bytes.Buffer).String()161 errOut := ctx.Stdout.(*bytes.Buffer).String()
131 s.assertCommandOutput(c, errOut, "precise", "amd64", defaultIndexFileName, defaultImageFileName)162 expected := expectedMetadata{
132}163 series: "precise",
133164 arch: "amd64",
134func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvEndpoint(c *gc.C) {165 region: "us-east-1",
135 defer testing.MakeEmptyFakeHome(c).Restore()166 endpoint: "https://ec2.us-east-1.amazonaws.com",
136167 }
137 os.Setenv("OS_AUTH_URL", "endpoint")168 s.assertCommandOutput(c, expected, errOut, defaultIndexFileName, defaultImageFileName)
138 ctx := testing.Context(c)169}
139 code := cmd.Main(170
140 &ImageMetadataCommand{}, ctx, []string{"-i", "1234", "-r", "region"})171func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithRegionOverride(c *gc.C) {
141 c.Assert(code, gc.Equals, 0)172 ctx := testing.Context(c)
142 errOut := ctx.Stdout.(*bytes.Buffer).String()173 code := cmd.Main(
143 s.assertCommandOutput(c, errOut, "precise", "amd64", defaultIndexFileName, defaultImageFileName)174 &ImageMetadataCommand{}, ctx, []string{
175 "-d", s.dir, "-e", "ec2", "-r", "us-west-1", "-u", "https://ec2.us-west-1.amazonaws.com", "-i", "1234"})
176 c.Assert(code, gc.Equals, 0)
177 errOut := ctx.Stdout.(*bytes.Buffer).String()
178 expected := expectedMetadata{
179 series: "precise",
180 arch: "amd64",
181 region: "us-west-1",
182 endpoint: "https://ec2.us-west-1.amazonaws.com",
183 }
184 s.assertCommandOutput(c, expected, errOut, defaultIndexFileName, defaultImageFileName)
185}
186
187func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithNoHasRegion(c *gc.C) {
188 ctx := testing.Context(c)
189 code := cmd.Main(
190 &ImageMetadataCommand{}, ctx, []string{
191 "-d", s.dir, "-e", "azure", "-r", "region", "-u", "endpoint", "-i", "1234"})
192 c.Assert(code, gc.Equals, 0)
193 errOut := ctx.Stdout.(*bytes.Buffer).String()
194 expected := expectedMetadata{
195 series: "raring",
196 arch: "amd64",
197 region: "region",
198 endpoint: "endpoint",
199 }
200 s.assertCommandOutput(c, expected, errOut, defaultIndexFileName, defaultImageFileName)
144}201}
145202
146type errTestParams struct {203type errTestParams struct {
@@ -160,6 +217,10 @@
160 // Missing endpoint217 // Missing endpoint
161 args: []string{"-i", "1234", "-u", "endpoint", "-a", "arch", "-s", "precise"},218 args: []string{"-i", "1234", "-u", "endpoint", "-a", "arch", "-s", "precise"},
162 },219 },
220 {
221 // Missing endpoint/region for environment with no HasRegion interface
222 args: []string{"-i", "1234", "-e", "azure"},
223 },
163}224}
164225
165func (s *ImageMetadataSuite) TestImageMetadataBadArgs(c *gc.C) {226func (s *ImageMetadataSuite) TestImageMetadataBadArgs(c *gc.C) {
166227
=== modified file 'cmd/plugins/juju-metadata/validateimagemetadata_test.go'
--- cmd/plugins/juju-metadata/validateimagemetadata_test.go 2013-10-10 11:40:54 +0000
+++ cmd/plugins/juju-metadata/validateimagemetadata_test.go 2013-10-16 02:57:31 +0000
@@ -11,7 +11,6 @@
11 gc "launchpad.net/gocheck"11 gc "launchpad.net/gocheck"
1212
13 "launchpad.net/juju-core/cmd"13 "launchpad.net/juju-core/cmd"
14 "launchpad.net/juju-core/environs/config"
15 "launchpad.net/juju-core/environs/imagemetadata"14 "launchpad.net/juju-core/environs/imagemetadata"
16 "launchpad.net/juju-core/environs/simplestreams"15 "launchpad.net/juju-core/environs/simplestreams"
17 coretesting "launchpad.net/juju-core/testing"16 coretesting "launchpad.net/juju-core/testing"
@@ -20,7 +19,8 @@
2019
21type ValidateImageMetadataSuite struct {20type ValidateImageMetadataSuite struct {
22 testbase.LoggingSuite21 testbase.LoggingSuite
23 home *coretesting.FakeHome22 home *coretesting.FakeHome
23 metadataDir string
24}24}
2525
26var _ = gc.Suite(&ValidateImageMetadataSuite{})26var _ = gc.Suite(&ValidateImageMetadataSuite{})
@@ -73,7 +73,7 @@
73 Region: region,73 Region: region,
74 Endpoint: endpoint,74 Endpoint: endpoint,
75 }75 }
76 _, err := imagemetadata.MakeBoilerplate("", series, &im, &cloudSpec, false)76 _, err := imagemetadata.GenerateMetadata(series, &im, &cloudSpec, s.metadataDir)
77 if err != nil {77 if err != nil {
78 return err78 return err
79 }79 }
@@ -84,13 +84,21 @@
84environments:84environments:
85 ec2:85 ec2:
86 type: ec286 type: ec2
87 control-bucket: foo
88 default-series: precise87 default-series: precise
89 region: us-east-188 region: us-east-1
89
90 azure:
91 type: azure
92 default-series: raring
93 location: US West
94 management-subscription-id: foo
95 storage-account-name: bar
96 management-certificate-path: /home/me/azure.pem
90`97`
9198
92func (s *ValidateImageMetadataSuite) SetUpTest(c *gc.C) {99func (s *ValidateImageMetadataSuite) SetUpTest(c *gc.C) {
93 s.LoggingSuite.SetUpTest(c)100 s.LoggingSuite.SetUpTest(c)
101 s.metadataDir = c.MkDir()
94 s.home = coretesting.MakeFakeHome(c, metadataTestEnvConfig)102 s.home = coretesting.MakeFakeHome(c, metadataTestEnvConfig)
95 restore := testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")103 restore := testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
96 s.AddCleanup(func(*gc.C) { restore() })104 s.AddCleanup(func(*gc.C) { restore() })
@@ -115,9 +123,8 @@
115func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) {123func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) {
116 s.setupEc2LocalMetadata(c, "us-east-1")124 s.setupEc2LocalMetadata(c, "us-east-1")
117 ctx := coretesting.Context(c)125 ctx := coretesting.Context(c)
118 metadataDir := config.JujuHomePath("")
119 code := cmd.Main(126 code := cmd.Main(
120 &ValidateImageMetadataCommand{}, ctx, []string{"-e", "ec2", "-d", metadataDir},127 &ValidateImageMetadataCommand{}, ctx, []string{"-e", "ec2", "-d", s.metadataDir},
121 )128 )
122 c.Assert(code, gc.Equals, 0)129 c.Assert(code, gc.Equals, 0)
123 errOut := ctx.Stdout.(*bytes.Buffer).String()130 errOut := ctx.Stdout.(*bytes.Buffer).String()
@@ -128,11 +135,12 @@
128func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) {135func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) {
129 testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "")136 testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "")
130 testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "")137 testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "")
138 testbase.PatchEnvironment("EC2_ACCESS_KEY", "")
139 testbase.PatchEnvironment("EC2_SECRET_KEY", "")
131 s.setupEc2LocalMetadata(c, "us-east-1")140 s.setupEc2LocalMetadata(c, "us-east-1")
132 ctx := coretesting.Context(c)141 ctx := coretesting.Context(c)
133 metadataDir := config.JujuHomePath("")
134 code := cmd.Main(142 code := cmd.Main(
135 &ValidateImageMetadataCommand{}, ctx, []string{"-e", "ec2", "-d", metadataDir},143 &ValidateImageMetadataCommand{}, ctx, []string{"-e", "ec2", "-d", s.metadataDir},
136 )144 )
137 c.Assert(code, gc.Equals, 1)145 c.Assert(code, gc.Equals, 1)
138 errOut := ctx.Stderr.(*bytes.Buffer).String()146 errOut := ctx.Stderr.(*bytes.Buffer).String()
@@ -143,11 +151,10 @@
143func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) {151func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) {
144 s.setupEc2LocalMetadata(c, "us-west-1")152 s.setupEc2LocalMetadata(c, "us-west-1")
145 ctx := coretesting.Context(c)153 ctx := coretesting.Context(c)
146 metadataDir := config.JujuHomePath("")
147 code := cmd.Main(154 code := cmd.Main(
148 &ValidateImageMetadataCommand{}, ctx, []string{155 &ValidateImageMetadataCommand{}, ctx, []string{
149 "-p", "ec2", "-s", "precise", "-r", "us-west-1",156 "-p", "ec2", "-s", "precise", "-r", "us-west-1",
150 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", metadataDir},157 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
151 )158 )
152 c.Assert(code, gc.Equals, 0)159 c.Assert(code, gc.Equals, 0)
153 errOut := ctx.Stdout.(*bytes.Buffer).String()160 errOut := ctx.Stdout.(*bytes.Buffer).String()
@@ -158,17 +165,16 @@
158func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) {165func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) {
159 s.setupEc2LocalMetadata(c, "us-east-1")166 s.setupEc2LocalMetadata(c, "us-east-1")
160 ctx := coretesting.Context(c)167 ctx := coretesting.Context(c)
161 metadataDir := config.JujuHomePath("")
162 code := cmd.Main(168 code := cmd.Main(
163 &ValidateImageMetadataCommand{}, ctx, []string{169 &ValidateImageMetadataCommand{}, ctx, []string{
164 "-p", "ec2", "-s", "raring", "-r", "us-west-1",170 "-p", "ec2", "-s", "raring", "-r", "us-west-1",
165 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", metadataDir},171 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
166 )172 )
167 c.Assert(code, gc.Equals, 1)173 c.Assert(code, gc.Equals, 1)
168 code = cmd.Main(174 code = cmd.Main(
169 &ValidateImageMetadataCommand{}, ctx, []string{175 &ValidateImageMetadataCommand{}, ctx, []string{
170 "-p", "ec2", "-s", "precise", "-r", "region",176 "-p", "ec2", "-s", "precise", "-r", "region",
171 "-u", "https://ec2.region.amazonaws.com", "-d", metadataDir},177 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir},
172 )178 )
173 c.Assert(code, gc.Equals, 1)179 c.Assert(code, gc.Equals, 1)
174}180}
@@ -176,11 +182,10 @@
176func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) {182func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) {
177 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")183 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")
178 ctx := coretesting.Context(c)184 ctx := coretesting.Context(c)
179 metadataDir := config.JujuHomePath("")
180 code := cmd.Main(185 code := cmd.Main(
181 &ValidateImageMetadataCommand{}, ctx, []string{186 &ValidateImageMetadataCommand{}, ctx, []string{
182 "-p", "openstack", "-s", "raring", "-r", "region-2",187 "-p", "openstack", "-s", "raring", "-r", "region-2",
183 "-u", "some-auth-url", "-d", metadataDir},188 "-u", "some-auth-url", "-d", s.metadataDir},
184 )189 )
185 c.Assert(code, gc.Equals, 0)190 c.Assert(code, gc.Equals, 0)
186 errOut := ctx.Stdout.(*bytes.Buffer).String()191 errOut := ctx.Stdout.(*bytes.Buffer).String()
@@ -191,17 +196,16 @@
191func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) {196func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) {
192 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")197 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")
193 ctx := coretesting.Context(c)198 ctx := coretesting.Context(c)
194 metadataDir := config.JujuHomePath("")
195 code := cmd.Main(199 code := cmd.Main(
196 &ValidateImageMetadataCommand{}, ctx, []string{200 &ValidateImageMetadataCommand{}, ctx, []string{
197 "-p", "openstack", "-s", "precise", "-r", "region-2",201 "-p", "openstack", "-s", "precise", "-r", "region-2",
198 "-u", "some-auth-url", "-d", metadataDir},202 "-u", "some-auth-url", "-d", s.metadataDir},
199 )203 )
200 c.Assert(code, gc.Equals, 1)204 c.Assert(code, gc.Equals, 1)
201 code = cmd.Main(205 code = cmd.Main(
202 &ValidateImageMetadataCommand{}, ctx, []string{206 &ValidateImageMetadataCommand{}, ctx, []string{
203 "-p", "openstack", "-s", "raring", "-r", "region-3",207 "-p", "openstack", "-s", "raring", "-r", "region-3",
204 "-u", "some-auth-url", "-d", metadataDir},208 "-u", "some-auth-url", "-d", s.metadataDir},
205 )209 )
206 c.Assert(code, gc.Equals, 1)210 c.Assert(code, gc.Equals, 1)
207}211}
208212
=== renamed file 'environs/imagemetadata/boilerplate.go' => 'environs/imagemetadata/generate.go'
--- environs/imagemetadata/boilerplate.go 2013-08-07 04:34:02 +0000
+++ environs/imagemetadata/generate.go 2013-10-16 02:57:31 +0000
@@ -12,38 +12,25 @@
12 "text/template"12 "text/template"
13 "time"13 "time"
1414
15 "launchpad.net/juju-core/environs/config"
16 "launchpad.net/juju-core/environs/simplestreams"15 "launchpad.net/juju-core/environs/simplestreams"
17)16)
1817
19const (18const (
20 defaultIndexFileName = "index.json"19 defaultIndexFileName = "index.json"
21 defaultImageFileName = "imagemetadata.json"20 defaultImageFileName = "imagemetadata.json"
22 streamsDir = "streams/v1"
23)21)
2422
25// Boilerplate generates some basic simplestreams metadata using the specified cloud and image details.23// GenerateMetadata generates some basic simplestreams metadata using the specified cloud and image details.
26// If name is non-empty, it will be used as a prefix for the names of the generated index and image files.24func GenerateMetadata(series string, im *ImageMetadata, cloudSpec *simplestreams.CloudSpec, dest string) ([]string, error) {
27func Boilerplate(name, series string, im *ImageMetadata, cloudSpec *simplestreams.CloudSpec) ([]string, error) {
28 return MakeBoilerplate(name, series, im, cloudSpec, true)
29}
30
31// MakeBoilerplate exists so it can be called by tests. See Boilerplate above. It provides an option to retain
32// the streams directories when writing the generated metadata files.
33func MakeBoilerplate(name, series string, im *ImageMetadata, cloudSpec *simplestreams.CloudSpec, flattenPath bool) ([]string, error) {
34 indexFileName := defaultIndexFileName25 indexFileName := defaultIndexFileName
35 imageFileName := defaultImageFileName26 imageFileName := defaultImageFileName
36 if name != "" {
37 indexFileName = fmt.Sprintf("%s-%s", name, indexFileName)
38 imageFileName = fmt.Sprintf("%s-%s", name, imageFileName)
39 }
40 now := time.Now()27 now := time.Now()
41 imparams := imageMetadataParams{28 imparams := imageMetadataParams{
42 Id: im.Id,29 Id: im.Id,
43 Arch: im.Arch,30 Arch: im.Arch,
44 Region: cloudSpec.Region,31 Region: cloudSpec.Region,
45 URL: cloudSpec.Endpoint,32 URL: cloudSpec.Endpoint,
46 Path: streamsDir,33 Path: "streams/v1",
47 ImageFileName: imageFileName,34 ImageFileName: imageFileName,
48 Updated: now.Format(time.RFC1123Z),35 Updated: now.Format(time.RFC1123Z),
49 VersionKey: now.Format("20060102"),36 VersionKey: now.Format("20060102"),
@@ -55,14 +42,12 @@
55 return nil, fmt.Errorf("invalid series %q", series)42 return nil, fmt.Errorf("invalid series %q", series)
56 }43 }
5744
58 if !flattenPath {45 streamsPath := filepath.Join(dest, "streams", "v1")
59 streamsPath := config.JujuHomePath(streamsDir)46 if err = os.MkdirAll(streamsPath, 0755); err != nil {
60 if err = os.MkdirAll(streamsPath, 0755); err != nil {47 return nil, err
61 return nil, err
62 }
63 indexFileName = filepath.Join(streamsDir, indexFileName)
64 imageFileName = filepath.Join(streamsDir, imageFileName)
65 }48 }
49 indexFileName = filepath.Join(streamsPath, indexFileName)
50 imageFileName = filepath.Join(streamsPath, imageFileName)
66 err = writeJsonFile(imparams, indexFileName, indexBoilerplate)51 err = writeJsonFile(imparams, indexFileName, indexBoilerplate)
67 if err != nil {52 if err != nil {
68 return nil, err53 return nil, err
@@ -94,8 +79,7 @@
94 panic(fmt.Errorf("cannot generate %s metdata: %v", filename, err))79 panic(fmt.Errorf("cannot generate %s metdata: %v", filename, err))
95 }80 }
96 data := metadata.Bytes()81 data := metadata.Bytes()
97 path := config.JujuHomePath(filename)82 if err := ioutil.WriteFile(filename, data, 0666); err != nil {
98 if err := ioutil.WriteFile(path, data, 0666); err != nil {
99 return err83 return err
100 }84 }
101 return nil85 return nil
10286
=== modified file 'environs/imagemetadata/validation_test.go'
--- environs/imagemetadata/validation_test.go 2013-09-24 08:01:52 +0000
+++ environs/imagemetadata/validation_test.go 2013-10-16 02:57:31 +0000
@@ -6,16 +6,14 @@
6import (6import (
7 gc "launchpad.net/gocheck"7 gc "launchpad.net/gocheck"
88
9 "launchpad.net/juju-core/environs/config"
10 "launchpad.net/juju-core/environs/imagemetadata"9 "launchpad.net/juju-core/environs/imagemetadata"
11 "launchpad.net/juju-core/environs/simplestreams"10 "launchpad.net/juju-core/environs/simplestreams"
12 coretesting "launchpad.net/juju-core/testing"
13 "launchpad.net/juju-core/testing/testbase"11 "launchpad.net/juju-core/testing/testbase"
14)12)
1513
16type ValidateSuite struct {14type ValidateSuite struct {
17 testbase.LoggingSuite15 testbase.LoggingSuite
18 home *coretesting.FakeHome16 metadataDir string
19}17}
2018
21var _ = gc.Suite(&ValidateSuite{})19var _ = gc.Suite(&ValidateSuite{})
@@ -29,7 +27,7 @@
29 Region: region,27 Region: region,
30 Endpoint: endpoint,28 Endpoint: endpoint,
31 }29 }
32 _, err := imagemetadata.MakeBoilerplate("", series, &im, &cloudSpec, false)30 _, err := imagemetadata.GenerateMetadata(series, &im, &cloudSpec, s.metadataDir)
33 if err != nil {31 if err != nil {
34 return err32 return err
35 }33 }
@@ -38,23 +36,17 @@
3836
39func (s *ValidateSuite) SetUpTest(c *gc.C) {37func (s *ValidateSuite) SetUpTest(c *gc.C) {
40 s.LoggingSuite.SetUpTest(c)38 s.LoggingSuite.SetUpTest(c)
41 s.home = coretesting.MakeEmptyFakeHome(c)39 s.metadataDir = c.MkDir()
42}
43
44func (s *ValidateSuite) TearDownTest(c *gc.C) {
45 s.home.Restore()
46 s.LoggingSuite.TearDownTest(c)
47}40}
4841
49func (s *ValidateSuite) TestMatch(c *gc.C) {42func (s *ValidateSuite) TestMatch(c *gc.C) {
50 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")43 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")
51 metadataDir := config.JujuHomePath("")
52 params := &simplestreams.MetadataLookupParams{44 params := &simplestreams.MetadataLookupParams{
53 Region: "region-2",45 Region: "region-2",
54 Series: "raring",46 Series: "raring",
55 Architectures: []string{"amd64"},47 Architectures: []string{"amd64"},
56 Endpoint: "some-auth-url",48 Endpoint: "some-auth-url",
57 Sources: []simplestreams.DataSource{simplestreams.NewURLDataSource("file://"+metadataDir, simplestreams.VerifySSLHostnames)},49 Sources: []simplestreams.DataSource{simplestreams.NewURLDataSource("file://"+s.metadataDir, simplestreams.VerifySSLHostnames)},
58 }50 }
59 imageIds, err := imagemetadata.ValidateImageMetadata(params)51 imageIds, err := imagemetadata.ValidateImageMetadata(params)
60 c.Assert(err, gc.IsNil)52 c.Assert(err, gc.IsNil)
@@ -63,13 +55,12 @@
6355
64func (s *ValidateSuite) TestNoMatch(c *gc.C) {56func (s *ValidateSuite) TestNoMatch(c *gc.C) {
65 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")57 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url")
66 metadataDir := config.JujuHomePath("")
67 params := &simplestreams.MetadataLookupParams{58 params := &simplestreams.MetadataLookupParams{
68 Region: "region-2",59 Region: "region-2",
69 Series: "precise",60 Series: "precise",
70 Architectures: []string{"amd64"},61 Architectures: []string{"amd64"},
71 Endpoint: "some-auth-url",62 Endpoint: "some-auth-url",
72 Sources: []simplestreams.DataSource{simplestreams.NewURLDataSource("file://"+metadataDir, simplestreams.VerifySSLHostnames)},63 Sources: []simplestreams.DataSource{simplestreams.NewURLDataSource("file://"+s.metadataDir, simplestreams.VerifySSLHostnames)},
73 }64 }
74 _, err := imagemetadata.ValidateImageMetadata(params)65 _, err := imagemetadata.ValidateImageMetadata(params)
75 c.Assert(err, gc.Not(gc.IsNil))66 c.Assert(err, gc.Not(gc.IsNil))

Subscribers

People subscribed via source and target branches

to status/vote changes: