github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/provider/gce/environ_availzones_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gce_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/instance"
    12  	"github.com/juju/juju/provider/common"
    13  	"github.com/juju/juju/provider/gce"
    14  	"github.com/juju/juju/provider/gce/google"
    15  )
    16  
    17  type environAZSuite struct {
    18  	gce.BaseSuite
    19  }
    20  
    21  var _ = gc.Suite(&environAZSuite{})
    22  
    23  func (s *environAZSuite) TestAvailabilityZones(c *gc.C) {
    24  	s.FakeConn.Zones = []google.AvailabilityZone{
    25  		google.NewZone("a-zone", google.StatusUp, "", ""),
    26  		google.NewZone("b-zone", google.StatusUp, "", ""),
    27  	}
    28  
    29  	zones, err := s.Env.AvailabilityZones()
    30  	c.Assert(err, jc.ErrorIsNil)
    31  
    32  	c.Check(zones, gc.HasLen, 2)
    33  	c.Check(zones[0].Name(), gc.Equals, "a-zone")
    34  	c.Check(zones[0].Available(), jc.IsTrue)
    35  	c.Check(zones[1].Name(), gc.Equals, "b-zone")
    36  	c.Check(zones[1].Available(), jc.IsTrue)
    37  
    38  }
    39  
    40  func (s *environAZSuite) TestAvailabilityZonesDeprecated(c *gc.C) {
    41  	zone := google.NewZone("a-zone", google.StatusUp, "DEPRECATED", "b-zone")
    42  
    43  	c.Check(zone.Deprecated(), jc.IsTrue)
    44  }
    45  
    46  func (s *environAZSuite) TestAvailabilityZonesAPI(c *gc.C) {
    47  	s.FakeConn.Zones = []google.AvailabilityZone{}
    48  
    49  	_, err := s.Env.AvailabilityZones()
    50  	c.Assert(err, jc.ErrorIsNil)
    51  
    52  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
    53  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AvailabilityZones")
    54  	c.Check(s.FakeConn.Calls[0].Region, gc.Equals, "home")
    55  }
    56  
    57  func (s *environAZSuite) TestInstanceAvailabilityZoneNames(c *gc.C) {
    58  	s.FakeEnviron.Insts = []instance.Instance{s.Instance}
    59  
    60  	ids := []instance.Id{instance.Id("spam")}
    61  	zones, err := s.Env.InstanceAvailabilityZoneNames(ids)
    62  	c.Assert(err, jc.ErrorIsNil)
    63  
    64  	c.Check(zones, jc.DeepEquals, []string{"home-zone"})
    65  }
    66  
    67  func (s *environAZSuite) TestInstanceAvailabilityZoneNamesAPIs(c *gc.C) {
    68  	s.FakeEnviron.Insts = []instance.Instance{s.Instance}
    69  
    70  	ids := []instance.Id{instance.Id("spam")}
    71  	_, err := s.Env.InstanceAvailabilityZoneNames(ids)
    72  	c.Assert(err, jc.ErrorIsNil)
    73  
    74  	s.FakeEnviron.CheckCalls(c, []gce.FakeCall{{
    75  		FuncName: "GetInstances", Args: gce.FakeCallArgs{"switch": s.Env},
    76  	}})
    77  }
    78  
    79  func (s *environAZSuite) TestParseAvailabilityZones(c *gc.C) {
    80  	s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{
    81  		ZoneName:  "home-zone",
    82  		Instances: []instance.Id{s.Instance.Id()},
    83  	}}
    84  
    85  	zones, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs)
    86  	c.Assert(err, jc.ErrorIsNil)
    87  
    88  	c.Check(zones, jc.DeepEquals, []string{"home-zone"})
    89  }
    90  
    91  func (s *environAZSuite) TestParseAvailabilityZonesAPI(c *gc.C) {
    92  	ids := []instance.Id{s.Instance.Id()}
    93  	s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{
    94  		ZoneName:  "home-zone",
    95  		Instances: ids,
    96  	}}
    97  	s.StartInstArgs.DistributionGroup = func() ([]instance.Id, error) {
    98  		return ids, nil
    99  	}
   100  
   101  	_, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs)
   102  	c.Assert(err, jc.ErrorIsNil)
   103  
   104  	c.Check(s.FakeConn.Calls, gc.HasLen, 0)
   105  	s.FakeEnviron.CheckCalls(c, []gce.FakeCall{})
   106  	s.FakeCommon.CheckCalls(c, []gce.FakeCall{{
   107  		FuncName: "AvailabilityZoneAllocations",
   108  		Args: gce.FakeCallArgs{
   109  			"switch": s.Env,
   110  			"group":  ids,
   111  		},
   112  	}})
   113  }
   114  
   115  func (s *environAZSuite) TestParseAvailabilityZonesPlacement(c *gc.C) {
   116  	s.StartInstArgs.Placement = "zone=a-zone"
   117  	s.FakeConn.Zones = []google.AvailabilityZone{
   118  		google.NewZone("a-zone", google.StatusUp, "", ""),
   119  	}
   120  
   121  	zones, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs)
   122  	c.Assert(err, jc.ErrorIsNil)
   123  
   124  	c.Check(zones, jc.DeepEquals, []string{"a-zone"})
   125  }
   126  
   127  func (s *environAZSuite) TestParseAvailabilityZonesPlacementAPI(c *gc.C) {
   128  	s.StartInstArgs.Placement = "zone=a-zone"
   129  	s.FakeConn.Zones = []google.AvailabilityZone{
   130  		google.NewZone("a-zone", google.StatusUp, "", ""),
   131  	}
   132  
   133  	_, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs)
   134  	c.Assert(err, jc.ErrorIsNil)
   135  
   136  	s.FakeEnviron.CheckCalls(c, []gce.FakeCall{})
   137  	s.FakeCommon.CheckCalls(c, []gce.FakeCall{})
   138  	c.Check(s.FakeConn.Calls, gc.HasLen, 1)
   139  	c.Check(s.FakeConn.Calls[0].FuncName, gc.Equals, "AvailabilityZones")
   140  	c.Check(s.FakeConn.Calls[0].Region, gc.Equals, "home")
   141  }
   142  
   143  func (s *environAZSuite) TestParseAvailabilityZonesPlacementUnavailable(c *gc.C) {
   144  	s.StartInstArgs.Placement = "zone=a-zone"
   145  	s.FakeConn.Zones = []google.AvailabilityZone{
   146  		google.NewZone("a-zone", google.StatusDown, "", ""),
   147  	}
   148  
   149  	_, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs)
   150  
   151  	c.Check(err, gc.ErrorMatches, `.*availability zone "a-zone" is DOWN`)
   152  }
   153  
   154  func (s *environAZSuite) TestParseAvailabilityZonesDistGroup(c *gc.C) {
   155  	s.FakeCommon.AZInstances = []common.AvailabilityZoneInstances{{
   156  		ZoneName:  "home-zone",
   157  		Instances: []instance.Id{s.Instance.Id()},
   158  	}}
   159  	s.StartInstArgs.DistributionGroup = func() ([]instance.Id, error) {
   160  		return []instance.Id{s.Instance.Id()}, nil
   161  	}
   162  
   163  	zones, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs)
   164  	c.Assert(err, jc.ErrorIsNil)
   165  
   166  	c.Check(zones, jc.DeepEquals, []string{"home-zone"})
   167  }
   168  
   169  func (s *environAZSuite) TestParseAvailabilityZonesNoneFound(c *gc.C) {
   170  	_, err := gce.ParseAvailabilityZones(s.Env, s.StartInstArgs)
   171  
   172  	c.Check(err, jc.Satisfies, errors.IsNotFound)
   173  }