test_network_service.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import test.helpers as helpers
  2. import uuid
  3. from test.helpers import ProviderTestBase
  4. from test.helpers import standard_interface_tests as sit
  5. from cloudbridge.cloud.interfaces.resources import RouterState
  6. class CloudNetworkServiceTestCase(ProviderTestBase):
  7. @helpers.skipIfNoService(['network'])
  8. def test_crud_network_service(self):
  9. name = 'cbtestnetworkservice-{0}'.format(uuid.uuid4())
  10. subnet_name = 'cbtestsubnetservice-{0}'.format(uuid.uuid4())
  11. net = self.provider.network.create(name=name)
  12. with helpers.cleanup_action(
  13. lambda:
  14. self.provider.network.delete(network_id=net.id)
  15. ):
  16. sit.check_standard_behaviour(
  17. self, self.provider.network, net)
  18. # check subnet
  19. subnet = self.provider.network.subnets.create(
  20. network=net, cidr_block="10.0.0.1/24", name=subnet_name)
  21. with helpers.cleanup_action(
  22. lambda:
  23. self.provider.network.subnets.delete(subnet=subnet)
  24. ):
  25. # test list method
  26. subnetl = self.provider.network.subnets.list(network=net)
  27. list_subnetl = [n for n in subnetl if n.name == subnet_name]
  28. self.assertTrue(
  29. len(list_subnetl) == 1,
  30. "List subnets does not return the expected subnet %s" %
  31. subnet_name)
  32. # test get method
  33. sn = self.provider.network.subnets.get(subnet.id)
  34. self.assertTrue(
  35. subnet.id == sn.id,
  36. "GETting subnet should return the same subnet")
  37. subnetl = self.provider.network.subnets.list()
  38. found_subnet = [n for n in subnetl if n.name == subnet_name]
  39. self.assertTrue(
  40. len(found_subnet) == 0,
  41. "Subnet {0} should have been deleted but still exists."
  42. .format(subnet_name))
  43. # Check floating IP address
  44. ip = self.provider.network.create_floating_ip()
  45. ip_id = ip.id
  46. with helpers.cleanup_action(lambda: ip.delete()):
  47. ipl = self.provider.network.floating_ips()
  48. self.assertTrue(
  49. ip in ipl,
  50. "Floating IP address {0} should exist in the list {1}"
  51. .format(ip.id, ipl))
  52. # 2016-08: address filtering not implemented in moto
  53. # empty_ipl = self.provider.network.floating_ips('dummy-net')
  54. # self.assertFalse(
  55. # empty_ipl,
  56. # "Bogus network should not have any floating IPs: {0}"
  57. # .format(empty_ipl))
  58. self.assertIn(
  59. ip.public_ip, repr(ip),
  60. "repr(obj) should contain the address public IP value.")
  61. self.assertFalse(
  62. ip.private_ip,
  63. "Floating IP should not have a private IP value ({0})."
  64. .format(ip.private_ip))
  65. self.assertFalse(
  66. ip.in_use(),
  67. "Newly created floating IP address should not be in use.")
  68. ipl = self.provider.network.floating_ips()
  69. found_ip = [a for a in ipl if a.id == ip_id]
  70. self.assertTrue(
  71. len(found_ip) == 0,
  72. "Floating IP {0} should have been deleted but still exists."
  73. .format(ip_id))
  74. netl = self.provider.network.list()
  75. found_net = [n for n in netl if n.name == name]
  76. self.assertEqual(
  77. len(found_net), 0,
  78. "Network {0} should have been deleted but still exists."
  79. .format(name))
  80. @helpers.skipIfNoService(['network'])
  81. def test_crud_network(self):
  82. name = 'cbtestnetwork-{0}'.format(uuid.uuid4())
  83. subnet_name = 'cbtestsubnet-{0}'.format(uuid.uuid4())
  84. net = self.provider.network.create(name=name)
  85. with helpers.cleanup_action(
  86. lambda: net.delete()
  87. ):
  88. net.wait_till_ready()
  89. self.assertEqual(
  90. net.state, 'available',
  91. "Network in state '%s', yet should be 'available'" % net.state)
  92. sit.check_repr(self, net)
  93. self.assertIn(
  94. net.cidr_block, ['', '10.0.0.0/16'],
  95. "Network CIDR %s does not contain the expected value."
  96. % net.cidr_block)
  97. cidr = '10.0.1.0/24'
  98. sn = net.create_subnet(
  99. cidr_block=cidr, name=subnet_name,
  100. zone=helpers.get_provider_test_data(self.provider,
  101. 'placement'))
  102. with helpers.cleanup_action(lambda: sn.delete()):
  103. self.assertTrue(
  104. sn.id in [s.id for s in net.subnets()],
  105. "Subnet ID %s should be listed in network subnets %s."
  106. % (sn.id, net.subnets()))
  107. self.assertIn(
  108. net.id, sn.network_id,
  109. "Network ID %s should be specified in the subnet's network"
  110. " id %s." % (net.id, sn.network_id))
  111. self.assertEqual(
  112. cidr, sn.cidr_block,
  113. "Subnet's CIDR %s should match the specified one %s." % (
  114. sn.cidr_block, cidr))
  115. @helpers.skipIfNoService(['network.routers'])
  116. def test_crud_router(self):
  117. def _cleanup(net, subnet, router):
  118. with helpers.cleanup_action(lambda: net.delete()):
  119. with helpers.cleanup_action(lambda: subnet.delete()):
  120. with helpers.cleanup_action(lambda: router.delete()):
  121. router.remove_route(subnet.id)
  122. router.detach_network()
  123. name = 'cbtestrouter-{0}'.format(uuid.uuid4())
  124. # Declare these variables and late binding will allow
  125. # the cleanup method access to the most current values
  126. net = None
  127. sn = None
  128. router = None
  129. with helpers.cleanup_action(lambda: _cleanup(net, sn, router)):
  130. router = self.provider.network.create_router(name=name)
  131. net = self.provider.network.create(name=name)
  132. cidr = '10.0.1.0/24'
  133. sn = net.create_subnet(cidr_block=cidr, name=name,
  134. zone=helpers.get_provider_test_data(
  135. self.provider, 'placement'))
  136. # Check basic router properties
  137. self.assertIn(
  138. router, self.provider.network.routers(),
  139. "Router {0} should exist in the router list {1}.".format(
  140. router.id, self.provider.network.routers()))
  141. self.assertIn(
  142. router.id, repr(router),
  143. "repr(obj) should contain the object id so that the object"
  144. " can be reconstructed, but does not.")
  145. self.assertEqual(
  146. router.name, name,
  147. "Router {0} name should be {1}.".format(router.name, name))
  148. self.assertEqual(
  149. router.state, RouterState.DETACHED,
  150. "Router {0} state {1} should be {2}.".format(
  151. router.id, router.state, RouterState.DETACHED))
  152. self.assertFalse(
  153. router.network_id,
  154. "Router {0} should not be assoc. with a network {1}".format(
  155. router.id, router.network_id))
  156. # TODO: Cloud specific code, needs fixing
  157. # Check router connectivity
  158. # On OpenStack only one network is external and on AWS every
  159. # network is external, yet we need to use the one we've created?!
  160. if self.provider.PROVIDER_ID == 'openstack':
  161. for n in self.provider.network.list():
  162. if n.external:
  163. external_net = n
  164. break
  165. else:
  166. external_net = net
  167. router.attach_network(external_net.id)
  168. router.refresh()
  169. self.assertEqual(
  170. router.network_id, external_net.id,
  171. "Router should be attached to network {0}, not {1}".format(
  172. external_net.id, router.network_id))
  173. router.add_route(sn.id)
  174. # TODO: add a check for routes after that's been implemented
  175. routerl = self.provider.network.routers()
  176. found_router = [r for r in routerl if r.name == name]
  177. self.assertEqual(
  178. len(found_router), 0,
  179. "Router {0} should have been deleted but still exists."
  180. .format(name))