func (s *AvailabilityZoneSuite) TestAvailabilityZoneAllocationsAllInstancesErrors(c *gc.C) { resultErr := fmt.Errorf("oh noes") s.PatchValue(&s.env.allInstances, func() ([]instance.Instance, error) { return nil, resultErr }) zoneInstances, err := common.AvailabilityZoneAllocations(&s.env, nil) c.Assert(err, gc.Equals, resultErr) c.Assert(zoneInstances, gc.HasLen, 0) }
func (s *AvailabilityZoneSuite) TestAvailabilityZoneAllocationsInstanceAvailabilityZonesNoInstances(c *gc.C) { var called int s.PatchValue(&s.env.instanceAvailabilityZoneNames, func(ids []instance.Id) ([]string, error) { called++ return nil, environs.ErrNoInstances }) zoneInstances, err := common.AvailabilityZoneAllocations(&s.env, nil) c.Assert(called, gc.Equals, 1) c.Assert(err, jc.ErrorIsNil) c.Assert(zoneInstances, gc.HasLen, 2) }
func (s *AvailabilityZoneSuite) TestAvailabilityZoneAllocationsInstanceAvailabilityZonesErrors(c *gc.C) { returnErr := fmt.Errorf("whatever") var called int s.PatchValue(&s.env.instanceAvailabilityZoneNames, func(ids []instance.Id) ([]string, error) { called++ return nil, returnErr }) zoneInstances, err := common.AvailabilityZoneAllocations(&s.env, nil) c.Assert(called, gc.Equals, 1) c.Assert(err, gc.Equals, returnErr) c.Assert(zoneInstances, gc.HasLen, 0) }
func (s *AvailabilityZoneSuite) TestAvailabilityZoneAllocationsNoZones(c *gc.C) { var calls []string s.PatchValue(&s.env.instanceAvailabilityZoneNames, func(ids []instance.Id) ([]string, error) { c.Assert(ids, gc.DeepEquals, []instance.Id{"inst0", "inst1", "inst2"}) calls = append(calls, "InstanceAvailabilityZoneNames") return []string{"", "", ""}, nil }) s.PatchValue(&s.env.availabilityZones, func() ([]common.AvailabilityZone, error) { calls = append(calls, "AvailabilityZones") return []common.AvailabilityZone{}, nil }) zoneInstances, err := common.AvailabilityZoneAllocations(&s.env, nil) c.Assert(calls, gc.DeepEquals, []string{"InstanceAvailabilityZoneNames", "AvailabilityZones"}) c.Assert(err, jc.ErrorIsNil) c.Assert(zoneInstances, gc.HasLen, 0) }
func (s *AvailabilityZoneSuite) TestAvailabilityZoneAllocationsInstanceAvailabilityZonesErrors(c *gc.C) { var returnErr error var called int s.PatchValue(&s.env.instanceAvailabilityZoneNames, func(ids []instance.Id) ([]string, error) { called++ return nil, returnErr }) errors := []error{environs.ErrNoInstances, fmt.Errorf("whatever")} for i, err := range errors { returnErr = err zoneInstances, err := common.AvailabilityZoneAllocations(&s.env, nil) c.Assert(called, gc.Equals, i+1) c.Assert(err, gc.Equals, returnErr) c.Assert(zoneInstances, gc.HasLen, 0) } }
func (s *AvailabilityZoneSuite) TestAvailabilityZoneAllocationsPartialInstances(c *gc.C) { var called int s.PatchValue(&s.env.instanceAvailabilityZoneNames, func(ids []instance.Id) ([]string, error) { c.Assert(ids, gc.DeepEquals, []instance.Id{"nichts", "inst1", "null", "inst2"}) called++ return []string{"", "az1", "", "az1"}, environs.ErrPartialInstances }) zoneInstances, err := common.AvailabilityZoneAllocations(&s.env, []instance.Id{"nichts", "inst1", "null", "inst2"}) c.Assert(called, gc.Equals, 1) c.Assert(err, jc.ErrorIsNil) // az2 has fewer instances, so comes first. c.Assert(zoneInstances, gc.DeepEquals, []common.AvailabilityZoneInstances{{ ZoneName: "az2", }, { ZoneName: "az1", Instances: []instance.Id{"inst1", "inst2"}, }}) }
func (s *AvailabilityZoneSuite) TestAvailabilityZoneAllocationsAllInstances(c *gc.C) { var called int s.PatchValue(&s.env.instanceAvailabilityZoneNames, func(ids []instance.Id) ([]string, error) { c.Assert(ids, gc.DeepEquals, []instance.Id{"inst0", "inst1", "inst2"}) called++ return []string{"az0", "az1", "az2"}, nil }) zoneInstances, err := common.AvailabilityZoneAllocations(&s.env, nil) c.Assert(called, gc.Equals, 1) c.Assert(err, jc.ErrorIsNil) // az0 is unavailable, so az1 and az2 come out as equal best; // az1 comes first due to lexicographical ordering on the name. c.Assert(zoneInstances, gc.DeepEquals, []common.AvailabilityZoneInstances{{ ZoneName: "az1", Instances: []instance.Id{"inst1"}, }, { ZoneName: "az2", Instances: []instance.Id{"inst2"}, }}) }