github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/cmd/plugins/juju-metadata/imagemetadata_test.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  	"encoding/json"
     8  	"fmt"
     9  	"io/ioutil"
    10  	"os"
    11  	"path/filepath"
    12  	"strings"
    13  
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "launchpad.net/gocheck"
    16  
    17  	"github.com/juju/juju/cmd"
    18  	"github.com/juju/juju/cmd/envcmd"
    19  	"github.com/juju/juju/environs/config"
    20  	"github.com/juju/juju/provider/dummy"
    21  	"github.com/juju/juju/testing"
    22  )
    23  
    24  type ImageMetadataSuite struct {
    25  	testing.FakeJujuHomeSuite
    26  	environ []string
    27  	dir     string
    28  }
    29  
    30  var _ = gc.Suite(&ImageMetadataSuite{})
    31  
    32  func (s *ImageMetadataSuite) SetUpSuite(c *gc.C) {
    33  	s.FakeJujuHomeSuite.SetUpSuite(c)
    34  	s.environ = os.Environ()
    35  }
    36  
    37  func (s *ImageMetadataSuite) SetUpTest(c *gc.C) {
    38  	s.FakeJujuHomeSuite.SetUpTest(c)
    39  	s.dir = c.MkDir()
    40  	// Create a fake certificate so azure test environment can be opened.
    41  	certfile, err := ioutil.TempFile(s.dir, "")
    42  	c.Assert(err, gc.IsNil)
    43  	filename := certfile.Name()
    44  	err = ioutil.WriteFile(filename, []byte("test certificate"), 0644)
    45  	c.Assert(err, gc.IsNil)
    46  	envConfig := strings.Replace(metadataTestEnvConfig, "/home/me/azure.pem", filename, -1)
    47  	testing.WriteEnvironments(c, envConfig)
    48  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
    49  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret")
    50  }
    51  
    52  var seriesVersions map[string]string = map[string]string{
    53  	"precise": "12.04",
    54  	"raring":  "13.04",
    55  	"trusty":  "14.04",
    56  }
    57  
    58  type expectedMetadata struct {
    59  	series   string
    60  	arch     string
    61  	region   string
    62  	endpoint string
    63  }
    64  
    65  func (s *ImageMetadataSuite) assertCommandOutput(c *gc.C, expected expectedMetadata, errOut, indexFileName, imageFileName string) {
    66  	if expected.region == "" {
    67  		expected.region = "region"
    68  	}
    69  	if expected.endpoint == "" {
    70  		expected.endpoint = "endpoint"
    71  	}
    72  	strippedOut := strings.Replace(errOut, "\n", "", -1)
    73  	c.Check(strippedOut, gc.Matches, `image metadata files have been written to.*`)
    74  	indexpath := filepath.Join(s.dir, "images", "streams", "v1", indexFileName)
    75  	data, err := ioutil.ReadFile(indexpath)
    76  	c.Assert(err, gc.IsNil)
    77  	content := string(data)
    78  	var indices interface{}
    79  	err = json.Unmarshal(data, &indices)
    80  	c.Assert(err, gc.IsNil)
    81  	c.Assert(indices.(map[string]interface{})["format"], gc.Equals, "index:1.0")
    82  	prodId := fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", seriesVersions[expected.series], expected.arch)
    83  	c.Assert(content, jc.Contains, prodId)
    84  	c.Assert(content, jc.Contains, fmt.Sprintf(`"region": %q`, expected.region))
    85  	c.Assert(content, jc.Contains, fmt.Sprintf(`"endpoint": %q`, expected.endpoint))
    86  	c.Assert(content, jc.Contains, fmt.Sprintf(`"path": "streams/v1/%s"`, imageFileName))
    87  
    88  	imagepath := filepath.Join(s.dir, "images", "streams", "v1", imageFileName)
    89  	data, err = ioutil.ReadFile(imagepath)
    90  	c.Assert(err, gc.IsNil)
    91  	content = string(data)
    92  	var images interface{}
    93  	err = json.Unmarshal(data, &images)
    94  	c.Assert(err, gc.IsNil)
    95  	c.Assert(images.(map[string]interface{})["format"], gc.Equals, "products:1.0")
    96  	c.Assert(content, jc.Contains, prodId)
    97  	c.Assert(content, jc.Contains, `"id": "1234"`)
    98  }
    99  
   100  const (
   101  	defaultIndexFileName = "index.json"
   102  	defaultImageFileName = "com.ubuntu.cloud:released:imagemetadata.json"
   103  )
   104  
   105  func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) {
   106  	ctx := testing.Context(c)
   107  	code := cmd.Main(
   108  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   109  			"-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"})
   110  	c.Assert(code, gc.Equals, 0)
   111  	out := testing.Stdout(ctx)
   112  	expected := expectedMetadata{
   113  		series: "raring",
   114  		arch:   "arch",
   115  	}
   116  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   117  }
   118  
   119  func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) {
   120  	ctx := testing.Context(c)
   121  	code := cmd.Main(
   122  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   123  			"-d", s.dir, "-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"})
   124  	c.Assert(code, gc.Equals, 0)
   125  	out := testing.Stdout(ctx)
   126  	expected := expectedMetadata{
   127  		series: "raring",
   128  		arch:   "amd64",
   129  	}
   130  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   131  }
   132  
   133  func (s *ImageMetadataSuite) TestImageMetadataFilesLatestLts(c *gc.C) {
   134  	envConfig := strings.Replace(metadataTestEnvConfig, "default-series: precise", "", -1)
   135  	testing.WriteEnvironments(c, envConfig)
   136  	ctx := testing.Context(c)
   137  	code := cmd.Main(
   138  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   139  			"-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"})
   140  	c.Assert(code, gc.Equals, 0)
   141  	out := testing.Stdout(ctx)
   142  	expected := expectedMetadata{
   143  		series: config.LatestLtsSeries(),
   144  		arch:   "arch",
   145  	}
   146  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   147  }
   148  
   149  func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnv(c *gc.C) {
   150  	ctx := testing.Context(c)
   151  	code := cmd.Main(
   152  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{"-d", s.dir, "-e", "ec2", "-i", "1234"})
   153  	c.Assert(code, gc.Equals, 0)
   154  	out := testing.Stdout(ctx)
   155  	expected := expectedMetadata{
   156  		series:   "precise",
   157  		arch:     "amd64",
   158  		region:   "us-east-1",
   159  		endpoint: "https://ec2.us-east-1.amazonaws.com",
   160  	}
   161  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   162  }
   163  
   164  func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithRegionOverride(c *gc.C) {
   165  	ctx := testing.Context(c)
   166  	code := cmd.Main(
   167  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   168  			"-d", s.dir, "-e", "ec2", "-r", "us-west-1", "-u", "https://ec2.us-west-1.amazonaws.com", "-i", "1234"})
   169  	c.Assert(code, gc.Equals, 0)
   170  	out := testing.Stdout(ctx)
   171  	expected := expectedMetadata{
   172  		series:   "precise",
   173  		arch:     "amd64",
   174  		region:   "us-west-1",
   175  		endpoint: "https://ec2.us-west-1.amazonaws.com",
   176  	}
   177  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   178  }
   179  
   180  func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithNoHasRegion(c *gc.C) {
   181  	ctx := testing.Context(c)
   182  	code := cmd.Main(
   183  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   184  			"-d", s.dir, "-e", "azure", "-r", "region", "-u", "endpoint", "-i", "1234"})
   185  	c.Assert(code, gc.Equals, 0)
   186  	out := testing.Stdout(ctx)
   187  	expected := expectedMetadata{
   188  		series:   "raring",
   189  		arch:     "amd64",
   190  		region:   "region",
   191  		endpoint: "endpoint",
   192  	}
   193  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   194  }
   195  
   196  type errTestParams struct {
   197  	args []string
   198  }
   199  
   200  var errTests = []errTestParams{
   201  	{
   202  		// Missing image id
   203  		args: []string{"-r", "region", "-a", "arch", "-u", "endpoint", "-s", "precise"},
   204  	},
   205  	{
   206  		// Missing region
   207  		args: []string{"-i", "1234", "-a", "arch", "-u", "endpoint", "-s", "precise"},
   208  	},
   209  	{
   210  		// Missing endpoint
   211  		args: []string{"-i", "1234", "-u", "endpoint", "-a", "arch", "-s", "precise"},
   212  	},
   213  	{
   214  		// Missing endpoint/region for environment with no HasRegion interface
   215  		args: []string{"-i", "1234", "-e", "azure"},
   216  	},
   217  }
   218  
   219  func (s *ImageMetadataSuite) TestImageMetadataBadArgs(c *gc.C) {
   220  	testing.MakeSampleJujuHome(c)
   221  	s.AddCleanup(func(*gc.C) {
   222  		dummy.Reset()
   223  	})
   224  	for i, t := range errTests {
   225  		c.Logf("test: %d", i)
   226  		ctx := testing.Context(c)
   227  		code := cmd.Main(envcmd.Wrap(&ImageMetadataCommand{}), ctx, t.args)
   228  		c.Check(code, gc.Equals, 1)
   229  	}
   230  }