test_network_service.py 8.2 KB

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