PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/nova/tests/baremetal/test_driver.py

https://github.com/comstud/nova
Python | 329 lines | 246 code | 63 blank | 20 comment | 5 complexity | dd8ce67adb06e922260a078af9ade47f MD5 | raw file
  1. # vim: tabstop=4 shiftwidth=4 softtabstop=4
  2. # coding=utf-8
  3. # Copyright 2012 Hewlett-Packard Development Company, L.P.
  4. # Copyright (c) 2012 NTT DOCOMO, INC.
  5. # Copyright (c) 2011 University of Southern California / ISI
  6. # All Rights Reserved.
  7. #
  8. # Licensed under the Apache License, Version 2.0 (the "License"); you may
  9. # not use this file except in compliance with the License. You may obtain
  10. # a copy of the License at
  11. #
  12. # http://www.apache.org/licenses/LICENSE-2.0
  13. #
  14. # Unless required by applicable law or agreed to in writing, software
  15. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  16. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  17. # License for the specific language governing permissions and limitations
  18. # under the License.
  19. """Tests for the base baremetal driver class."""
  20. from oslo.config import cfg
  21. from nova import exception
  22. from nova import test
  23. from nova.tests.baremetal.db import base as bm_db_base
  24. from nova.tests.baremetal.db import utils as bm_db_utils
  25. from nova.tests.image import fake as fake_image
  26. from nova.tests import utils
  27. from nova.virt.baremetal import baremetal_states
  28. from nova.virt.baremetal import db
  29. from nova.virt.baremetal import driver as bm_driver
  30. from nova.virt.baremetal import fake
  31. CONF = cfg.CONF
  32. COMMON_FLAGS = dict(
  33. firewall_driver='nova.virt.baremetal.fake.FakeFirewallDriver',
  34. host='test_host',
  35. )
  36. BAREMETAL_FLAGS = dict(
  37. driver='nova.virt.baremetal.fake.FakeDriver',
  38. instance_type_extra_specs=['cpu_arch:test', 'test_spec:test_value'],
  39. power_manager='nova.virt.baremetal.fake.FakePowerManager',
  40. vif_driver='nova.virt.baremetal.fake.FakeVifDriver',
  41. volume_driver='nova.virt.baremetal.fake.FakeVolumeDriver',
  42. group='baremetal',
  43. )
  44. class BareMetalDriverNoDBTestCase(test.TestCase):
  45. def setUp(self):
  46. super(BareMetalDriverNoDBTestCase, self).setUp()
  47. self.flags(**COMMON_FLAGS)
  48. self.flags(**BAREMETAL_FLAGS)
  49. self.driver = bm_driver.BareMetalDriver(None)
  50. def test_validate_driver_loading(self):
  51. self.assertTrue(isinstance(self.driver.driver,
  52. fake.FakeDriver))
  53. self.assertTrue(isinstance(self.driver.vif_driver,
  54. fake.FakeVifDriver))
  55. self.assertTrue(isinstance(self.driver.volume_driver,
  56. fake.FakeVolumeDriver))
  57. self.assertTrue(isinstance(self.driver.firewall_driver,
  58. fake.FakeFirewallDriver))
  59. class BareMetalDriverWithDBTestCase(bm_db_base.BMDBTestCase):
  60. def setUp(self):
  61. super(BareMetalDriverWithDBTestCase, self).setUp()
  62. self.flags(**COMMON_FLAGS)
  63. self.flags(**BAREMETAL_FLAGS)
  64. fake_image.stub_out_image_service(self.stubs)
  65. self.context = utils.get_test_admin_context()
  66. self.driver = bm_driver.BareMetalDriver(None)
  67. self.addCleanup(fake_image.FakeImageService_reset)
  68. def _create_node(self, node_info=None, nic_info=None):
  69. result = {}
  70. if node_info is None:
  71. node_info = bm_db_utils.new_bm_node(
  72. id=123,
  73. service_host='test_host',
  74. cpus=2,
  75. memory_mb=2048,
  76. )
  77. if nic_info is None:
  78. nic_info = [
  79. {'address': '01:23:45:67:89:01', 'datapath_id': '0x1',
  80. 'port_no': 1},
  81. {'address': '01:23:45:67:89:02', 'datapath_id': '0x2',
  82. 'port_no': 2},
  83. ]
  84. result['node_info'] = node_info
  85. result['nic_info'] = nic_info
  86. result['node'] = db.bm_node_create(self.context, node_info)
  87. for nic in nic_info:
  88. db.bm_interface_create(
  89. self.context,
  90. result['node']['id'],
  91. nic['address'],
  92. nic['datapath_id'],
  93. nic['port_no'],
  94. )
  95. result['instance'] = utils.get_test_instance()
  96. result['instance']['node'] = result['node']['uuid']
  97. result['spawn_params'] = dict(
  98. admin_password='test_pass',
  99. block_device_info=None,
  100. context=self.context,
  101. image_meta=utils.get_test_image_info(
  102. None, result['instance']),
  103. injected_files=[('/fake/path', 'hello world')],
  104. instance=result['instance'],
  105. network_info=utils.get_test_network_info(),
  106. )
  107. result['destroy_params'] = dict(
  108. instance=result['instance'],
  109. network_info=result['spawn_params']['network_info'],
  110. block_device_info=result['spawn_params']['block_device_info'],
  111. )
  112. return result
  113. def test_get_host_stats(self):
  114. node = self._create_node()
  115. stats = self.driver.get_host_stats()
  116. self.assertTrue(isinstance(stats, list))
  117. self.assertEqual(len(stats), 1)
  118. stats = stats[0]
  119. self.assertEqual(stats['cpu_arch'], 'test')
  120. self.assertEqual(stats['test_spec'], 'test_value')
  121. self.assertEqual(stats['hypervisor_type'], 'baremetal')
  122. self.assertEqual(stats['hypervisor_hostname'], node['node']['uuid'])
  123. self.assertEqual(stats['host'], 'test_host')
  124. self.assertEqual(stats['vcpus'], 2)
  125. self.assertEqual(stats['host_memory_total'], 2048)
  126. def test_spawn_ok(self):
  127. node = self._create_node()
  128. self.driver.spawn(**node['spawn_params'])
  129. row = db.bm_node_get(self.context, node['node']['id'])
  130. self.assertEqual(row['task_state'], baremetal_states.ACTIVE)
  131. self.assertEqual(row['instance_uuid'], node['instance']['uuid'])
  132. self.assertEqual(row['instance_name'], node['instance']['hostname'])
  133. def test_macs_from_nic_for_instance(self):
  134. node = self._create_node()
  135. expected = set([nic['address'] for nic in node['nic_info']])
  136. self.assertEqual(
  137. expected, self.driver.macs_for_instance(node['instance']))
  138. def test_macs_for_instance_after_spawn(self):
  139. node = self._create_node()
  140. self.driver.spawn(**node['spawn_params'])
  141. expected = set([nic['address'] for nic in node['nic_info']])
  142. self.assertEqual(
  143. expected, self.driver.macs_for_instance(node['instance']))
  144. def test_macs_for_instance(self):
  145. node = self._create_node()
  146. expected = set(['01:23:45:67:89:01', '01:23:45:67:89:02'])
  147. self.assertEqual(
  148. expected, self.driver.macs_for_instance(node['instance']))
  149. def test_macs_for_instance_no_interfaces(self):
  150. # Nodes cannot boot with no MACs, so we raise an error if that happens.
  151. node = self._create_node(nic_info=[])
  152. self.assertRaises(exception.NovaException,
  153. self.driver.macs_for_instance, node['instance'])
  154. def test_spawn_node_already_associated(self):
  155. node = self._create_node()
  156. db.bm_node_update(self.context, node['node']['id'],
  157. {'instance_uuid': '1234-5678'})
  158. self.assertRaises(exception.NovaException,
  159. self.driver.spawn, **node['spawn_params'])
  160. row = db.bm_node_get(self.context, node['node']['id'])
  161. self.assertEqual(row['task_state'], None)
  162. def test_spawn_node_in_use(self):
  163. node = self._create_node()
  164. self.driver.spawn(**node['spawn_params'])
  165. self.assertRaises(exception.NovaException,
  166. self.driver.spawn, **node['spawn_params'])
  167. def test_spawn_node_not_found(self):
  168. node = self._create_node()
  169. db.bm_node_update(self.context, node['node']['id'],
  170. {'uuid': 'hide-this-node'})
  171. self.assertRaises(exception.NovaException,
  172. self.driver.spawn, **node['spawn_params'])
  173. row = db.bm_node_get(self.context, node['node']['id'])
  174. self.assertEqual(row['task_state'], None)
  175. def test_spawn_fails(self):
  176. node = self._create_node()
  177. self.mox.StubOutWithMock(fake.FakePowerManager, 'activate_node')
  178. fake.FakePowerManager.activate_node().AndRaise(test.TestingException)
  179. self.mox.ReplayAll()
  180. self.assertRaises(test.TestingException,
  181. self.driver.spawn, **node['spawn_params'])
  182. row = db.bm_node_get(self.context, node['node']['id'])
  183. self.assertEqual(row['task_state'], baremetal_states.DELETED)
  184. def test_spawn_fails_to_cleanup(self):
  185. node = self._create_node()
  186. self.mox.StubOutWithMock(fake.FakePowerManager, 'activate_node')
  187. self.mox.StubOutWithMock(fake.FakePowerManager, 'deactivate_node')
  188. fake.FakePowerManager.activate_node().AndRaise(test.TestingException)
  189. fake.FakePowerManager.deactivate_node().AndRaise(test.TestingException)
  190. self.mox.ReplayAll()
  191. self.assertRaises(test.TestingException,
  192. self.driver.spawn, **node['spawn_params'])
  193. row = db.bm_node_get(self.context, node['node']['id'])
  194. self.assertEqual(row['task_state'], baremetal_states.ERROR)
  195. def test_destroy_ok(self):
  196. node = self._create_node()
  197. self.driver.spawn(**node['spawn_params'])
  198. self.driver.destroy(**node['destroy_params'])
  199. row = db.bm_node_get(self.context, node['node']['id'])
  200. self.assertEqual(row['task_state'], baremetal_states.DELETED)
  201. self.assertEqual(row['instance_uuid'], None)
  202. self.assertEqual(row['instance_name'], None)
  203. def test_destroy_fails(self):
  204. node = self._create_node()
  205. self.mox.StubOutWithMock(fake.FakePowerManager, 'deactivate_node')
  206. fake.FakePowerManager.deactivate_node().AndRaise(test.TestingException)
  207. self.mox.ReplayAll()
  208. self.driver.spawn(**node['spawn_params'])
  209. self.assertRaises(test.TestingException,
  210. self.driver.destroy, **node['destroy_params'])
  211. row = db.bm_node_get(self.context, node['node']['id'])
  212. self.assertEqual(row['task_state'], baremetal_states.ERROR)
  213. self.assertEqual(row['instance_uuid'], node['instance']['uuid'])
  214. def test_get_available_resources(self):
  215. node = self._create_node()
  216. resources = self.driver.get_available_resource(node['node']['uuid'])
  217. self.assertEqual(resources['memory_mb'],
  218. node['node_info']['memory_mb'])
  219. self.assertEqual(resources['memory_mb_used'], 0)
  220. self.driver.spawn(**node['spawn_params'])
  221. resources = self.driver.get_available_resource(node['node']['uuid'])
  222. self.assertEqual(resources['memory_mb_used'],
  223. node['node_info']['memory_mb'])
  224. self.driver.destroy(**node['destroy_params'])
  225. resources = self.driver.get_available_resource(node['node']['uuid'])
  226. self.assertEqual(resources['memory_mb_used'], 0)
  227. def test_get_available_nodes(self):
  228. self.assertEqual(0, len(self.driver.get_available_nodes()))
  229. node1 = self._create_node()
  230. self.assertEqual(1, len(self.driver.get_available_nodes()))
  231. node1['instance']['hostname'] = 'test-host-1'
  232. self.driver.spawn(**node1['spawn_params'])
  233. self.assertEqual(1, len(self.driver.get_available_nodes()))
  234. self.assertEqual([node1['node']['uuid']],
  235. self.driver.get_available_nodes())
  236. def test_list_instances(self):
  237. self.assertEqual([], self.driver.list_instances())
  238. node1 = self._create_node()
  239. self.assertEqual([], self.driver.list_instances())
  240. node_info = bm_db_utils.new_bm_node(
  241. id=456,
  242. service_host='test_host',
  243. cpus=2,
  244. memory_mb=2048,
  245. )
  246. nic_info = [
  247. {'address': 'cc:cc:cc', 'datapath_id': '0x1',
  248. 'port_no': 1},
  249. {'address': 'dd:dd:dd', 'datapath_id': '0x2',
  250. 'port_no': 2},
  251. ]
  252. node2 = self._create_node(node_info=node_info, nic_info=nic_info)
  253. self.assertEqual([], self.driver.list_instances())
  254. node1['instance']['hostname'] = 'test-host-1'
  255. node2['instance']['hostname'] = 'test-host-2'
  256. self.driver.spawn(**node1['spawn_params'])
  257. self.assertEqual(['test-host-1'],
  258. self.driver.list_instances())
  259. self.driver.spawn(**node2['spawn_params'])
  260. self.assertEqual(['test-host-1', 'test-host-2'],
  261. self.driver.list_instances())
  262. self.driver.destroy(**node1['destroy_params'])
  263. self.assertEqual(['test-host-2'],
  264. self.driver.list_instances())
  265. self.driver.destroy(**node2['destroy_params'])
  266. self.assertEqual([], self.driver.list_instances())