func (s *SubnetsSuite) TestAllZonesWithNoBackingZonesAndSetFails(c *gc.C) { apiservertesting.BackingInstance.SetUp(c, apiservertesting.StubZonedEnvironName, apiservertesting.WithoutZones, apiservertesting.WithSpaces, apiservertesting.WithSubnets) apiservertesting.SharedStub.SetErrors( nil, // Backing.AvailabilityZones nil, // Backing.EnvironConfig nil, // Provider.Open nil, // ZonedEnviron.AvailabilityZones errors.NotSupportedf("setting"), // Backing.SetAvailabilityZones ) results, err := s.facade.AllZones() c.Assert(err, gc.ErrorMatches, `cannot update known zones: setting not supported`, ) // Verify the cause is not obscured. c.Assert(err, jc.Satisfies, errors.IsNotSupported) c.Assert(results, jc.DeepEquals, params.ZoneResults{}) apiservertesting.CheckMethodCalls(c, apiservertesting.SharedStub, apiservertesting.BackingCall("AvailabilityZones"), apiservertesting.BackingCall("EnvironConfig"), apiservertesting.ProviderCall("Open", apiservertesting.BackingInstance.EnvConfig), apiservertesting.ZonedEnvironCall("AvailabilityZones"), apiservertesting.BackingCall("SetAvailabilityZones", apiservertesting.ProviderInstance.Zones), ) }
func (s *SubnetsSuite) TestAllZonesWithNoBackingZonesAndFetchingZonesFails(c *gc.C) { apiservertesting.BackingInstance.SetUp( c, apiservertesting.StubZonedEnvironName, apiservertesting.WithoutZones, apiservertesting.WithSpaces, apiservertesting.WithSubnets) apiservertesting.SharedStub.SetErrors( nil, // Backing.AvailabilityZones nil, // Backing.ModelConfig nil, // Backing.CloudSpec nil, // Provider.Open errors.NotValidf("foo"), // ZonedEnviron.AvailabilityZones ) results, err := networkingcommon.AllZones(apiservertesting.BackingInstance) c.Assert(err, gc.ErrorMatches, `cannot update known zones: foo not valid`, ) // Verify the cause is not obscured. c.Assert(err, jc.Satisfies, errors.IsNotValid) c.Assert(results, jc.DeepEquals, params.ZoneResults{}) apiservertesting.CheckMethodCalls(c, apiservertesting.SharedStub, apiservertesting.BackingCall("AvailabilityZones"), apiservertesting.BackingCall("ModelConfig"), apiservertesting.BackingCall("CloudSpec"), apiservertesting.ProviderCall("Open", apiservertesting.BackingInstance.EnvConfig), apiservertesting.ZonedEnvironCall("AvailabilityZones"), ) }
func (s *SubnetsSuite) TestAllZonesWithNoBackingZonesUpdates(c *gc.C) { apiservertesting.BackingInstance.SetUp(c, apiservertesting.StubZonedEnvironName, apiservertesting.WithoutZones, apiservertesting.WithSpaces, apiservertesting.WithSubnets) results, err := s.facade.AllZones() c.Assert(err, jc.ErrorIsNil) s.AssertAllZonesResult(c, results, apiservertesting.ProviderInstance.Zones) apiservertesting.CheckMethodCalls(c, apiservertesting.SharedStub, apiservertesting.BackingCall("AvailabilityZones"), apiservertesting.BackingCall("EnvironConfig"), apiservertesting.ProviderCall("Open", apiservertesting.BackingInstance.EnvConfig), apiservertesting.ZonedEnvironCall("AvailabilityZones"), apiservertesting.BackingCall("SetAvailabilityZones", apiservertesting.ProviderInstance.Zones), ) }
func (s *SubnetsSuite) CheckAddSubnetsFails( c *gc.C, envName string, withZones, withSpaces, withSubnets apiservertesting.SetUpFlag, expectedError string, ) { apiservertesting.BackingInstance.SetUp(c, envName, withZones, withSpaces, withSubnets) // These calls always happen. expectedCalls := []apiservertesting.StubMethodCall{ apiservertesting.BackingCall("EnvironConfig"), apiservertesting.ProviderCall("Open", apiservertesting.BackingInstance.EnvConfig), } // Subnets is also always called. but the receiver is different. switch envName { case apiservertesting.StubNetworkingEnvironName: expectedCalls = append( expectedCalls, apiservertesting.NetworkingEnvironCall("Subnets", instance.UnknownId, []network.Id(nil)), ) case apiservertesting.StubZonedNetworkingEnvironName: expectedCalls = append( expectedCalls, apiservertesting.ZonedNetworkingEnvironCall("Subnets", instance.UnknownId, []network.Id(nil)), ) } if !withSubnets { // Set provider subnets to empty for this test. originalSubnets := make([]network.SubnetInfo, len(apiservertesting.ProviderInstance.Subnets)) copy(originalSubnets, apiservertesting.ProviderInstance.Subnets) apiservertesting.ProviderInstance.Subnets = []network.SubnetInfo{} defer func() { apiservertesting.ProviderInstance.Subnets = make([]network.SubnetInfo, len(originalSubnets)) copy(apiservertesting.ProviderInstance.Subnets, originalSubnets) }() if envName == apiservertesting.StubEnvironName || envName == apiservertesting.StubNetworkingEnvironName { // networking is either not supported or no subnets are // defined, so expected the same calls for each of the two // arguments to AddSubnets() below. expectedCalls = append(expectedCalls, expectedCalls...) } } else { // Having subnets implies spaces will be cached as well. expectedCalls = append(expectedCalls, apiservertesting.BackingCall("AllSpaces")) } if withSpaces && withSubnets { // Having both subnets and spaces means we'll also cache zones. expectedCalls = append(expectedCalls, apiservertesting.BackingCall("AvailabilityZones")) } if !withZones && withSpaces { // Set provider zones to empty for this test. originalZones := make([]providercommon.AvailabilityZone, len(apiservertesting.ProviderInstance.Zones)) copy(originalZones, apiservertesting.ProviderInstance.Zones) apiservertesting.ProviderInstance.Zones = []providercommon.AvailabilityZone{} defer func() { apiservertesting.ProviderInstance.Zones = make([]providercommon.AvailabilityZone, len(originalZones)) copy(apiservertesting.ProviderInstance.Zones, originalZones) }() // updateZones tries to constructs a ZonedEnviron with these calls. zoneCalls := append([]apiservertesting.StubMethodCall{}, apiservertesting.BackingCall("EnvironConfig"), apiservertesting.ProviderCall("Open", apiservertesting.BackingInstance.EnvConfig), ) // Receiver can differ according to envName, but // AvailabilityZones() will be called on either receiver. switch envName { case apiservertesting.StubZonedEnvironName: zoneCalls = append( zoneCalls, apiservertesting.ZonedEnvironCall("AvailabilityZones"), ) case apiservertesting.StubZonedNetworkingEnvironName: zoneCalls = append( zoneCalls, apiservertesting.ZonedNetworkingEnvironCall("AvailabilityZones"), ) } // Finally after caching provider zones backing zones are // updated. zoneCalls = append( zoneCalls, apiservertesting.BackingCall("SetAvailabilityZones", apiservertesting.ProviderInstance.Zones), ) // Now, because we have 2 arguments to AddSubnets() below, we // need to expect the same zoneCalls twice, with a // AvailabilityZones backing lookup between them. expectedCalls = append(expectedCalls, zoneCalls...) expectedCalls = append(expectedCalls, apiservertesting.BackingCall("AvailabilityZones")) expectedCalls = append(expectedCalls, zoneCalls...) } // Pass 2 arguments covering all cases we need. args := params.AddSubnetsParams{ Subnets: []params.AddSubnetParams{{ SubnetTag: "subnet-10.42.0.0/16", SpaceTag: "space-dmz", Zones: []string{"zone1"}, }, { SubnetProviderId: "vlan-42", SpaceTag: "space-private", Zones: []string{"zone3"}, }}, } results, err := s.facade.AddSubnets(args) c.Assert(err, jc.ErrorIsNil) c.Assert(results.Results, gc.HasLen, len(args.Subnets)) for _, result := range results.Results { if !c.Check(result.Error, gc.NotNil) { continue } c.Check(result.Error, gc.ErrorMatches, expectedError) c.Check(result.Error.Code, gc.Equals, "") } apiservertesting.CheckMethodCalls(c, apiservertesting.SharedStub, expectedCalls...) }