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