PageRenderTime 23ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/rackspace/models/compute_v2/server_tests.rb

https://gitlab.com/debian-ruby/ruby-fog-rackspace
Ruby | 274 lines | 233 code | 41 blank | 0 comment | 9 complexity | 8b166ac53fa16f4ea163da5132d5bca9 MD5 | raw file
  1. Shindo.tests('Fog::Compute::RackspaceV2 | server', ['rackspace']) do
  2. service = Fog::Compute::RackspaceV2.new
  3. cbs_service = Fog::Rackspace::BlockStorage.new
  4. tests('setup test network').succeeds do
  5. @network = service.networks.create :label => "fog_test_net_#{Time.now.to_i.to_s}", :cidr => '192.168.1.0/24'
  6. end
  7. options = {
  8. :name => "fog_server_#{Time.now.to_i.to_s}",
  9. :flavor_id => rackspace_test_flavor_id(service),
  10. :image_id => rackspace_test_image_id(service),
  11. :metadata => { 'fog_test' => 'true' },
  12. :networks => [@network.id]
  13. }
  14. tests('ready?') do
  15. @server = Fog::Compute::RackspaceV2::Server.new
  16. tests('default in ready state').returns(true) do
  17. @server.state = Fog::Compute::RackspaceV2::Server::ACTIVE
  18. @server.ready?
  19. end
  20. tests('custom ready state').returns(true) do
  21. @server.state = Fog::Compute::RackspaceV2::Server::VERIFY_RESIZE
  22. @server.ready?(Fog::Compute::RackspaceV2::Server::VERIFY_RESIZE)
  23. end
  24. tests('default NOT in ready state').returns(false) do
  25. @server.state = Fog::Compute::RackspaceV2::Server::REBOOT
  26. @server.ready?
  27. end
  28. tests('custom NOT ready state').returns(false) do
  29. @server.state = Fog::Compute::RackspaceV2::Server::REBOOT
  30. @server.ready?(Fog::Compute::RackspaceV2::Server::VERIFY_RESIZE)
  31. end
  32. tests('default error state').returns(true) do
  33. @server.state = Fog::Compute::RackspaceV2::Server::ERROR
  34. exception_occurred = false
  35. begin
  36. @server.ready?
  37. rescue Fog::Compute::RackspaceV2::InvalidServerStateException => e
  38. exception_occurred = true
  39. returns(true) {e.desired_state == Fog::Compute::RackspaceV2::Server::ACTIVE }
  40. returns(true) {e.current_state == Fog::Compute::RackspaceV2::Server::ERROR }
  41. end
  42. exception_occurred
  43. end
  44. tests('custom error state').returns(true) do
  45. @server.state = Fog::Compute::RackspaceV2::Server::ACTIVE
  46. exception_occurred = false
  47. begin
  48. @server.ready?(Fog::Compute::RackspaceV2::Server::VERIFY_RESIZE, Fog::Compute::RackspaceV2::Server::ACTIVE)
  49. rescue Fog::Compute::RackspaceV2::InvalidServerStateException => e
  50. exception_occurred = true
  51. returns(true) {e.desired_state == Fog::Compute::RackspaceV2::Server::VERIFY_RESIZE }
  52. returns(true) {e.current_state == Fog::Compute::RackspaceV2::Server::ACTIVE }
  53. end
  54. exception_occurred
  55. end
  56. end
  57. model_tests(service.servers, options, true) do
  58. @instance.wait_for { ready? }
  59. tests('#metadata[\'fog_test\']').returns('true') do
  60. @instance.metadata['fog_test']
  61. end
  62. tests("includes #{@network.label}").returns(true) do
  63. @instance.addresses.keys.include?(@network.label)
  64. end
  65. tests('#create').succeeds do
  66. pending unless Fog.mocking?
  67. original_options = Marshal.load(Marshal.dump(options))
  68. @instance.create(options)
  69. returns(true) { original_options == options }
  70. end
  71. tests('#update').succeeds do
  72. new_name = "fog_server_update#{Time.now.to_i.to_s}"
  73. @instance.name = new_name
  74. @instance.access_ipv4_address= "10.10.0.1"
  75. @instance.access_ipv6_address= "::1"
  76. @instance.save
  77. sleep 60 unless Fog.mocking?
  78. @instance.reload
  79. returns("10.10.0.1") { @instance.access_ipv4_address }
  80. returns("::1") { @instance.access_ipv6_address }
  81. returns(new_name) { @instance.name }
  82. end
  83. tests('#reboot("SOFT")').succeeds do
  84. @instance.reboot('SOFT')
  85. returns('REBOOT') { @instance.state }
  86. end
  87. @instance.wait_for { ready? }
  88. tests('#reboot("HARD")').succeeds do
  89. @instance.reboot('HARD')
  90. returns('HARD_REBOOT') { @instance.state }
  91. end
  92. sleep 30 unless Fog.mocking?
  93. @instance.wait_for { ready? }
  94. sleep 60 unless Fog.mocking?
  95. tests('#rebuild').succeeds do
  96. @instance.rebuild rackspace_test_image_id(service)
  97. returns('REBUILD') { @instance.state }
  98. end
  99. sleep 30 unless Fog.mocking?
  100. @instance.wait_for { ready? }
  101. sleep 60 unless Fog.mocking?
  102. tests('#resize').succeeds do
  103. @instance.resize(3)
  104. returns('RESIZE') { @instance.state }
  105. end
  106. sleep 30 unless Fog.mocking?
  107. @instance.wait_for { ready?('VERIFY_RESIZE', ['ACTIVE', 'ERROR']) }
  108. sleep 60 unless Fog.mocking?
  109. tests('#confirm_resize').succeeds do
  110. @instance.confirm_resize
  111. end
  112. sleep 30 unless Fog.mocking?
  113. @instance.wait_for { ready? }
  114. sleep 60 unless Fog.mocking?
  115. tests('#resize').succeeds do
  116. @instance.resize(2)
  117. returns('RESIZE') { @instance.state }
  118. end
  119. @instance.wait_for { ready?('VERIFY_RESIZE') }
  120. sleep 60 unless Fog.mocking?
  121. tests('#revert_resize').succeeds do
  122. @instance.revert_resize
  123. end
  124. @instance.wait_for { ready? }
  125. tests('#rescue').succeeds do
  126. @instance.rescue
  127. end
  128. @instance.wait_for { ready?('RESCUE') }
  129. tests('#unrescue').succeeds do
  130. @instance.unrescue
  131. end
  132. @instance.wait_for { ready? }
  133. tests('#change_admin_password').succeeds do
  134. @instance.change_admin_password('somerandompassword')
  135. returns('PASSWORD') { @instance.state }
  136. returns('somerandompassword') { @instance.password }
  137. end
  138. @instance.wait_for { ready? }
  139. @test_image = nil
  140. begin
  141. tests('#create_image').succeeds do
  142. @test_image = @instance.create_image('fog-test-image')
  143. @test_image.reload
  144. returns('SAVING') { @test_image.state }
  145. end
  146. ensure
  147. @test_image.destroy unless @test_image.nil? || Fog.mocking?
  148. end
  149. tests('attachments') do
  150. begin
  151. @volume = cbs_service.volumes.create(:size => 100, :display_name => "fog-#{Time.now.to_i.to_s}")
  152. @volume.wait_for { ready? }
  153. tests('#attach_volume').succeeds do
  154. @instance.attach_volume(@volume)
  155. end
  156. tests('#attachments').returns(true) do
  157. @instance.wait_for do
  158. !attachments.empty?
  159. end
  160. @instance.attachments.any? {|a| a.volume_id == @volume.id }
  161. end
  162. ensure
  163. @volume.wait_for { !attachments.empty? }
  164. @instance.attachments.each {|a| a.detach }
  165. @volume.wait_for { ready? && attachments.empty? }
  166. @volume.destroy if @volume
  167. end
  168. end
  169. @instance.wait_for { ready? }
  170. end
  171. tests('#setup') do
  172. ATTRIBUTES = {
  173. :name => "foo",
  174. :image_id => 42,
  175. :flavor_id => 42
  176. }
  177. create_server = lambda { |attributes|
  178. service = Fog::Compute::RackspaceV2.new
  179. attributes.merge!(:service => service)
  180. Fog::SSH::Mock.data.clear
  181. server = Fog::Compute::RackspaceV2::Server.new(attributes)
  182. server.save(attributes)
  183. @address = 123
  184. server.ipv4_address = @address
  185. server.identity = "bar"
  186. server.public_key = "baz"
  187. server.setup
  188. server
  189. }
  190. commands = lambda {
  191. Fog::SSH::Mock.data[@address].first[:commands]
  192. }
  193. test("lock user when requested") do
  194. create_server.call(ATTRIBUTES.merge(:passwd_lock => true))
  195. commands.call.one? { |c| c =~ /passwd\s+-l\s+root/ }
  196. end
  197. test("provide a password when the passed isn't locked") do
  198. pwd = create_server.call(
  199. ATTRIBUTES.merge(:passwd_lock => false)
  200. ).password
  201. # shindo expects a boolean not truthyness :-(
  202. !!pwd
  203. end
  204. test("leaves user unlocked by default") do
  205. create_server.call(ATTRIBUTES)
  206. commands.call.none? { |c| c =~ /passwd\s+-l\s+root/ }
  207. end
  208. test("nils password when password is locked") do
  209. pwd = create_server.call(ATTRIBUTES.merge(:passwd_lock => true)).password
  210. pwd.nil?
  211. end
  212. end
  213. #When after testing resize/resize_confirm we get a 409 when we try to resize_revert so I am going to split it into two blocks
  214. model_tests(service.servers, options, true) do
  215. @instance.wait_for { ready? }
  216. tests('#resize').succeeds do
  217. @instance.resize(4)
  218. returns('RESIZE') { @instance.state }
  219. end
  220. @instance.wait_for { ready?('VERIFY_RESIZE') }
  221. sleep 60 unless Fog.mocking?
  222. tests('#revert_resize').succeeds do
  223. @instance.revert_resize
  224. end
  225. @instance.wait_for { ready? }
  226. end
  227. wait_for_server_deletion(@instance)
  228. delete_test_network(@network)
  229. end