test_network_service.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. from cloudbridge.cloud.interfaces.resources import FloatingIP
  2. from cloudbridge.cloud.interfaces.resources import Network
  3. from cloudbridge.cloud.interfaces.resources import NetworkState
  4. from cloudbridge.cloud.interfaces.resources import RouterState
  5. from cloudbridge.cloud.interfaces.resources import Subnet
  6. from cloudbridge.cloud.interfaces.resources import SubnetState
  7. import test.helpers as helpers
  8. from test.helpers import ProviderTestBase
  9. from test.helpers import get_provider_test_data
  10. from test.helpers import standard_interface_tests as sit
  11. class CloudNetworkServiceTestCase(ProviderTestBase):
  12. _multiprocess_can_split_ = True
  13. @helpers.skipIfNoService(['networking.networks'])
  14. def test_crud_network(self):
  15. def create_net(label):
  16. return self.provider.networking.networks.create(
  17. label=label, cidr_block='10.0.0.0/16')
  18. def cleanup_net(net):
  19. if net:
  20. net.delete()
  21. net.refresh()
  22. self.assertTrue(
  23. net.state == NetworkState.UNKNOWN,
  24. "Network.state must be unknown when refreshing after "
  25. "a delete but got %s"
  26. % net.state)
  27. sit.check_crud(self, self.provider.networking.networks, Network,
  28. "cb-crudnetwork", create_net, cleanup_net)
  29. @helpers.skipIfNoService(['networking.networks'])
  30. def test_network_properties(self):
  31. label = 'cb-propnetwork-{0}'.format(helpers.get_uuid())
  32. subnet_label = 'cb-propsubnet-{0}'.format(helpers.get_uuid())
  33. net = self.provider.networking.networks.create(
  34. label=label, cidr_block='10.0.0.0/16')
  35. with helpers.cleanup_action(
  36. lambda: net.delete()
  37. ):
  38. net.wait_till_ready()
  39. self.assertEqual(
  40. net.state, 'available',
  41. "Network in state '%s', yet should be 'available'" % net.state)
  42. sit.check_repr(self, net)
  43. self.assertIn(
  44. net.cidr_block, ['', '10.0.0.0/16'],
  45. "Network CIDR %s does not contain the expected value."
  46. % net.cidr_block)
  47. cidr = '10.0.20.0/24'
  48. sn = net.create_subnet(
  49. label=subnet_label, cidr_block=cidr,
  50. zone=helpers.get_provider_test_data(self.provider,
  51. 'placement'))
  52. with helpers.cleanup_action(lambda: sn.delete()):
  53. self.assertTrue(
  54. sn in net.subnets,
  55. "Subnet ID %s should be listed in network subnets %s."
  56. % (sn.id, net.subnets))
  57. self.assertTrue(
  58. sn in self.provider.networking.subnets.list(network=net),
  59. "Subnet ID %s should be included in the subnets list %s."
  60. % (sn.id, self.provider.networking.subnets.list(net))
  61. )
  62. self.assertListEqual(
  63. net.subnets, [sn],
  64. "Network should have exactly one subnet: %s." % sn.id)
  65. self.assertEqual(
  66. net.id, sn.network_id,
  67. "Network ID %s and subnet's network id %s should be"
  68. " equal." % (net.id, sn.network_id))
  69. self.assertEqual(
  70. net, sn.network,
  71. "Network obj %s and subnet's parent net obj %s"
  72. " should be equal." % (net, sn.network))
  73. self.assertEqual(
  74. cidr, sn.cidr_block,
  75. "Subnet's CIDR %s should match the specified one %s." % (
  76. sn.cidr_block, cidr))
  77. def test_crud_subnet(self):
  78. # Late binding will make sure that create_subnet gets the
  79. # correct value
  80. sn = helpers.get_or_create_default_subnet(self.provider)
  81. net = sn.network
  82. def create_subnet(label):
  83. return self.provider.networking.subnets.create(
  84. label=label, network=net, cidr_block="10.0.10.0/24",
  85. zone=helpers.get_provider_test_data(
  86. self.provider, 'placement'))
  87. def cleanup_subnet(subnet):
  88. if subnet:
  89. subnet.delete()
  90. subnet.refresh()
  91. self.assertTrue(
  92. subnet.state == SubnetState.UNKNOWN,
  93. "Subnet.state must be unknown when refreshing after "
  94. "a delete but got %s"
  95. % subnet.state)
  96. sit.check_crud(self, self.provider.networking.subnets, Subnet,
  97. "cb-crudsubnet", create_subnet, cleanup_subnet)
  98. def test_crud_floating_ip(self):
  99. gw = helpers.get_test_gateway(
  100. self.provider)
  101. def create_fip(label):
  102. fip = gw.floating_ips.create()
  103. return fip
  104. def cleanup_fip(fip):
  105. if fip:
  106. gw.floating_ips.delete(fip.id)
  107. with helpers.cleanup_action(
  108. lambda: helpers.delete_test_gateway(gw)):
  109. sit.check_crud(self, gw.floating_ips, FloatingIP,
  110. "cb-crudfip", create_fip, cleanup_fip,
  111. skip_name_check=True)
  112. def test_floating_ip_properties(self):
  113. # Check floating IP address
  114. gw = helpers.get_test_gateway(
  115. self.provider)
  116. fip = gw.floating_ips.create()
  117. with helpers.cleanup_action(
  118. lambda: helpers.delete_test_gateway(gw)):
  119. with helpers.cleanup_action(lambda: fip.delete()):
  120. fipl = list(gw.floating_ips)
  121. self.assertIn(fip, fipl)
  122. # 2016-08: address filtering not implemented in moto
  123. # empty_ipl = self.provider.network.floating_ips('dummy-net')
  124. # self.assertFalse(
  125. # empty_ipl,
  126. # "Bogus network should not have any floating IPs: {0}"
  127. # .format(empty_ipl))
  128. self.assertFalse(
  129. fip.private_ip,
  130. "Floating IP should not have a private IP value ({0})."
  131. .format(fip.private_ip))
  132. self.assertFalse(
  133. fip.in_use,
  134. "Newly created floating IP address should not be in use.")
  135. @helpers.skipIfNoService(['networking.routers'])
  136. def test_crud_router(self):
  137. def _cleanup(net, subnet, router, gateway):
  138. with helpers.cleanup_action(lambda: net.delete()):
  139. with helpers.cleanup_action(lambda: router.delete()):
  140. with helpers.cleanup_action(lambda: subnet.delete()):
  141. with helpers.cleanup_action(lambda: gateway.delete()):
  142. router.detach_subnet(subnet)
  143. router.detach_gateway(gateway)
  144. label = 'cb-crudrouter-{0}'.format(helpers.get_uuid())
  145. # Declare these variables and late binding will allow
  146. # the cleanup method access to the most current values
  147. net = None
  148. sn = None
  149. router = None
  150. gteway = None
  151. with helpers.cleanup_action(lambda: _cleanup(net, sn, router, gteway)):
  152. net = self.provider.networking.networks.create(
  153. label=label, cidr_block='10.0.0.0/16')
  154. router = self.provider.networking.routers.create(label=label,
  155. network=net)
  156. cidr = '10.0.15.0/24'
  157. sn = net.create_subnet(label=label, cidr_block=cidr,
  158. zone=helpers.get_provider_test_data(
  159. self.provider, 'placement'))
  160. # Check basic router properties
  161. sit.check_standard_behaviour(
  162. self, self.provider.networking.routers, router)
  163. self.assertEqual(
  164. router.state, RouterState.DETACHED,
  165. "Router {0} state {1} should be {2}.".format(
  166. router.id, router.state, RouterState.DETACHED))
  167. # self.assertFalse(
  168. # router.network_id,
  169. # "Router {0} should not be assoc. with a network {1}".format(
  170. # router.id, router.network_id))
  171. self.assertTrue(
  172. len(router.subnets) == 0,
  173. "No subnet should be attached to router {1}".format(sn, router)
  174. )
  175. router.attach_subnet(sn)
  176. self.assertTrue(
  177. len(router.subnets) == 1,
  178. "Subnet {0} not attached to router {1}".format(sn, router)
  179. )
  180. gteway = net.gateways.get_or_create_inet_gateway()
  181. router.attach_gateway(gteway)
  182. # TODO: add a check for routes after that's been implemented
  183. sit.check_delete(self, self.provider.networking.routers, router)
  184. @helpers.skipIfNoService(['networking.networks'])
  185. def test_default_network(self):
  186. subnet = self.provider.networking.subnets.get_or_create_default(
  187. zone=get_provider_test_data(self.provider, 'placement'))
  188. self.assertIsInstance(subnet, Subnet)