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 }