gopkg.in/goose.v2@v2.0.1/testservices/neutronservice/service_test.go (about)

     1  // Neutron double testing service - internal direct API tests
     2  
     3  package neutronservice
     4  
     5  import (
     6  	"fmt"
     7  
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"gopkg.in/goose.v2/neutron"
    11  	"gopkg.in/goose.v2/testservices/neutronmodel"
    12  )
    13  
    14  type NeutronSuite struct {
    15  	service *Neutron
    16  }
    17  
    18  const (
    19  	versionPath = "v2.0"
    20  	hostname    = "http://example.com"
    21  	region      = "region"
    22  )
    23  
    24  var _ = gc.Suite(&NeutronSuite{})
    25  
    26  func (s *NeutronSuite) SetUpSuite(c *gc.C) {
    27  	s.service = New(hostname, versionPath, "tenant", region, nil, nil)
    28  	s.service.AddNeutronModel(neutronmodel.New())
    29  }
    30  
    31  func (s *NeutronSuite) ensureNoGroup(c *gc.C, group neutron.SecurityGroupV2) {
    32  	_, err := s.service.securityGroup(group.Id)
    33  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("itemNotFound: No such security group %s", group.Id))
    34  }
    35  
    36  func (s *NeutronSuite) ensureNoRule(c *gc.C, rule neutron.SecurityGroupRuleV2) {
    37  	_, err := s.service.securityGroupRule(rule.Id)
    38  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("itemNotFound: No such security group rule %s", rule.Id))
    39  }
    40  
    41  func (s *NeutronSuite) ensureNoIP(c *gc.C, ip neutron.FloatingIPV2) {
    42  	_, err := s.service.floatingIP(ip.Id)
    43  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("itemNotFound: No such floating IP %q", ip.Id))
    44  }
    45  
    46  func (s *NeutronSuite) ensureNoNetwork(c *gc.C, network neutron.NetworkV2) {
    47  	_, err := s.service.network(network.Id)
    48  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("itemNotFound: No such network %q", network.Id))
    49  }
    50  
    51  func (s *NeutronSuite) ensureNoSubnet(c *gc.C, subnet neutron.SubnetV2) {
    52  	_, err := s.service.subnet(subnet.Id)
    53  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("itemNotFound: No such subnet %q", subnet.Id))
    54  }
    55  
    56  func (s *NeutronSuite) ensureNoPort(c *gc.C, port neutron.PortV2) {
    57  	_, err := s.service.port(port.Id)
    58  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("itemNotFound: No such port %s", port.Id))
    59  }
    60  
    61  func (s *NeutronSuite) createGroup(c *gc.C, group neutron.SecurityGroupV2) {
    62  	s.ensureNoGroup(c, group)
    63  	err := s.service.addSecurityGroup(group)
    64  	c.Assert(err, gc.IsNil)
    65  }
    66  
    67  func (s *NeutronSuite) createIP(c *gc.C, ip neutron.FloatingIPV2) {
    68  	s.ensureNoIP(c, ip)
    69  	err := s.service.addFloatingIP(ip)
    70  	c.Assert(err, gc.IsNil)
    71  }
    72  
    73  func (s *NeutronSuite) createPort(c *gc.C, port neutron.PortV2) {
    74  	s.ensureNoPort(c, port)
    75  	err := s.service.addPort(port)
    76  	c.Assert(err, gc.IsNil)
    77  }
    78  
    79  func (s *NeutronSuite) deleteGroup(c *gc.C, group neutron.SecurityGroupV2) {
    80  	err := s.service.removeSecurityGroup(group.Id)
    81  	c.Assert(err, gc.IsNil)
    82  	s.ensureNoGroup(c, group)
    83  }
    84  
    85  func (s *NeutronSuite) deleteRule(c *gc.C, rule neutron.SecurityGroupRuleV2) {
    86  	err := s.service.removeSecurityGroupRule(rule.Id)
    87  	c.Assert(err, gc.IsNil)
    88  	s.ensureNoRule(c, rule)
    89  }
    90  
    91  func (s *NeutronSuite) deleteIP(c *gc.C, ip neutron.FloatingIPV2) {
    92  	err := s.service.removeFloatingIP(ip.Id)
    93  	c.Assert(err, gc.IsNil)
    94  	s.ensureNoIP(c, ip)
    95  }
    96  
    97  func (s *NeutronSuite) deletePort(c *gc.C, port neutron.PortV2) {
    98  	err := s.service.removePort(port.Id)
    99  	c.Assert(err, gc.IsNil)
   100  	s.ensureNoPort(c, port)
   101  }
   102  
   103  func (s *NeutronSuite) TestAddRemoveSecurityGroup(c *gc.C) {
   104  	group := neutron.SecurityGroupV2{Id: "1"}
   105  	s.createGroup(c, group)
   106  	s.deleteGroup(c, group)
   107  }
   108  
   109  func (s *NeutronSuite) TestRemoveSecurityGroupTwiceFails(c *gc.C) {
   110  	group := neutron.SecurityGroupV2{Id: "1", Name: "test"}
   111  	s.createGroup(c, group)
   112  	s.deleteGroup(c, group)
   113  	err := s.service.removeSecurityGroup(group.Id)
   114  	c.Assert(err, gc.ErrorMatches, "itemNotFound: No such security group 1")
   115  }
   116  
   117  func (s *NeutronSuite) TestAllSecurityGroups(c *gc.C) {
   118  	groups := s.service.allSecurityGroups()
   119  	// There is always a default security group.
   120  	c.Assert(groups, gc.HasLen, 1)
   121  	groups = []neutron.SecurityGroupV2{
   122  		{
   123  			Id:       "1",
   124  			Name:     "one",
   125  			TenantId: s.service.TenantId,
   126  			Rules:    []neutron.SecurityGroupRuleV2{},
   127  		},
   128  		{
   129  			Id:       "2",
   130  			Name:     "two",
   131  			TenantId: s.service.TenantId,
   132  			Rules:    []neutron.SecurityGroupRuleV2{},
   133  		},
   134  	}
   135  	s.createGroup(c, groups[0])
   136  	defer s.deleteGroup(c, groups[0])
   137  	s.createGroup(c, groups[1])
   138  	defer s.deleteGroup(c, groups[1])
   139  	groups[0].Rules = defaultSecurityGroupRules(groups[0].Id, groups[0].TenantId)
   140  	groups[1].Rules = defaultSecurityGroupRules(groups[1].Id, groups[1].TenantId)
   141  	gr := s.service.allSecurityGroups()
   142  	c.Assert(gr, gc.HasLen, len(groups)+1)
   143  	checkGroupsInList(c, groups, gr)
   144  }
   145  
   146  func (s *NeutronSuite) TestGetSecurityGroup(c *gc.C) {
   147  	group := neutron.SecurityGroupV2{
   148  		Id:          "42",
   149  		TenantId:    s.service.TenantId,
   150  		Name:        "group",
   151  		Description: "desc",
   152  		Rules:       []neutron.SecurityGroupRuleV2{},
   153  	}
   154  	s.createGroup(c, group)
   155  	group.Rules = defaultSecurityGroupRules(group.Id, group.TenantId)
   156  	defer s.deleteGroup(c, group)
   157  	gr, _ := s.service.securityGroup(group.Id)
   158  	c.Assert(*gr, gc.DeepEquals, group)
   159  }
   160  
   161  func (s *NeutronSuite) TestGetSecurityGroupByName(c *gc.C) {
   162  	group := neutron.SecurityGroupV2{
   163  		Id:       "1",
   164  		Name:     "test",
   165  		TenantId: s.service.TenantId,
   166  		Rules:    []neutron.SecurityGroupRuleV2{},
   167  	}
   168  	s.ensureNoGroup(c, group)
   169  	gr, err := s.service.securityGroupByName(group.Name)
   170  	c.Assert(gr, gc.HasLen, 0)
   171  	s.createGroup(c, group)
   172  	defer s.deleteGroup(c, group)
   173  	group.Rules = defaultSecurityGroupRules(group.Id, group.TenantId)
   174  	gr, err = s.service.securityGroupByName(group.Name)
   175  	c.Assert(err, gc.IsNil)
   176  	c.Assert(gr, gc.HasLen, 1)
   177  	c.Assert(gr[0], gc.DeepEquals, group)
   178  	group2 := neutron.SecurityGroupV2{
   179  		Id:       "2",
   180  		Name:     "test group",
   181  		TenantId: s.service.TenantId,
   182  		Rules:    []neutron.SecurityGroupRuleV2{},
   183  	}
   184  	s.ensureNoGroup(c, group2)
   185  	gr2, err := s.service.securityGroupByName(group2.Name)
   186  	c.Assert(gr2, gc.HasLen, 0)
   187  	s.createGroup(c, group2)
   188  	defer s.deleteGroup(c, group2)
   189  	group2.Rules = defaultSecurityGroupRules(group2.Id, group2.TenantId)
   190  	gr2, err = s.service.securityGroupByName(group2.Name)
   191  	c.Assert(err, gc.IsNil)
   192  	c.Assert(gr2, gc.HasLen, 1)
   193  	c.Assert(gr2[0], gc.DeepEquals, group2)
   194  }
   195  
   196  func (s *NeutronSuite) TestAddHasRemoveSecurityGroupRule(c *gc.C) {
   197  	group := neutron.SecurityGroupV2{Id: "1"}
   198  	ri := neutron.RuleInfoV2{ParentGroupId: group.Id, Direction: "egress"}
   199  	rule := neutron.SecurityGroupRuleV2{Id: "10", ParentGroupId: group.Id}
   200  	s.ensureNoGroup(c, group)
   201  	s.ensureNoRule(c, rule)
   202  	ok := s.service.hasSecurityGroupRule(group.Id, rule.Id)
   203  	c.Assert(ok, gc.Equals, false)
   204  	s.createGroup(c, group)
   205  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   206  	c.Assert(err, gc.IsNil)
   207  	ok = s.service.hasSecurityGroupRule(group.Id, rule.Id)
   208  	c.Assert(ok, gc.Equals, true)
   209  	s.deleteGroup(c, group)
   210  	ok = s.service.hasSecurityGroupRule("-1", rule.Id)
   211  	c.Assert(ok, gc.Equals, true)
   212  	ok = s.service.hasSecurityGroupRule(group.Id, rule.Id)
   213  	c.Assert(ok, gc.Equals, false)
   214  	s.deleteRule(c, rule)
   215  	ok = s.service.hasSecurityGroupRule("-1", rule.Id)
   216  	c.Assert(ok, gc.Equals, false)
   217  }
   218  
   219  func (s *NeutronSuite) TestAddGetIngressSecurityGroupRule(c *gc.C) {
   220  	group := neutron.SecurityGroupV2{Id: "1"}
   221  	s.createGroup(c, group)
   222  	defer s.deleteGroup(c, group)
   223  	ri := neutron.RuleInfoV2{
   224  		Direction:      "ingress",
   225  		PortRangeMax:   1234,
   226  		PortRangeMin:   4321,
   227  		IPProtocol:     "tcp",
   228  		ParentGroupId:  group.Id,
   229  		RemoteIPPrefix: "1.2.3.4/5",
   230  	}
   231  	rule := neutron.SecurityGroupRuleV2{
   232  		Id:             "10",
   233  		Direction:      "ingress",
   234  		PortRangeMax:   &ri.PortRangeMax,
   235  		PortRangeMin:   &ri.PortRangeMin,
   236  		IPProtocol:     &ri.IPProtocol,
   237  		ParentGroupId:  group.Id,
   238  		RemoteIPPrefix: "1.2.3.4/5",
   239  	}
   240  	s.ensureNoRule(c, rule)
   241  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   242  	c.Assert(err, gc.IsNil)
   243  	defer s.deleteRule(c, rule)
   244  	ru, err := s.service.securityGroupRule(rule.Id)
   245  	c.Assert(err, gc.IsNil)
   246  	c.Assert(ru.Id, gc.Equals, rule.Id)
   247  	c.Assert(ru.Direction, gc.Equals, rule.Direction)
   248  	c.Assert(ru.ParentGroupId, gc.Equals, rule.ParentGroupId)
   249  	c.Assert(*ru.PortRangeMax, gc.Equals, *rule.PortRangeMax)
   250  	c.Assert(*ru.PortRangeMin, gc.Equals, *rule.PortRangeMin)
   251  	c.Assert(*ru.IPProtocol, gc.Equals, *rule.IPProtocol)
   252  	c.Assert(ru.RemoteIPPrefix, gc.Equals, rule.RemoteIPPrefix)
   253  }
   254  
   255  func (s *NeutronSuite) TestAddGetGroupSecurityGroupRule(c *gc.C) {
   256  	srcGroup := neutron.SecurityGroupV2{Id: "1", Name: "source", TenantId: s.service.TenantId}
   257  	tgtGroup := neutron.SecurityGroupV2{Id: "2", Name: "target", TenantId: s.service.TenantId}
   258  	s.createGroup(c, srcGroup)
   259  	defer s.deleteGroup(c, srcGroup)
   260  	s.createGroup(c, tgtGroup)
   261  	defer s.deleteGroup(c, tgtGroup)
   262  	ri := neutron.RuleInfoV2{
   263  		Direction:     "ingress",
   264  		PortRangeMax:  1234,
   265  		PortRangeMin:  4321,
   266  		IPProtocol:    "tcp",
   267  		ParentGroupId: tgtGroup.Id,
   268  	}
   269  	rule := neutron.SecurityGroupRuleV2{
   270  		Id:            "10",
   271  		Direction:     "ingress",
   272  		ParentGroupId: tgtGroup.Id,
   273  		PortRangeMax:  &ri.PortRangeMax,
   274  		PortRangeMin:  &ri.PortRangeMin,
   275  		IPProtocol:    &ri.IPProtocol,
   276  	}
   277  	s.ensureNoRule(c, rule)
   278  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   279  	c.Assert(err, gc.IsNil)
   280  	defer s.deleteRule(c, rule)
   281  	ru, err := s.service.securityGroupRule(rule.Id)
   282  	c.Assert(err, gc.IsNil)
   283  	c.Assert(ru.Id, gc.Equals, rule.Id)
   284  	c.Assert(ru.ParentGroupId, gc.Equals, rule.ParentGroupId)
   285  	c.Assert(*ru.PortRangeMax, gc.Equals, *rule.PortRangeMax)
   286  	c.Assert(*ru.PortRangeMin, gc.Equals, *rule.PortRangeMin)
   287  	c.Assert(*ru.IPProtocol, gc.Equals, *rule.IPProtocol)
   288  	c.Assert(ru.Direction, gc.Equals, rule.Direction)
   289  }
   290  
   291  func (s *NeutronSuite) TestAddSecurityGroupRuleToParentTwiceFails(c *gc.C) {
   292  	group := neutron.SecurityGroupV2{
   293  		Id:   "1",
   294  		Name: "TestAddSecurityGroupRuleToParentTwiceFails",
   295  	}
   296  	s.createGroup(c, group)
   297  	defer s.deleteGroup(c, group)
   298  	ri := neutron.RuleInfoV2{ParentGroupId: group.Id, Direction: "ingress"}
   299  	rule := neutron.SecurityGroupRuleV2{Id: "10"}
   300  	defer s.deleteRule(c, rule)
   301  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   302  	c.Assert(err, gc.IsNil)
   303  	err = s.service.addSecurityGroupRule(rule.Id, ri)
   304  	c.Assert(err, gc.ErrorMatches, "conflictingRequest: Security group rule already exists. Group id is 1.")
   305  }
   306  
   307  func (s *NeutronSuite) TestAddSecurityGroupRuleWithInvalidParentFails(c *gc.C) {
   308  	invalidGroup := neutron.SecurityGroupV2{Id: "1"}
   309  	s.ensureNoGroup(c, invalidGroup)
   310  	ri := neutron.RuleInfoV2{ParentGroupId: invalidGroup.Id, Direction: "egress"}
   311  	rule := neutron.SecurityGroupRuleV2{Id: "10", Direction: "egress"}
   312  	s.ensureNoRule(c, rule)
   313  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   314  	c.Assert(err, gc.ErrorMatches, "itemNotFound: No such security group 1")
   315  }
   316  
   317  func (s *NeutronSuite) TestAddGroupSecurityGroupRuleWithInvalidDirectionFails(c *gc.C) {
   318  	group := neutron.SecurityGroupV2{Id: "1"}
   319  	s.createGroup(c, group)
   320  	defer s.deleteGroup(c, group)
   321  	invalidDirection := "42"
   322  	ri := neutron.RuleInfoV2{
   323  		ParentGroupId: group.Id,
   324  		Direction:     invalidDirection,
   325  	}
   326  	rule := neutron.SecurityGroupRuleV2{Id: "10"}
   327  	s.ensureNoRule(c, rule)
   328  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   329  	c.Assert(err, gc.ErrorMatches, "badRequest: Invalid input for direction. Reason: 42 is not ingress or egress.")
   330  }
   331  
   332  func (s *NeutronSuite) TestAddSecurityGroupRuleUpdatesParent(c *gc.C) {
   333  	group := neutron.SecurityGroupV2{
   334  		Id:       "8",
   335  		Name:     "test",
   336  		TenantId: s.service.TenantId,
   337  	}
   338  	s.createGroup(c, group)
   339  	defer s.deleteGroup(c, group)
   340  	ri := neutron.RuleInfoV2{ParentGroupId: group.Id, Direction: "egress"}
   341  	rule := neutron.SecurityGroupRuleV2{
   342  		Id:            "45",
   343  		ParentGroupId: group.Id,
   344  		Direction:     "egress",
   345  		TenantId:      s.service.TenantId,
   346  		EthernetType:  "IPv4",
   347  	}
   348  	s.ensureNoRule(c, rule)
   349  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   350  	c.Assert(err, gc.IsNil)
   351  	defer s.deleteRule(c, rule)
   352  	group.Rules = defaultSecurityGroupRules(group.Id, group.TenantId)
   353  	group.Rules = append(group.Rules, rule)
   354  	gr, err := s.service.securityGroup(group.Id)
   355  	c.Assert(err, gc.IsNil)
   356  	c.Assert(*gr, gc.DeepEquals, group)
   357  }
   358  
   359  func (s *NeutronSuite) TestRemoveSecurityGroupRuleTwiceFails(c *gc.C) {
   360  	group := neutron.SecurityGroupV2{Id: "1"}
   361  	s.createGroup(c, group)
   362  	defer s.deleteGroup(c, group)
   363  	ri := neutron.RuleInfoV2{ParentGroupId: group.Id, Direction: "egress"}
   364  	rule := neutron.SecurityGroupRuleV2{Id: "10"}
   365  	s.ensureNoRule(c, rule)
   366  	err := s.service.addSecurityGroupRule(rule.Id, ri)
   367  	c.Assert(err, gc.IsNil)
   368  	s.deleteRule(c, rule)
   369  	err = s.service.removeSecurityGroupRule(rule.Id)
   370  	c.Assert(err, gc.ErrorMatches, "itemNotFound: No such security group rule 10")
   371  }
   372  
   373  func (s *NeutronSuite) TestAddHasRemoveFloatingIP(c *gc.C) {
   374  	ip := neutron.FloatingIPV2{Id: "1", IP: "1.2.3.4"}
   375  	s.ensureNoIP(c, ip)
   376  	ok := s.service.hasFloatingIP(ip.IP)
   377  	c.Assert(ok, gc.Equals, false)
   378  	s.createIP(c, ip)
   379  	ok = s.service.hasFloatingIP("invalid IP")
   380  	c.Assert(ok, gc.Equals, false)
   381  	ok = s.service.hasFloatingIP(ip.IP)
   382  	c.Assert(ok, gc.Equals, true)
   383  	s.deleteIP(c, ip)
   384  	ok = s.service.hasFloatingIP(ip.IP)
   385  	c.Assert(ok, gc.Equals, false)
   386  }
   387  
   388  func (s *NeutronSuite) TestAddFloatingIPTwiceFails(c *gc.C) {
   389  	ip := neutron.FloatingIPV2{Id: "1"}
   390  	s.createIP(c, ip)
   391  	defer s.deleteIP(c, ip)
   392  	err := s.service.addFloatingIP(ip)
   393  	c.Assert(err, gc.ErrorMatches, "conflictingRequest: A floating IP with id 1 already exists")
   394  }
   395  
   396  func (s *NeutronSuite) TestRemoveFloatingIPTwiceFails(c *gc.C) {
   397  	ip := neutron.FloatingIPV2{Id: "1"}
   398  	s.createIP(c, ip)
   399  	s.deleteIP(c, ip)
   400  	err := s.service.removeFloatingIP(ip.Id)
   401  	c.Assert(err, gc.ErrorMatches, "itemNotFound: No such floating IP \"1\"")
   402  }
   403  
   404  func (s *NeutronSuite) TestAllFloatingIPs(c *gc.C) {
   405  	fips := s.service.allFloatingIPs(nil)
   406  	c.Assert(fips, gc.HasLen, 0)
   407  	fips = []neutron.FloatingIPV2{
   408  		{Id: "1"},
   409  		{Id: "2"},
   410  	}
   411  	s.createIP(c, fips[0])
   412  	defer s.deleteIP(c, fips[0])
   413  	s.createIP(c, fips[1])
   414  	defer s.deleteIP(c, fips[1])
   415  	ips := s.service.allFloatingIPs(nil)
   416  	c.Assert(ips, gc.HasLen, len(fips))
   417  	if ips[0].Id != fips[0].Id {
   418  		ips[0], ips[1] = ips[1], ips[0]
   419  	}
   420  	c.Assert(ips, gc.DeepEquals, fips)
   421  }
   422  
   423  func (s *NeutronSuite) TestAllFloatingIPsWithFilter(c *gc.C) {
   424  	newNets := []neutron.NetworkV2{
   425  		{Id: "75", Name: "ListNetwork75", External: true, SubnetIds: []string{}, TenantId: "tenant-one"},
   426  		{Id: "42", Name: "ListNetwork42", External: true, SubnetIds: []string{}, TenantId: "tenant-two"},
   427  	}
   428  	err := s.service.addNetwork(newNets[0])
   429  	c.Assert(err, gc.IsNil)
   430  	defer s.service.removeNetwork(newNets[0].Id)
   431  	err = s.service.addNetwork(newNets[1])
   432  	c.Assert(err, gc.IsNil)
   433  	defer s.service.removeNetwork(newNets[1].Id)
   434  
   435  	fips := []neutron.FloatingIPV2{
   436  		{Id: "1", FloatingNetworkId: "75"},
   437  		{Id: "2", FloatingNetworkId: "42"},
   438  	}
   439  	s.createIP(c, fips[0])
   440  	defer s.deleteIP(c, fips[0])
   441  	s.createIP(c, fips[1])
   442  	defer s.deleteIP(c, fips[1])
   443  
   444  	f := filter{
   445  		neutron.FilterProjectId: "tenant-two",
   446  	}
   447  	filteredFips := s.service.allFloatingIPs(f)
   448  	c.Assert(filteredFips, gc.HasLen, 1)
   449  	c.Assert(filteredFips[0].Id, gc.DeepEquals, fips[1].Id)
   450  }
   451  
   452  func (s *NeutronSuite) TestGetFloatingIP(c *gc.C) {
   453  	fip := neutron.FloatingIPV2{
   454  		Id:                "1",
   455  		IP:                "1.2.3.4",
   456  		FloatingNetworkId: "sr1",
   457  		FixedIP:           "4.3.2.1",
   458  	}
   459  	s.createIP(c, fip)
   460  	defer s.deleteIP(c, fip)
   461  	ip, _ := s.service.floatingIP(fip.Id)
   462  	c.Assert(*ip, gc.DeepEquals, fip)
   463  }
   464  
   465  func (s *NeutronSuite) TestGetFloatingIPByAddr(c *gc.C) {
   466  	fip := neutron.FloatingIPV2{Id: "1", IP: "1.2.3.4"}
   467  	s.ensureNoIP(c, fip)
   468  	ip, err := s.service.floatingIPByAddr(fip.IP)
   469  	c.Assert(err, gc.NotNil)
   470  	s.createIP(c, fip)
   471  	defer s.deleteIP(c, fip)
   472  	ip, err = s.service.floatingIPByAddr(fip.IP)
   473  	c.Assert(err, gc.IsNil)
   474  	c.Assert(*ip, gc.DeepEquals, fip)
   475  	_, err = s.service.floatingIPByAddr("invalid")
   476  	c.Assert(err, gc.ErrorMatches, `itemNotFound: No such floating IP "invalid"`)
   477  }
   478  
   479  func (s *NeutronSuite) TestAllNetworksV2(c *gc.C) {
   480  	networks, err := s.service.allNetworks(nil)
   481  	c.Assert(err, gc.IsNil)
   482  	newNets := []neutron.NetworkV2{
   483  		{Id: "75", Name: "ListNetwork75", External: true, SubnetIds: []string{}, TenantId: s.service.TenantId},
   484  		{Id: "42", Name: "ListNetwork42", External: true, SubnetIds: []string{}, TenantId: s.service.TenantId},
   485  	}
   486  	err = s.service.addNetwork(newNets[0])
   487  	c.Assert(err, gc.IsNil)
   488  	defer s.service.removeNetwork(newNets[0].Id)
   489  	err = s.service.addNetwork(newNets[1])
   490  	c.Assert(err, gc.IsNil)
   491  	defer s.service.removeNetwork(newNets[1].Id)
   492  	newNets[0].TenantId = s.service.TenantId
   493  	newNets[1].TenantId = s.service.TenantId
   494  	networks = append(networks, newNets...)
   495  	foundNetworks, err := s.service.allNetworks(nil)
   496  	c.Assert(err, gc.IsNil)
   497  	c.Assert(foundNetworks, gc.HasLen, len(networks))
   498  	for _, net := range networks {
   499  		for _, newNet := range foundNetworks {
   500  			if net.Id == newNet.Id {
   501  				c.Assert(net, gc.DeepEquals, newNet)
   502  			}
   503  		}
   504  	}
   505  }
   506  
   507  func (s *NeutronSuite) TestAllNetworksV2WithMultipleFilters(c *gc.C) {
   508  	newNets := []neutron.NetworkV2{
   509  		{Id: "75", Name: "ListNetwork75", External: true, SubnetIds: []string{}, TenantId: s.service.TenantId},
   510  		{Id: "7", Name: "ListNetwork7", External: false, SubnetIds: []string{}, TenantId: s.service.TenantId},
   511  		{Id: "42", Name: "ListNetwork42", External: true, SubnetIds: []string{}, TenantId: s.service.TenantId},
   512  	}
   513  	for _, net := range newNets {
   514  		err := s.service.addNetwork(net)
   515  		c.Assert(err, gc.IsNil)
   516  		defer s.service.removeNetwork(net.Id)
   517  		net.TenantId = s.service.TenantId
   518  	}
   519  	f := filter{
   520  		neutron.FilterRouterExternal: "true",
   521  		neutron.FilterNetwork:        "ListNetwork42",
   522  	}
   523  	foundNetworks, err := s.service.allNetworks(f)
   524  	c.Assert(err, gc.IsNil)
   525  	c.Assert(foundNetworks, gc.HasLen, 1)
   526  	c.Assert(foundNetworks[0], gc.DeepEquals, newNets[2])
   527  }
   528  
   529  func (s *NeutronSuite) TestAllNetworksV2WithFilters(c *gc.C) {
   530  	networks, err := s.service.allNetworks(nil)
   531  	c.Assert(err, gc.IsNil)
   532  	newNets := []neutron.NetworkV2{
   533  		{Id: "75", Name: "ListNetwork75", External: true, SubnetIds: []string{}, TenantId: s.service.TenantId},
   534  		{Id: "7", Name: "ListNetwork7", External: false, SubnetIds: []string{}, TenantId: s.service.TenantId},
   535  		{Id: "42", Name: "ListNetwork42", External: true, SubnetIds: []string{}, TenantId: s.service.TenantId},
   536  	}
   537  	for _, net := range newNets {
   538  		err := s.service.addNetwork(net)
   539  		c.Assert(err, gc.IsNil)
   540  		defer s.service.removeNetwork(net.Id)
   541  		net.TenantId = s.service.TenantId
   542  	}
   543  	f := filter{
   544  		neutron.FilterRouterExternal: "true",
   545  	}
   546  	foundNetworks, err := s.service.allNetworks(f)
   547  	c.Assert(err, gc.IsNil)
   548  	c.Assert(foundNetworks, gc.HasLen, 4)
   549  	for _, net := range networks {
   550  		if net.External == true {
   551  			for _, newNet := range foundNetworks {
   552  				if net.Id == newNet.Id {
   553  					c.Assert(net, gc.DeepEquals, newNet)
   554  				}
   555  			}
   556  		}
   557  	}
   558  	f = filter{
   559  		neutron.FilterNetwork: "ListNetwork7",
   560  	}
   561  	foundNetworks, err = s.service.allNetworks(f)
   562  	c.Assert(err, gc.IsNil)
   563  	c.Assert(foundNetworks, gc.HasLen, 1)
   564  	c.Assert(foundNetworks[0].Name, gc.Equals, "ListNetwork7")
   565  }
   566  
   567  func (s *NeutronSuite) TestGetNetworkV2(c *gc.C) {
   568  	network := neutron.NetworkV2{
   569  		Id:        "75",
   570  		Name:      "ListNetwork75",
   571  		SubnetIds: []string{"32", "86"},
   572  		External:  true,
   573  		TenantId:  s.service.TenantId,
   574  	}
   575  	s.ensureNoNetwork(c, network)
   576  	s.service.addNetwork(network)
   577  	defer s.service.removeNetwork(network.Id)
   578  	net, _ := s.service.network(network.Id)
   579  	c.Assert(*net, gc.DeepEquals, network)
   580  }
   581  
   582  func (s *NeutronSuite) TestAllSubnetsV2(c *gc.C) {
   583  	subnets := s.service.allSubnets()
   584  	newSubs := []neutron.SubnetV2{
   585  		{Id: "86", Name: "ListSubnet86", Cidr: "192.168.0.0/24"},
   586  		{Id: "92", Name: "ListSubnet92", Cidr: "192.169.0.0/24"},
   587  	}
   588  	err := s.service.addSubnet(newSubs[0])
   589  	c.Assert(err, gc.IsNil)
   590  	defer s.service.removeSubnet(newSubs[0].Id)
   591  	err = s.service.addSubnet(newSubs[1])
   592  	c.Assert(err, gc.IsNil)
   593  	defer s.service.removeSubnet(newSubs[1].Id)
   594  	newSubs[0].TenantId = s.service.TenantId
   595  	newSubs[1].TenantId = s.service.TenantId
   596  	subnets = append(subnets, newSubs...)
   597  	foundSubnets := s.service.allSubnets()
   598  	c.Assert(foundSubnets, gc.HasLen, len(subnets))
   599  	for _, sub := range subnets {
   600  		for _, newSub := range foundSubnets {
   601  			if sub.Id == newSub.Id {
   602  				c.Assert(sub, gc.DeepEquals, newSub)
   603  			}
   604  		}
   605  	}
   606  }
   607  
   608  func (s *NeutronSuite) TestGetSubnetV2(c *gc.C) {
   609  	subnet := neutron.SubnetV2{
   610  		Id:       "82",
   611  		Name:     "ListSubnet82",
   612  		TenantId: s.service.TenantId,
   613  	}
   614  	s.service.addSubnet(subnet)
   615  	defer s.service.removeSubnet(subnet.Id)
   616  	sub, _ := s.service.subnet(subnet.Id)
   617  	c.Assert(*sub, gc.DeepEquals, subnet)
   618  }
   619  
   620  func (s *NeutronSuite) TestAddRemovePort(c *gc.C) {
   621  	port := neutron.PortV2{Id: "1"}
   622  	s.createPort(c, port)
   623  	s.deletePort(c, port)
   624  }
   625  
   626  func (s *NeutronSuite) TestRemovePortTwiceFails(c *gc.C) {
   627  	port := neutron.PortV2{Id: "1", Name: "test"}
   628  	s.createPort(c, port)
   629  	s.deletePort(c, port)
   630  	err := s.service.removePort(port.Id)
   631  	c.Assert(err, gc.ErrorMatches, "itemNotFound: No such port 1")
   632  }
   633  
   634  func (s *NeutronSuite) TestAllPorts(c *gc.C) {
   635  	ports := s.service.allPorts()
   636  	// There is always a default security group.
   637  	c.Assert(ports, gc.HasLen, 0)
   638  	ports = []neutron.PortV2{
   639  		{
   640  			Id:        "1",
   641  			Name:      "one",
   642  			NetworkId: "a87cc70a-3e15-4acf-8205-9b711a3531b7",
   643  			TenantId:  s.service.TenantId,
   644  			Tags:      []string{"tag0", "tag1"},
   645  		},
   646  		{
   647  			Id:        "2",
   648  			Name:      "two",
   649  			NetworkId: "a87cc70a-3e15-4acf-8205-9b711a3531xx",
   650  			TenantId:  s.service.TenantId,
   651  			Tags:      []string{"tag2", "tag3"},
   652  		},
   653  	}
   654  
   655  	s.createPort(c, ports[0])
   656  	defer s.deletePort(c, ports[0])
   657  
   658  	s.createPort(c, ports[1])
   659  	defer s.deletePort(c, ports[1])
   660  
   661  	pr := s.service.allPorts()
   662  	c.Assert(pr, gc.HasLen, len(ports))
   663  	checkPortsInList(c, ports, pr)
   664  }
   665  
   666  func (s *NeutronSuite) TestGetPort(c *gc.C) {
   667  	port := neutron.PortV2{
   668  		Id:          "42",
   669  		TenantId:    s.service.TenantId,
   670  		Name:        "port",
   671  		Description: "desc",
   672  		NetworkId:   "a87cc70a-3e15-4acf-8205-9b711a3531xx",
   673  		Tags:        []string{"tag0", "tag1"},
   674  	}
   675  	s.createPort(c, port)
   676  	defer s.deletePort(c, port)
   677  	gr, _ := s.service.port(port.Id)
   678  	c.Assert(*gr, gc.DeepEquals, port)
   679  }