github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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  	"github.com/juju/cmd"
    15  	jc "github.com/juju/testing/checkers"
    16  	gc "gopkg.in/check.v1"
    17  
    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  var testCert = `
    38  -----BEGIN PRIVATE KEY-----
    39  MIIBCgIBADANBgkqhkiG9w0BAQEFAASB9TCB8gIBAAIxAKQGQxP1i0VfCWn4KmMP
    40  taUFn8sMBKjP/9vHnUYdZRvvmoJCA1C6arBUDp8s2DNX+QIDAQABAjBLRqhwN4dU
    41  LfqHDKJ/Vg1aD8u3Buv4gYRBxdFR5PveyqHSt5eJ4g/x/4ndsvr2OqUCGQDNfNlD
    42  zxHCiEAwZZAPaAkn8jDkFupTljcCGQDMWCujiVZ1NNuBD/N32Yt8P9JDiNzZa08C
    43  GBW7VXLxbExpgnhb1V97vjQmTfthXQjYAwIYSTEjoFXm4+Bk5xuBh2IidgSeGZaC
    44  FFY9AhkAsteo31cyQw2xJ80SWrmsIw+ps7Cvt5W9
    45  -----END PRIVATE KEY-----
    46  -----BEGIN CERTIFICATE-----
    47  MIIBDzCByqADAgECAgkAgIBb3+lSwzEwDQYJKoZIhvcNAQEFBQAwFTETMBEGA1UE
    48  AxQKQEhvc3ROYW1lQDAeFw0xMzA3MTkxNjA1NTRaFw0yMzA3MTcxNjA1NTRaMBUx
    49  EzARBgNVBAMUCkBIb3N0TmFtZUAwTDANBgkqhkiG9w0BAQEFAAM7ADA4AjEApAZD
    50  E/WLRV8JafgqYw+1pQWfywwEqM//28edRh1lG++agkIDULpqsFQOnyzYM1f5AgMB
    51  AAGjDTALMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADMQABKfn08tKfzzqMMD2w
    52  PI2fs3bw5bRH8tmGjrsJeEdp9crCBS8I3hKcxCkTTRTowdY=
    53  -----END CERTIFICATE-----
    54  `
    55  
    56  func (s *ImageMetadataSuite) SetUpTest(c *gc.C) {
    57  	s.FakeJujuHomeSuite.SetUpTest(c)
    58  	s.dir = c.MkDir()
    59  	// Create a fake certificate so azure test environment can be opened.
    60  	certfile, err := ioutil.TempFile(s.dir, "")
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	filename := certfile.Name()
    63  	err = ioutil.WriteFile(filename, []byte(testCert), 0644)
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	envConfig := strings.Replace(metadataTestEnvConfig, "/home/me/azure.pem", filename, -1)
    66  	testing.WriteEnvironments(c, envConfig)
    67  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
    68  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret")
    69  }
    70  
    71  var seriesVersions map[string]string = map[string]string{
    72  	"precise": "12.04",
    73  	"raring":  "13.04",
    74  	"trusty":  "14.04",
    75  }
    76  
    77  type expectedMetadata struct {
    78  	series   string
    79  	arch     string
    80  	region   string
    81  	endpoint string
    82  }
    83  
    84  func (s *ImageMetadataSuite) assertCommandOutput(c *gc.C, expected expectedMetadata, errOut, indexFileName, imageFileName string) {
    85  	if expected.region == "" {
    86  		expected.region = "region"
    87  	}
    88  	if expected.endpoint == "" {
    89  		expected.endpoint = "endpoint"
    90  	}
    91  	strippedOut := strings.Replace(errOut, "\n", "", -1)
    92  	c.Check(strippedOut, gc.Matches, `image metadata files have been written to.*`)
    93  	indexpath := filepath.Join(s.dir, "images", "streams", "v1", indexFileName)
    94  	data, err := ioutil.ReadFile(indexpath)
    95  	c.Assert(err, jc.ErrorIsNil)
    96  	content := string(data)
    97  	var indices interface{}
    98  	err = json.Unmarshal(data, &indices)
    99  	c.Assert(err, jc.ErrorIsNil)
   100  	c.Assert(indices.(map[string]interface{})["format"], gc.Equals, "index:1.0")
   101  	prodId := fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", seriesVersions[expected.series], expected.arch)
   102  	c.Assert(content, jc.Contains, prodId)
   103  	c.Assert(content, jc.Contains, fmt.Sprintf(`"region": %q`, expected.region))
   104  	c.Assert(content, jc.Contains, fmt.Sprintf(`"endpoint": %q`, expected.endpoint))
   105  	c.Assert(content, jc.Contains, fmt.Sprintf(`"path": "streams/v1/%s"`, imageFileName))
   106  
   107  	imagepath := filepath.Join(s.dir, "images", "streams", "v1", imageFileName)
   108  	data, err = ioutil.ReadFile(imagepath)
   109  	c.Assert(err, jc.ErrorIsNil)
   110  	content = string(data)
   111  	var images interface{}
   112  	err = json.Unmarshal(data, &images)
   113  	c.Assert(err, jc.ErrorIsNil)
   114  	c.Assert(images.(map[string]interface{})["format"], gc.Equals, "products:1.0")
   115  	c.Assert(content, jc.Contains, prodId)
   116  	c.Assert(content, jc.Contains, `"id": "1234"`)
   117  }
   118  
   119  const (
   120  	defaultIndexFileName = "index.json"
   121  	defaultImageFileName = "com.ubuntu.cloud-released-imagemetadata.json"
   122  )
   123  
   124  func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) {
   125  	ctx := testing.Context(c)
   126  	code := cmd.Main(
   127  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   128  			"-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"})
   129  	c.Assert(code, gc.Equals, 0)
   130  	out := testing.Stdout(ctx)
   131  	expected := expectedMetadata{
   132  		series: "raring",
   133  		arch:   "arch",
   134  	}
   135  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   136  }
   137  
   138  func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) {
   139  	ctx := testing.Context(c)
   140  	code := cmd.Main(
   141  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   142  			"-d", s.dir, "-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"})
   143  	c.Assert(code, gc.Equals, 0)
   144  	out := testing.Stdout(ctx)
   145  	expected := expectedMetadata{
   146  		series: "raring",
   147  		arch:   "amd64",
   148  	}
   149  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   150  }
   151  
   152  func (s *ImageMetadataSuite) TestImageMetadataFilesLatestLts(c *gc.C) {
   153  	envConfig := strings.Replace(metadataTestEnvConfig, "default-series: precise", "", -1)
   154  	testing.WriteEnvironments(c, envConfig)
   155  	ctx := testing.Context(c)
   156  	code := cmd.Main(
   157  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   158  			"-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"})
   159  	c.Assert(code, gc.Equals, 0)
   160  	out := testing.Stdout(ctx)
   161  	expected := expectedMetadata{
   162  		series: config.LatestLtsSeries(),
   163  		arch:   "arch",
   164  	}
   165  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   166  }
   167  
   168  func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnv(c *gc.C) {
   169  	ctx := testing.Context(c)
   170  	code := cmd.Main(
   171  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{"-d", s.dir, "-e", "ec2", "-i", "1234"})
   172  	c.Assert(code, gc.Equals, 0)
   173  	out := testing.Stdout(ctx)
   174  	expected := expectedMetadata{
   175  		series:   "precise",
   176  		arch:     "amd64",
   177  		region:   "us-east-1",
   178  		endpoint: "https://ec2.us-east-1.amazonaws.com",
   179  	}
   180  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   181  }
   182  
   183  func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithRegionOverride(c *gc.C) {
   184  	ctx := testing.Context(c)
   185  	code := cmd.Main(
   186  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   187  			"-d", s.dir, "-e", "ec2", "-r", "us-west-1", "-u", "https://ec2.us-west-1.amazonaws.com", "-i", "1234"})
   188  	c.Assert(code, gc.Equals, 0)
   189  	out := testing.Stdout(ctx)
   190  	expected := expectedMetadata{
   191  		series:   "precise",
   192  		arch:     "amd64",
   193  		region:   "us-west-1",
   194  		endpoint: "https://ec2.us-west-1.amazonaws.com",
   195  	}
   196  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   197  }
   198  
   199  func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithNoHasRegion(c *gc.C) {
   200  	ctx := testing.Context(c)
   201  	code := cmd.Main(
   202  		envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{
   203  			"-d", s.dir, "-e", "azure", "-r", "region", "-u", "endpoint", "-i", "1234"})
   204  	c.Assert(code, gc.Equals, 0)
   205  	out := testing.Stdout(ctx)
   206  	expected := expectedMetadata{
   207  		series:   "raring",
   208  		arch:     "amd64",
   209  		region:   "region",
   210  		endpoint: "endpoint",
   211  	}
   212  	s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName)
   213  }
   214  
   215  type errTestParams struct {
   216  	args []string
   217  }
   218  
   219  var errTests = []errTestParams{
   220  	{
   221  		// Missing image id
   222  		args: []string{"-r", "region", "-a", "arch", "-u", "endpoint", "-s", "precise"},
   223  	},
   224  	{
   225  		// Missing region
   226  		args: []string{"-i", "1234", "-a", "arch", "-u", "endpoint", "-s", "precise"},
   227  	},
   228  	{
   229  		// Missing endpoint
   230  		args: []string{"-i", "1234", "-u", "endpoint", "-a", "arch", "-s", "precise"},
   231  	},
   232  	{
   233  		// Missing endpoint/region for environment with no HasRegion interface
   234  		args: []string{"-i", "1234", "-e", "azure"},
   235  	},
   236  }
   237  
   238  func (s *ImageMetadataSuite) TestImageMetadataBadArgs(c *gc.C) {
   239  	testing.MakeSampleJujuHome(c)
   240  	s.AddCleanup(func(*gc.C) {
   241  		dummy.Reset()
   242  	})
   243  	for i, t := range errTests {
   244  		c.Logf("test: %d", i)
   245  		ctx := testing.Context(c)
   246  		code := cmd.Main(envcmd.Wrap(&ImageMetadataCommand{}), ctx, t.args)
   247  		c.Check(code, gc.Equals, 1)
   248  	}
   249  }