test_network_service.py 11 KB

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