test_network_service.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. from cloudbridge.base import helpers as cb_helpers
  2. from cloudbridge.base.resources import BaseNetwork
  3. from cloudbridge.interfaces.resources import (FloatingIP, Network,
  4. NetworkState, RouterState,
  5. Subnet, SubnetState)
  6. import tests.helpers as helpers
  7. from tests.helpers import ProviderTestBase
  8. from tests.helpers import standard_interface_tests as sit
  9. class CloudNetworkServiceTestCase(ProviderTestBase):
  10. _multiprocess_can_split_ = True
  11. @helpers.skipIfNoService(['networking.subnets',
  12. 'networking.networks',
  13. 'networking.routers'])
  14. def test_storage_services_event_pattern(self):
  15. # pylint:disable=protected-access
  16. self.assertEqual(
  17. self.provider.networking.networks._service_event_pattern,
  18. "provider.networking.networks",
  19. "Event pattern for {} service should be '{}', "
  20. "but found '{}'.".format("networks",
  21. "provider.networking.networks",
  22. self.provider.networking.networks.
  23. _service_event_pattern))
  24. # pylint:disable=protected-access
  25. self.assertEqual(
  26. self.provider.networking.subnets._service_event_pattern,
  27. "provider.networking.subnets",
  28. "Event pattern for {} service should be '{}', "
  29. "but found '{}'.".format("subnets",
  30. "provider.networking.subnets",
  31. self.provider.networking.subnets.
  32. _service_event_pattern))
  33. # pylint:disable=protected-access
  34. self.assertEqual(
  35. self.provider.networking.routers._service_event_pattern,
  36. "provider.networking.routers",
  37. "Event pattern for {} service should be '{}', "
  38. "but found '{}'.".format("routers",
  39. "provider.networking.routers",
  40. self.provider.networking.routers.
  41. _service_event_pattern))
  42. @helpers.skipIfNoService(['networking.networks'])
  43. def test_crud_network(self):
  44. def create_net(label):
  45. return self.provider.networking.networks.create(
  46. label=label, cidr_block=BaseNetwork.CB_DEFAULT_IPV4RANGE)
  47. def cleanup_net(net):
  48. if net:
  49. net.delete()
  50. net.wait_for([NetworkState.UNKNOWN],
  51. terminal_states=[NetworkState.ERROR])
  52. self.assertTrue(
  53. net.state == NetworkState.UNKNOWN,
  54. "Network.state must be unknown after "
  55. "a delete but got %s"
  56. % net.state)
  57. sit.check_crud(self, self.provider.networking.networks, Network,
  58. "cb-crudnetwork", create_net, cleanup_net)
  59. @helpers.skipIfNoService(['networking.networks'])
  60. def test_network_properties(self):
  61. label = 'cb-propnetwork-{0}'.format(helpers.get_uuid())
  62. subnet_label = 'cb-propsubnet-{0}'.format(helpers.get_uuid())
  63. net = self.provider.networking.networks.create(
  64. label=label, cidr_block=BaseNetwork.CB_DEFAULT_IPV4RANGE)
  65. with cb_helpers.cleanup_action(lambda: helpers.cleanup_network(net)):
  66. net.wait_till_ready()
  67. self.assertEqual(
  68. net.state, 'available',
  69. "Network in state '%s', yet should be 'available'" % net.state)
  70. sit.check_repr(self, net)
  71. self.assertIn(
  72. net.cidr_block, ['', BaseNetwork.CB_DEFAULT_IPV4RANGE],
  73. "Network CIDR %s does not contain the expected value %s."
  74. % (net.cidr_block, BaseNetwork.CB_DEFAULT_IPV4RANGE))
  75. cidr = '10.0.20.0/24'
  76. sn = net.subnets.create(
  77. label=subnet_label, cidr_block=cidr)
  78. with cb_helpers.cleanup_action(lambda: helpers.cleanup_subnet(sn)):
  79. self.assertTrue(
  80. sn in net.subnets,
  81. "Subnet ID %s should be listed in network subnets %s."
  82. % (sn.id, net.subnets))
  83. self.assertTrue(
  84. sn in self.provider.networking.subnets.list(network=net),
  85. "Subnet ID %s should be included in the subnets list %s."
  86. % (sn.id, self.provider.networking.subnets.list(net))
  87. )
  88. self.assertListEqual(
  89. list(net.subnets), [sn],
  90. "Network should have exactly one subnet: %s." % sn.id)
  91. self.assertEqual(
  92. net.id, sn.network_id,
  93. "Network ID %s and subnet's network id %s should be"
  94. " equal." % (net.id, sn.network_id))
  95. self.assertEqual(
  96. net, sn.network,
  97. "Network obj %s and subnet's parent net obj %s"
  98. " should be equal." % (net, sn.network))
  99. self.assertEqual(
  100. cidr, sn.cidr_block,
  101. "Should be exact cidr block that was requested")
  102. self.assertTrue(
  103. BaseNetwork.cidr_blocks_overlap(cidr, sn.cidr_block),
  104. "Subnet's CIDR %s should overlap the specified one %s." % (
  105. sn.cidr_block, cidr))
  106. def test_crud_subnet(self):
  107. # Late binding will make sure that create_subnet gets the
  108. # correct value
  109. net = self.provider.networking.networks.create(
  110. label="cb-crudsubnet",
  111. cidr_block=BaseNetwork.CB_DEFAULT_IPV4RANGE)
  112. def create_subnet(label):
  113. return self.provider.networking.subnets.create(
  114. label=label, network=net, cidr_block="10.0.10.0/24")
  115. def cleanup_subnet(subnet):
  116. if subnet:
  117. net = subnet.network
  118. subnet.delete()
  119. subnet.wait_for([SubnetState.UNKNOWN],
  120. terminal_states=[SubnetState.ERROR])
  121. self.assertTrue(
  122. subnet.state == SubnetState.UNKNOWN,
  123. "Subnet.state must be unknown after "
  124. "a delete but got %s"
  125. % subnet.state)
  126. net.delete()
  127. net.wait_for([NetworkState.UNKNOWN],
  128. terminal_states=[NetworkState.ERROR])
  129. self.assertTrue(
  130. net.state == NetworkState.UNKNOWN,
  131. "Network.state must be unknown after "
  132. "a delete but got %s"
  133. % net.state)
  134. sit.check_crud(self, self.provider.networking.subnets, Subnet,
  135. "cb-crudsubnet", create_subnet, cleanup_subnet)
  136. def test_crud_floating_ip(self):
  137. gw = helpers.get_test_gateway(
  138. self.provider)
  139. def create_fip(label):
  140. fip = gw.floating_ips.create()
  141. return fip
  142. def cleanup_fip(fip):
  143. if fip:
  144. gw.floating_ips.delete(fip.id)
  145. with cb_helpers.cleanup_action(
  146. lambda: helpers.cleanup_gateway(gw)):
  147. sit.check_crud(self, gw.floating_ips, FloatingIP,
  148. "cb-crudfip", create_fip, cleanup_fip,
  149. skip_name_check=True)
  150. def test_floating_ip_properties(self):
  151. # Check floating IP address
  152. gw = helpers.get_test_gateway(
  153. self.provider)
  154. fip = gw.floating_ips.create()
  155. with cb_helpers.cleanup_action(
  156. lambda: helpers.cleanup_gateway(gw)):
  157. with cb_helpers.cleanup_action(lambda: fip.delete()):
  158. fipl = list(gw.floating_ips)
  159. self.assertIn(fip, fipl)
  160. # 2016-08: address filtering not implemented in moto
  161. # empty_ipl = self.provider.network.floating_ips('dummy-net')
  162. # self.assertFalse(
  163. # empty_ipl,
  164. # "Bogus network should not have any floating IPs: {0}"
  165. # .format(empty_ipl))
  166. self.assertFalse(
  167. fip.private_ip,
  168. "Floating IP should not have a private IP value ({0})."
  169. .format(fip.private_ip))
  170. self.assertFalse(
  171. fip.in_use,
  172. "Newly created floating IP address should not be in use.")
  173. @helpers.skipIfNoService(['networking.routers'])
  174. def test_crud_router(self):
  175. def _cleanup(net, subnet, router, gateway):
  176. with cb_helpers.cleanup_action(
  177. lambda: helpers.cleanup_network(net)):
  178. with cb_helpers.cleanup_action(
  179. lambda: helpers.cleanup_subnet(subnet)):
  180. with cb_helpers.cleanup_action(
  181. lambda: router.delete()):
  182. with cb_helpers.cleanup_action(
  183. lambda: helpers.cleanup_gateway(gateway)):
  184. router.detach_subnet(subnet)
  185. router.detach_gateway(gateway)
  186. label = 'cb-crudrouter-{0}'.format(helpers.get_uuid())
  187. # Declare these variables and late binding will allow
  188. # the cleanup method access to the most current values
  189. net = None
  190. sn = None
  191. router = None
  192. gteway = None
  193. with cb_helpers.cleanup_action(
  194. lambda: _cleanup(net, sn, router, gteway)):
  195. net = self.provider.networking.networks.create(
  196. label=label, cidr_block=BaseNetwork.CB_DEFAULT_IPV4RANGE)
  197. router = self.provider.networking.routers.create(label=label,
  198. network=net)
  199. cidr = '10.0.15.0/24'
  200. sn = net.subnets.create(label=label, cidr_block=cidr)
  201. # Check basic router properties
  202. sit.check_standard_behaviour(
  203. self, self.provider.networking.routers, router)
  204. if (self.provider.PROVIDER_ID != 'gcp'):
  205. if (self.provider.PROVIDER_ID != 'mock'):
  206. self.assertEqual(
  207. router.state, RouterState.DETACHED,
  208. "Router {0} state {1} should be {2}.".format(
  209. router.id, router.state, RouterState.DETACHED))
  210. # self.assertEqual(
  211. # router.network_id, net.id, "Router {0} should be assoc."
  212. # " with network {1}, but is associated with {2}"
  213. # .format(router.id, net.id, router.network_id))
  214. self.assertTrue(
  215. len(router.subnets) == 0,
  216. "No subnet should be attached to router {0} but subnet {1}"
  217. " is currently attached to it.".format(router, sn)
  218. )
  219. router.attach_subnet(sn)
  220. self.assertTrue(
  221. len(router.subnets) == 1,
  222. "Subnet {0} not attached to router {1}".format(sn, router)
  223. )
  224. gteway = net.gateways.get_or_create()
  225. router.attach_gateway(gteway)
  226. # TODO: add a check for routes after that's been implemented
  227. sit.check_delete(self, self.provider.networking.routers, router)
  228. # Also make sure that linked resources were properly cleaned up
  229. sit.check_delete(self, self.provider.networking.subnets, sn)
  230. sit.check_delete(self, self.provider.networking.networks, net)
  231. @helpers.skipIfNoService(['networking.networks'])
  232. def test_default_network(self):
  233. subnet = self.provider.networking.subnets.get_or_create_default()
  234. self.assertIsInstance(subnet, Subnet)