github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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  	jc "github.com/juju/testing/checkers"
     8  	"github.com/juju/utils"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/constraints"
    12  	"github.com/juju/juju/environs/imagemetadata"
    13  	"github.com/juju/juju/environs/instances"
    14  	"github.com/juju/juju/environs/simplestreams"
    15  	"github.com/juju/juju/testing"
    16  )
    17  
    18  var _ = gc.Suite(&specSuite{})
    19  
    20  type specSuite struct {
    21  	testing.BaseSuite
    22  }
    23  
    24  func (s *specSuite) SetUpSuite(c *gc.C) {
    25  	s.BaseSuite.SetUpSuite(c)
    26  	UseTestImageData(TestImagesData)
    27  	UseTestInstanceTypeData(TestInstanceTypeCosts)
    28  	UseTestRegionData(TestRegions)
    29  }
    30  
    31  func (s *specSuite) TearDownSuite(c *gc.C) {
    32  	UseTestInstanceTypeData(nil)
    33  	UseTestImageData(nil)
    34  	UseTestRegionData(nil)
    35  	s.BaseSuite.TearDownSuite(c)
    36  }
    37  
    38  var findInstanceSpecTests = []struct {
    39  	series  string
    40  	arches  []string
    41  	cons    string
    42  	itype   string
    43  	image   string
    44  	storage []string
    45  }{
    46  	{
    47  		series: testing.FakeDefaultSeries,
    48  		arches: both,
    49  		itype:  "m1.small",
    50  		image:  "ami-00000033",
    51  	}, {
    52  		series: "quantal",
    53  		arches: []string{"i386"},
    54  		itype:  "m1.small",
    55  		image:  "ami-01000034",
    56  	}, {
    57  		series: testing.FakeDefaultSeries,
    58  		arches: both,
    59  		cons:   "cpu-cores=4",
    60  		itype:  "m1.xlarge",
    61  		image:  "ami-00000033",
    62  	}, {
    63  		series: testing.FakeDefaultSeries,
    64  		arches: both,
    65  		cons:   "cpu-cores=2 arch=i386",
    66  		itype:  "c1.medium",
    67  		image:  "ami-00000034",
    68  	}, {
    69  		series: testing.FakeDefaultSeries,
    70  		arches: both,
    71  		cons:   "mem=10G",
    72  		itype:  "m1.xlarge",
    73  		image:  "ami-00000033",
    74  	}, {
    75  		series: testing.FakeDefaultSeries,
    76  		arches: both,
    77  		cons:   "mem=",
    78  		itype:  "m1.small",
    79  		image:  "ami-00000033",
    80  	}, {
    81  		series: testing.FakeDefaultSeries,
    82  		arches: both,
    83  		cons:   "cpu-power=",
    84  		itype:  "m1.small",
    85  		image:  "ami-00000033",
    86  	}, {
    87  		series: testing.FakeDefaultSeries,
    88  		arches: both,
    89  		cons:   "cpu-power=800",
    90  		itype:  "m1.xlarge",
    91  		image:  "ami-00000033",
    92  	}, {
    93  		series: testing.FakeDefaultSeries,
    94  		arches: both,
    95  		cons:   "cpu-power=500 arch=i386",
    96  		itype:  "c1.medium",
    97  		image:  "ami-00000034",
    98  	}, {
    99  		series: testing.FakeDefaultSeries,
   100  		arches: []string{"i386"},
   101  		cons:   "cpu-power=400",
   102  		itype:  "c1.medium",
   103  		image:  "ami-00000034",
   104  	}, {
   105  		series: "quantal",
   106  		arches: both,
   107  		cons:   "arch=amd64",
   108  		itype:  "cc2.8xlarge",
   109  		image:  "ami-01000035",
   110  	}, {
   111  		series: "quantal",
   112  		arches: both,
   113  		cons:   "instance-type=cc2.8xlarge",
   114  		itype:  "cc2.8xlarge",
   115  		image:  "ami-01000035",
   116  	}, {
   117  		series: testing.FakeDefaultSeries,
   118  		arches: []string{"i386"},
   119  		cons:   "instance-type=c1.medium",
   120  		itype:  "c1.medium",
   121  		image:  "ami-00000034",
   122  	}, {
   123  		series: testing.FakeDefaultSeries,
   124  		arches: both,
   125  		cons:   "mem=4G root-disk=16384M",
   126  		itype:  "m1.large",
   127  		image:  "ami-00000033",
   128  	}, {
   129  		series:  testing.FakeDefaultSeries,
   130  		arches:  both,
   131  		cons:    "mem=4G root-disk=16384M",
   132  		itype:   "m1.large",
   133  		storage: []string{"ssd", "ebs"},
   134  		image:   "ami-00000033",
   135  	}, {
   136  		series:  testing.FakeDefaultSeries,
   137  		arches:  both,
   138  		cons:    "mem=4G root-disk=16384M",
   139  		itype:   "m1.large",
   140  		storage: []string{"ebs", "ssd"},
   141  		image:   "ami-00000039",
   142  	}, {
   143  		series:  testing.FakeDefaultSeries,
   144  		arches:  both,
   145  		cons:    "mem=4G root-disk=16384M",
   146  		itype:   "m1.large",
   147  		storage: []string{"ebs"},
   148  		image:   "ami-00000039",
   149  	},
   150  }
   151  
   152  func (s *specSuite) TestFindInstanceSpec(c *gc.C) {
   153  	for i, test := range findInstanceSpecTests {
   154  		c.Logf("\ntest %d: %q; %q; %q; %v", i, test.series, test.arches, test.cons, test.storage)
   155  		stor := test.storage
   156  		if len(stor) == 0 {
   157  			stor = []string{ssdStorage, ebsStorage}
   158  		}
   159  		spec, err := findInstanceSpec(
   160  			[]simplestreams.DataSource{
   161  				simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)},
   162  			"released",
   163  			&instances.InstanceConstraint{
   164  				Region:      "test",
   165  				Series:      test.series,
   166  				Arches:      test.arches,
   167  				Constraints: constraints.MustParse(test.cons),
   168  				Storage:     stor,
   169  			})
   170  		c.Assert(err, jc.ErrorIsNil)
   171  		c.Check(spec.InstanceType.Name, gc.Equals, test.itype)
   172  		c.Check(spec.Image.Id, gc.Equals, test.image)
   173  	}
   174  }
   175  
   176  func (s *specSuite) TestFindInstanceSpecNotSetCpuPowerWhenInstanceTypeSet(c *gc.C) {
   177  
   178  	source := []simplestreams.DataSource{
   179  		simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames),
   180  	}
   181  	instanceConstraint := &instances.InstanceConstraint{
   182  		Region:      "test",
   183  		Series:      testing.FakeDefaultSeries,
   184  		Constraints: constraints.MustParse("instance-type=t2.medium"),
   185  	}
   186  
   187  	c.Check(instanceConstraint.Constraints.CpuPower, gc.IsNil)
   188  	findInstanceSpec(source, "released", instanceConstraint)
   189  
   190  	c.Check(instanceConstraint.Constraints.CpuPower, gc.IsNil)
   191  }
   192  
   193  var findInstanceSpecErrorTests = []struct {
   194  	series string
   195  	arches []string
   196  	cons   string
   197  	err    string
   198  }{
   199  	{
   200  		series: "bad",
   201  		arches: both,
   202  		err:    `unknown version for series: "bad"`,
   203  	}, {
   204  		series: testing.FakeDefaultSeries,
   205  		arches: []string{"arm"},
   206  		err:    `no "trusty" images in test with arches \[arm\]`,
   207  	}, {
   208  		series: "raring",
   209  		arches: both,
   210  		cons:   "mem=4G",
   211  		err:    `no "raring" images in test matching instance types \[m1.large m1.xlarge c1.xlarge cc2.8xlarge\]`,
   212  	},
   213  }
   214  
   215  func (s *specSuite) TestFindInstanceSpecErrors(c *gc.C) {
   216  	for i, t := range findInstanceSpecErrorTests {
   217  		c.Logf("test %d", i)
   218  		_, err := findInstanceSpec(
   219  			[]simplestreams.DataSource{
   220  				simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames)},
   221  			"released",
   222  			&instances.InstanceConstraint{
   223  				Region:      "test",
   224  				Series:      t.series,
   225  				Arches:      t.arches,
   226  				Constraints: constraints.MustParse(t.cons),
   227  			})
   228  		c.Check(err, gc.ErrorMatches, t.err)
   229  	}
   230  }
   231  
   232  func (*specSuite) TestFilterImagesAcceptsNil(c *gc.C) {
   233  	c.Check(filterImages(nil, nil), gc.HasLen, 0)
   234  }
   235  
   236  func (*specSuite) TestFilterImagesReturnsSelectively(c *gc.C) {
   237  	good := imagemetadata.ImageMetadata{Id: "good", Storage: "ebs"}
   238  	bad := imagemetadata.ImageMetadata{Id: "bad", Storage: "ftp"}
   239  	input := []*imagemetadata.ImageMetadata{&good, &bad}
   240  	expectation := []*imagemetadata.ImageMetadata{&good}
   241  
   242  	ic := &instances.InstanceConstraint{Storage: []string{"ebs"}}
   243  	c.Check(filterImages(input, ic), gc.DeepEquals, expectation)
   244  }
   245  
   246  func (*specSuite) TestFilterImagesMaintainsOrdering(c *gc.C) {
   247  	input := []*imagemetadata.ImageMetadata{
   248  		{Id: "one", Storage: "ebs"},
   249  		{Id: "two", Storage: "ebs"},
   250  		{Id: "three", Storage: "ebs"},
   251  	}
   252  	ic := &instances.InstanceConstraint{Storage: []string{"ebs"}}
   253  	c.Check(filterImages(input, ic), gc.DeepEquals, input)
   254  }