test_block_store_service.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import uuid
  2. from cloudbridge.cloud.interfaces import SnapshotState
  3. from cloudbridge.cloud.interfaces import VolumeState
  4. from test.helpers import ProviderTestBase
  5. import test.helpers as helpers
  6. class CloudBlockStoreServiceTestCase(ProviderTestBase):
  7. def __init__(self, methodName, provider):
  8. super(CloudBlockStoreServiceTestCase, self).__init__(
  9. methodName=methodName, provider=provider)
  10. def test_crud_volume(self):
  11. """
  12. Create a new volume, check whether the expected values are set,
  13. and delete it
  14. """
  15. name = "CBUnitTestCreateVol-{0}".format(uuid.uuid4())
  16. test_vol = self.provider.block_store.volumes.create(
  17. name,
  18. 1,
  19. helpers.get_provider_test_data(self.provider, "placement"))
  20. def cleanup_vol(vol):
  21. vol.delete()
  22. vol.wait_for(
  23. [VolumeState.DELETED, VolumeState.UNKNOWN],
  24. terminal_states=[VolumeState.ERROR],
  25. interval=self.get_test_wait_interval())
  26. with helpers.cleanup_action(lambda: cleanup_vol(test_vol)):
  27. test_vol.wait_till_ready(interval=self.get_test_wait_interval())
  28. self.assertTrue(
  29. test_vol.id in repr(test_vol),
  30. "repr(obj) should contain the object id so that the object"
  31. " can be reconstructed, but does not. eval(repr(obj)) == obj")
  32. volumes = self.provider.block_store.volumes.list()
  33. list_volumes = [vol for vol in volumes if vol.name == name]
  34. self.assertTrue(
  35. len(list_volumes) == 1,
  36. "List volumes does not return the expected volume %s" %
  37. name)
  38. # check iteration
  39. iter_volumes = [vol for vol in self.provider.block_store.volumes
  40. if vol.name == name]
  41. self.assertTrue(
  42. len(iter_volumes) == 1,
  43. "Iter volumes does not return the expected volume %s" %
  44. name)
  45. # check find
  46. find_volumes = self.provider.block_store.volumes.find(name=name)
  47. self.assertTrue(
  48. len(find_volumes) == 1,
  49. "Find volumes does not return the expected volume %s" %
  50. name)
  51. get_vol = self.provider.block_store.volumes.get(
  52. test_vol.id)
  53. self.assertTrue(
  54. list_volumes[0] ==
  55. get_vol == test_vol,
  56. "Ids returned by list: {0} and get: {1} are not as "
  57. " expected: {2}" .format(list_volumes[0].id,
  58. get_vol.id,
  59. test_vol.id))
  60. self.assertTrue(
  61. list_volumes[0].name ==
  62. get_vol.name == test_vol.name,
  63. "Names returned by list: {0} and get: {1} are not as "
  64. " expected: {2}" .format(list_volumes[0].name,
  65. get_vol.name,
  66. test_vol.name))
  67. volumes = self.provider.block_store.volumes.list()
  68. found_volumes = [vol for vol in volumes if vol.name == name]
  69. self.assertTrue(
  70. len(found_volumes) == 0,
  71. "Volume %s should have been deleted but still exists." %
  72. name)
  73. def test_attach_detach_volume(self):
  74. """
  75. Create a new volume, and attempt to attach it to an instance
  76. """
  77. instance_name = "CBVolOps-{0}-{1}".format(
  78. self.provider.name,
  79. uuid.uuid4())
  80. test_instance = helpers.get_test_instance(self.provider, instance_name)
  81. with helpers.cleanup_action(lambda: test_instance.terminate()):
  82. name = "CBUnitTestAttachVol-{0}".format(uuid.uuid4())
  83. test_vol = self.provider.block_store.volumes.create(
  84. name, 1, test_instance.placement_zone)
  85. with helpers.cleanup_action(lambda: test_vol.delete()):
  86. test_vol.wait_till_ready(
  87. interval=self.get_test_wait_interval())
  88. test_vol.attach(test_instance, '/dev/sda2')
  89. test_vol.wait_for(
  90. [VolumeState.IN_USE],
  91. terminal_states=[VolumeState.ERROR, VolumeState.DELETED],
  92. interval=self.get_test_wait_interval())
  93. test_vol.detach()
  94. test_vol.wait_for(
  95. [VolumeState.AVAILABLE],
  96. terminal_states=[VolumeState.ERROR, VolumeState.DELETED],
  97. interval=self.get_test_wait_interval())
  98. def test_crud_snapshot(self):
  99. """
  100. Create a new volume, create a snapshot of the volume, and check
  101. whether list_snapshots properly detects the new snapshot.
  102. Delete everything afterwards.
  103. """
  104. name = "CBUnitTestCreateSnap-{0}".format(uuid.uuid4())
  105. test_vol = self.provider.block_store.volumes.create(
  106. name,
  107. 1,
  108. helpers.get_provider_test_data(self.provider, "placement"))
  109. with helpers.cleanup_action(lambda: test_vol.delete()):
  110. test_vol.wait_till_ready(interval=self.get_test_wait_interval())
  111. snap_name = "CBSnapshot-{0}".format(name)
  112. test_snap = test_vol.create_snapshot(name=snap_name,
  113. description=snap_name)
  114. def cleanup_snap(snap):
  115. snap.delete()
  116. snap.wait_for(
  117. [SnapshotState.UNKNOWN],
  118. terminal_states=[SnapshotState.ERROR],
  119. interval=self.get_test_wait_interval())
  120. with helpers.cleanup_action(lambda: cleanup_snap(test_snap)):
  121. test_snap.wait_till_ready(
  122. interval=self.get_test_wait_interval())
  123. self.assertTrue(
  124. test_snap.id in repr(test_snap),
  125. "repr(obj) should contain the object id so that the object"
  126. " can be reconstructed, but does not.")
  127. snaps = self.provider.block_store.snapshots.list()
  128. list_snaps = [snap for snap in snaps
  129. if snap.name == snap_name]
  130. self.assertTrue(
  131. len(list_snaps) == 1,
  132. "List snapshots does not return the expected volume %s" %
  133. name)
  134. # check iteration
  135. iter_snaps = [
  136. snap for snap in self.provider.block_store.snapshots
  137. if snap.name == snap_name]
  138. self.assertTrue(
  139. len(iter_snaps) == 1,
  140. "Iter snapshots does not return the expected volume %s" %
  141. name)
  142. # check find
  143. find_snap = self.provider.block_store.snapshots.find(name=name)
  144. self.assertTrue(
  145. len(find_snap) == 1,
  146. "Find snaps does not return the expected volume %s" %
  147. name)
  148. get_snap = self.provider.block_store.snapshots.get(
  149. test_snap.id)
  150. self.assertTrue(
  151. list_snaps[0] ==
  152. get_snap == test_snap,
  153. "Ids returned by list: {0} and get: {1} are not as "
  154. " expected: {2}" .format(list_snaps[0].id,
  155. get_snap.id,
  156. test_snap.id))
  157. self.assertTrue(
  158. list_snaps[0].name ==
  159. get_snap.name == test_snap.name,
  160. "Names returned by list: {0} and get: {1} are not as "
  161. " expected: {2}" .format(list_snaps[0].name,
  162. get_snap.name,
  163. test_snap.name))
  164. snaps = self.provider.block_store.snapshots.list()
  165. found_snaps = [snap for snap in snaps
  166. if snap.name == snap_name]
  167. self.assertTrue(
  168. len(found_snaps) == 0,
  169. "Snapshot %s should have been deleted but still exists." %
  170. snap_name)