def test_get_one_custom_fields(self): obj_utils.create_test_conductor(self.context, hostname='rocky.rocks') fields = 'hostname,alive' data = self.get_json( '/conductors/rocky.rocks?fields=%s' % fields, headers={api_base.Version.string: str(api_v1.max_version())}) self.assertItemsEqual(['hostname', 'alive', 'links'], data)
def test_check_orphaned_allocations(self, mock_allocate): alive_conductor = obj_utils.create_test_conductor( self.context, id=42, hostname='alive') dead_conductor = obj_utils.create_test_conductor( self.context, id=43, hostname='dead') obj_utils.create_test_allocation( self.context, state='allocating', conductor_affinity=alive_conductor.id) allocation = obj_utils.create_test_allocation( self.context, state='allocating', conductor_affinity=dead_conductor.id) self._start_service() with mock.patch.object(self.dbapi, 'get_offline_conductors', autospec=True) as mock_conds: mock_conds.return_value = [dead_conductor.id] self.service._check_orphan_allocations(self.context) mock_allocate.assert_called_once_with(self.context, mock.ANY) actual = mock_allocate.call_args[0][1] self.assertEqual(allocation.uuid, actual.uuid) self.assertIsInstance(allocation, objects.Allocation) allocation = self.dbapi.get_allocation_by_id(allocation.id) self.assertEqual(self.service.conductor.id, allocation.conductor_affinity)
def test_get_custom_fields_invalid_fields(self): obj_utils.create_test_conductor(self.context, hostname='rocky.rocks') fields = 'hostname,spongebob' response = self.get_json( '/conductors/rocky.rocks?fields=%s' % fields, headers={api_base.Version.string: str(api_v1.max_version())}, expect_errors=True) self.assertEqual(http_client.BAD_REQUEST, response.status_int) self.assertEqual('application/json', response.content_type) self.assertIn('spongebob', response.json['error_message'])
def test_get_collection_custom_fields(self): obj_utils.create_test_conductor(self.context, hostname='rocky.rocks') obj_utils.create_test_conductor(self.context, hostname='stein.rocks') fields = 'hostname,alive' data = self.get_json( '/conductors?fields=%s' % fields, headers={api_base.Version.string: str(api_v1.max_version())}) self.assertEqual(2, len(data['conductors'])) for c in data['conductors']: self.assertItemsEqual(['hostname', 'alive', 'links'], c)
def test_get_one(self): obj_utils.create_test_conductor(self.context, hostname='rocky.rocks') data = self.get_json( '/conductors/rocky.rocks', headers={api_base.Version.string: str(api_v1.max_version())}) self.assertIn('hostname', data) self.assertIn('drivers', data) self.assertIn('conductor_group', data) self.assertIn('alive', data) self.assertIn('drivers', data) self.assertEqual(data['hostname'], 'rocky.rocks') self.assertTrue(data['alive'])
def test_list(self): obj_utils.create_test_conductor(self.context, hostname='why care') obj_utils.create_test_conductor(self.context, hostname='why not') data = self.get_json( '/conductors', headers={api_base.Version.string: str(api_v1.max_version())}) self.assertEqual(2, len(data['conductors'])) for c in data['conductors']: self.assertIn('hostname', c) self.assertIn('conductor_group', c) self.assertIn('alive', c) self.assertNotIn('drivers', c) self.assertEqual(data['conductors'][0]['hostname'], 'why care') self.assertEqual(data['conductors'][1]['hostname'], 'why not')
def test_resume_allocations(self, mock_allocate): another_conductor = obj_utils.create_test_conductor( self.context, id=42, hostname='another-host') self._start_service() obj_utils.create_test_allocation( self.context, state='active', conductor_affinity=self.service.conductor.id) obj_utils.create_test_allocation( self.context, state='allocating', conductor_affinity=another_conductor.id) allocation = obj_utils.create_test_allocation( self.context, state='allocating', conductor_affinity=self.service.conductor.id) self.service._resume_allocations(self.context) mock_allocate.assert_called_once_with(self.context, mock.ANY) actual = mock_allocate.call_args[0][1] self.assertEqual(allocation.uuid, actual.uuid) self.assertIsInstance(allocation, objects.Allocation)
def test_get_one_conductor_offline(self, mock_utcnow): self.config(heartbeat_timeout=10, group='conductor') _time = datetime.datetime(2000, 1, 1, 0, 0) mock_utcnow.return_value = _time obj_utils.create_test_conductor(self.context, hostname='rocky.rocks') mock_utcnow.return_value = _time + datetime.timedelta(seconds=30) data = self.get_json( '/conductors/rocky.rocks', headers={api_base.Version.string: str(api_v1.max_version())}) self.assertIn('hostname', data) self.assertIn('drivers', data) self.assertIn('conductor_group', data) self.assertIn('alive', data) self.assertIn('drivers', data) self.assertEqual(data['hostname'], 'rocky.rocks') self.assertFalse(data['alive'])
def test_sort_key(self): conductors = [] for id in range(5): hostname = uuidutils.generate_uuid() conductor = obj_utils.create_test_conductor(self.context, hostname=hostname) conductors.append(conductor.hostname) data = self.get_json( '/conductors?sort_key=hostname', headers={api_base.Version.string: str(api_v1.max_version())}) hosts = [n['hostname'] for n in data['conductors']] self.assertEqual(sorted(conductors), hosts)
def _test_links(self, public_url=None): cfg.CONF.set_override('public_endpoint', public_url, 'api') obj_utils.create_test_conductor(self.context, hostname='rocky.rocks') headers = {api_base.Version.string: str(api_v1.max_version())} data = self.get_json( '/conductors/rocky.rocks', headers=headers) self.assertIn('links', data) self.assertEqual(2, len(data['links'])) self.assertIn('rocky.rocks', data['links'][0]['href']) for link in data['links']: bookmark = link['rel'] == 'bookmark' self.assertTrue(self.validate_link(link['href'], bookmark=bookmark, headers=headers)) if public_url is not None: expected = [{'href': '%s/v1/conductors/rocky.rocks' % public_url, 'rel': 'self'}, {'href': '%s/conductors/rocky.rocks' % public_url, 'rel': 'bookmark'}] for i in expected: self.assertIn(i, data['links'])
def _test_links(self, public_url=None): cfg.CONF.set_override('public_endpoint', public_url, 'api') obj_utils.create_test_conductor(self.context, hostname='rocky.rocks') headers = {api_base.Version.string: str(api_v1.max_version())} data = self.get_json( '/conductors/rocky.rocks', headers=headers) self.assertIn('links', data) self.assertEqual(2, len(data['links'])) self.assertIn('rocky.rocks', data['links'][0]['href']) for l in data['links']: bookmark = l['rel'] == 'bookmark' self.assertTrue(self.validate_link(l['href'], bookmark=bookmark, headers=headers)) if public_url is not None: expected = [{'href': '%s/v1/conductors/rocky.rocks' % public_url, 'rel': 'self'}, {'href': '%s/conductors/rocky.rocks' % public_url, 'rel': 'bookmark'}] for i in expected: self.assertIn(i, data['links'])
def test_collection_links(self): conductors = [] for id in range(5): hostname = uuidutils.generate_uuid() conductor = obj_utils.create_test_conductor(self.context, hostname=hostname) conductors.append(conductor.hostname) data = self.get_json( '/conductors/?limit=3', headers={api_base.Version.string: str(api_v1.max_version())}) self.assertEqual(3, len(data['conductors'])) next_marker = data['conductors'][-1]['hostname'] self.assertIn(next_marker, data['next'])
def test_collection_links_custom_fields(self): cfg.CONF.set_override('max_limit', 3, 'api') conductors = [] fields = 'hostname,alive' for id in range(5): hostname = uuidutils.generate_uuid() conductor = obj_utils.create_test_conductor(self.context, hostname=hostname) conductors.append(conductor.hostname) data = self.get_json( '/conductors?fields=%s' % fields, headers={api_base.Version.string: str(api_v1.max_version())}) self.assertEqual(3, len(data['conductors'])) next_marker = data['conductors'][-1]['hostname'] self.assertIn(next_marker, data['next']) self.assertIn('fields', data['next'])