github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/provider/ec2/image_test.go (about)

     1  // Copyright 2011, 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package ec2
     5  
     6  import (
     7  	"github.com/juju/utils"
     8  	gc "launchpad.net/gocheck"
     9  
    10  	"github.com/juju/juju/constraints"
    11  	"github.com/juju/juju/environs/imagemetadata"
    12  	"github.com/juju/juju/environs/instances"
    13  	"github.com/juju/juju/environs/simplestreams"
    14  	"github.com/juju/juju/testing"
    15  )
    16  
    17  var _ = gc.Suite(&specSuite{})
    18  
    19  type specSuite struct {
    20  	testing.BaseSuite
    21  }
    22  
    23  func (s *specSuite) SetUpSuite(c *gc.C) {
    24  	s.BaseSuite.SetUpSuite(c)
    25  	UseTestImageData(TestImagesData)
    26  	UseTestInstanceTypeData(TestInstanceTypeCosts)
    27  	UseTestRegionData(TestRegions)
    28  }
    29  
    30  func (s *specSuite) TearDownSuite(c *gc.C) {
    31  	UseTestInstanceTypeData(nil)
    32  	UseTestImageData(nil)
    33  	UseTestRegionData(nil)
    34  	s.BaseSuite.TearDownSuite(c)
    35  }
    36  
    37  var findInstanceSpecTests = []struct {
    38  	series string
    39  	arches []string
    40  	cons   string
    41  	itype  string
    42  	image  string
    43  }{
    44  	{
    45  		series: "precise",
    46  		arches: both,
    47  		itype:  "m1.small",
    48  		image:  "ami-00000033",
    49  	}, {
    50  		series: "quantal",
    51  		arches: []string{"i386"},
    52  		itype:  "m1.small",
    53  		image:  "ami-01000034",
    54  	}, {
    55  		series: "precise",
    56  		arches: both,
    57  		cons:   "cpu-cores=4",
    58  		itype:  "m1.xlarge",
    59  		image:  "ami-00000033",
    60  	}, {
    61  		series: "precise",
    62  		arches: both,
    63  		cons:   "cpu-cores=2 arch=i386",
    64  		itype:  "c1.medium",
    65  		image:  "ami-00000034",
    66  	}, {
    67  		series: "precise",
    68  		arches: both,
    69  		cons:   "mem=10G",
    70  		itype:  "m1.xlarge",
    71  		image:  "ami-00000033",
    72  	}, {
    73  		series: "precise",
    74  		arches: both,
    75  		cons:   "mem=",
    76  		itype:  "m1.small",
    77  		image:  "ami-00000033",
    78  	}, {
    79  		series: "precise",
    80  		arches: both,
    81  		cons:   "cpu-power=",
    82  		itype:  "m1.small",
    83  		image:  "ami-00000033",
    84  	}, {
    85  		series: "precise",
    86  		arches: both,
    87  		cons:   "cpu-power=800",
    88  		itype:  "m1.xlarge",
    89  		image:  "ami-00000033",
    90  	}, {
    91  		series: "precise",
    92  		arches: both,
    93  		cons:   "cpu-power=500 arch=i386",
    94  		itype:  "c1.medium",
    95  		image:  "ami-00000034",
    96  	}, {
    97  		series: "precise",
    98  		arches: []string{"i386"},
    99  		cons:   "cpu-power=400",
   100  		itype:  "c1.medium",
   101  		image:  "ami-00000034",
   102  	}, {
   103  		series: "quantal",
   104  		arches: both,
   105  		cons:   "arch=amd64",
   106  		itype:  "cc2.8xlarge",
   107  		image:  "ami-01000035",
   108  	}, {
   109  		series: "quantal",
   110  		arches: both,
   111  		cons:   "instance-type=cc2.8xlarge",
   112  		itype:  "cc2.8xlarge",
   113  		image:  "ami-01000035",
   114  	}, {
   115  		series: "precise",
   116  		arches: []string{"i386"},
   117  		cons:   "instance-type=c1.medium",
   118  		itype:  "c1.medium",
   119  		image:  "ami-00000034",
   120  	}, {
   121  		series: "precise",
   122  		arches: both,
   123  		cons:   "mem=4G root-disk=16384M",
   124  		itype:  "m1.large",
   125  		image:  "ami-00000033",
   126  	},
   127  }
   128  
   129  func (s *specSuite) TestFindInstanceSpec(c *gc.C) {
   130  	for i, test := range findInstanceSpecTests {
   131  		c.Logf("\ntest %d: %q; %q; %q", i, test.series, test.arches, test.cons)
   132  		stor := ebsStorage
   133  		spec, err := findInstanceSpec(
   134  			[]simplestreams.DataSource{
   135  				simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)},
   136  			"released",
   137  			&instances.InstanceConstraint{
   138  				Region:      "test",
   139  				Series:      test.series,
   140  				Arches:      test.arches,
   141  				Constraints: constraints.MustParse(test.cons),
   142  				Storage:     &stor,
   143  			})
   144  		c.Assert(err, gc.IsNil)
   145  		c.Check(spec.InstanceType.Name, gc.Equals, test.itype)
   146  		c.Check(spec.Image.Id, gc.Equals, test.image)
   147  	}
   148  }
   149  
   150  var findInstanceSpecErrorTests = []struct {
   151  	series string
   152  	arches []string
   153  	cons   string
   154  	err    string
   155  }{
   156  	{
   157  		series: "bad",
   158  		arches: both,
   159  		err:    `invalid series "bad"`,
   160  	}, {
   161  		series: "precise",
   162  		arches: []string{"arm"},
   163  		err:    `no "precise" images in test with arches \[arm\]`,
   164  	}, {
   165  		series: "raring",
   166  		arches: both,
   167  		cons:   "mem=4G",
   168  		err:    `no "raring" images in test matching instance types \[m1.large m1.xlarge c1.xlarge cc2.8xlarge\]`,
   169  	},
   170  }
   171  
   172  func (s *specSuite) TestFindInstanceSpecErrors(c *gc.C) {
   173  	for i, t := range findInstanceSpecErrorTests {
   174  		c.Logf("test %d", i)
   175  		_, err := findInstanceSpec(
   176  			[]simplestreams.DataSource{
   177  				simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)},
   178  			"released",
   179  			&instances.InstanceConstraint{
   180  				Region:      "test",
   181  				Series:      t.series,
   182  				Arches:      t.arches,
   183  				Constraints: constraints.MustParse(t.cons),
   184  			})
   185  		c.Check(err, gc.ErrorMatches, t.err)
   186  	}
   187  }
   188  
   189  func (*specSuite) TestFilterImagesAcceptsNil(c *gc.C) {
   190  	c.Check(filterImages(nil), gc.HasLen, 0)
   191  }
   192  
   193  func (*specSuite) TestFilterImagesAcceptsImageWithEBSStorage(c *gc.C) {
   194  	input := []*imagemetadata.ImageMetadata{{Id: "yay", Storage: "ebs"}}
   195  	c.Check(filterImages(input), gc.DeepEquals, input)
   196  }
   197  
   198  func (*specSuite) TestFilterImagesRejectsImageWithoutEBSStorage(c *gc.C) {
   199  	input := []*imagemetadata.ImageMetadata{{Id: "boo", Storage: "ftp"}}
   200  	c.Check(filterImages(input), gc.HasLen, 0)
   201  }
   202  
   203  func (*specSuite) TestFilterImagesReturnsSelectively(c *gc.C) {
   204  	good := imagemetadata.ImageMetadata{Id: "good", Storage: "ebs"}
   205  	bad := imagemetadata.ImageMetadata{Id: "bad", Storage: "ftp"}
   206  	input := []*imagemetadata.ImageMetadata{&good, &bad}
   207  	expectation := []*imagemetadata.ImageMetadata{&good}
   208  	c.Check(filterImages(input), gc.DeepEquals, expectation)
   209  }
   210  
   211  func (*specSuite) TestFilterImagesMaintainsOrdering(c *gc.C) {
   212  	input := []*imagemetadata.ImageMetadata{
   213  		{Id: "one", Storage: "ebs"},
   214  		{Id: "two", Storage: "ebs"},
   215  		{Id: "three", Storage: "ebs"},
   216  	}
   217  	c.Check(filterImages(input), gc.DeepEquals, input)
   218  }