def test_get_node_list_with_filters(self): ch1 = utils.get_test_chassis(id=1, uuid=ironic_utils.generate_uuid()) ch2 = utils.get_test_chassis(id=2, uuid=ironic_utils.generate_uuid()) self.dbapi.create_chassis(ch1) self.dbapi.create_chassis(ch2) n1 = utils.get_test_node(id=1, driver='driver-one', instance_uuid=ironic_utils.generate_uuid(), reservation='fake-host', uuid=ironic_utils.generate_uuid(), chassis_id=ch1['id']) n2 = utils.get_test_node(id=2, driver='driver-two', uuid=ironic_utils.generate_uuid(), chassis_id=ch2['id'], maintenance=True) self.dbapi.create_node(n1) self.dbapi.create_node(n2) res = self.dbapi.get_node_list(filters={'chassis_uuid': ch1['uuid']}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'chassis_uuid': ch2['uuid']}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'driver': 'driver-one'}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'driver': 'bad-driver'}) self.assertEqual([], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'associated': True}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'associated': False}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'reserved': True}) self.assertEqual([1], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'reserved': False}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'maintenance': True}) self.assertEqual([2], [r.id for r in res]) res = self.dbapi.get_node_list(filters={'maintenance': False}) self.assertEqual([1], [r.id for r in res])
def test_add_root(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/description', 'value': 'test', 'op': 'add'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_int)
def test_post_nodes_subresource(self): cdict = dbutils.get_test_chassis() self.post_json('/chassis', cdict) ndict = dbutils.get_test_node(chassis_id=cdict['id']) response = self.post_json('/chassis/nodes', ndict, expect_errors=True) self.assertEqual(response.status_int, 403)
def post_get_test_node(**kw): # NOTE(lucasagomes): When creating a node via API (POST) # we have to use chassis_uuid node = node_post_data(**kw) chassis = utils.get_test_chassis() node['chassis_uuid'] = kw.get('chassis_uuid', chassis['uuid']) return node
def test_remove_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} cdict = dbutils.get_test_chassis(extra=extra, description="foobar", uuid=utils.generate_uuid(), id=None) self.dbapi.create_chassis(cdict) # Removing one item from the collection response = self.patch_json('/chassis/%s' % cdict['uuid'], [{ 'path': '/extra/foo2', 'op': 'remove' }]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) extra.pop("foo2") self.assertEqual(extra, result['extra']) # Removing the collection response = self.patch_json('/chassis/%s' % cdict['uuid'], [{ 'path': '/extra', 'op': 'remove' }]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual({}, result['extra']) # Assert nothing else was changed self.assertEqual(cdict['uuid'], result['uuid']) self.assertEqual(cdict['description'], result['description'])
def test_detail(self): cdict = dbutils.get_test_chassis() chassis = self.dbapi.create_chassis(cdict) data = self.get_json('/chassis/detail') self.assertEqual(chassis['uuid'], data['chassis'][0]["uuid"]) self.assertIn('extra', data['chassis'][0]) self.assertIn('nodes', data['chassis'][0])
def test_one(self): ndict = dbutils.get_test_chassis() chassis = self.dbapi.create_chassis(ndict) data = self.get_json('/chassis') self.assertEqual(chassis['uuid'], data['chassis'][0]["uuid"]) self.assertNotIn('extra', data['chassis'][0]) self.assertNotIn('nodes', data['chassis'][0])
def test_post_nodes_subresource(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) ndict = apiutils.node_post_data(chassis_id=None) ndict['chassis_uuid'] = cdict['uuid'] response = self.post_json('/chassis/nodes', ndict, expect_errors=True) self.assertEqual(403, response.status_int)
def test_get_one(self): cdict = dbutils.get_test_chassis() chassis = self.dbapi.create_chassis(cdict) data = self.get_json('/chassis/%s' % chassis['uuid']) self.assertEqual(chassis['uuid'], data['uuid']) self.assertIn('extra', data) self.assertIn('nodes', data)
def test_remove_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} cdict = dbutils.get_test_chassis(extra=extra, description="foobar", uuid=utils.generate_uuid(), id=None) self.dbapi.create_chassis(cdict) # Removing one item from the collection response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/foo2', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) extra.pop("foo2") self.assertEqual(extra, result['extra']) # Removing the collection response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual({}, result['extra']) # Assert nothing else was changed self.assertEqual(cdict['uuid'], result['uuid']) self.assertEqual(cdict['description'], result['description'])
def post_get_test_node(**kw): # NOTE(lucasagomes): When creating a node via API (POST) # we have to use chassis_uuid node = node_post_data(**kw) chassis = utils.get_test_chassis() node['chassis_id'] = None node['chassis_uuid'] = kw.get('chassis_uuid', chassis['uuid']) return node
def setUp(self): super(TestDelete, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) p = mock.patch.object(rpcapi.ConductorAPI, 'get_topic_for') self.mock_gtf = p.start() self.mock_gtf.return_value = 'test-topic' self.addCleanup(p.stop)
def test_nodes_subresource_noid(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) ndict = dbutils.get_test_node(chassis_id=cdict['id']) self.dbapi.create_node(ndict) # No chassis id specified response = self.get_json('/chassis/nodes', expect_errors=True) self.assertEqual(response.status_int, 400)
def test_remove_non_existent_property_fail(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/non-existent', 'op': 'remove'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_code) self.assertTrue(response.json['error_message'])
def test_create_chassis_generate_uuid(self): cdict = dbutils.get_test_chassis() del cdict['uuid'] self.post_json('/chassis', cdict) result = self.get_json('/chassis') self.assertEqual(cdict['description'], result['items'][0]['description']) self.assertTrue(uuidutils.is_uuid_like(result['items'][0]['uuid']))
def test_links(self): uuid = uuidutils.generate_uuid() ndict = dbutils.get_test_chassis(id=1, uuid=uuid) self.dbapi.create_chassis(ndict) data = self.get_json('/chassis/1') self.assertIn('links', data.keys()) self.assertEqual(len(data['links']), 2) self.assertIn(uuid, data['links'][0]['href'])
def test_remove_uuid(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/uuid', 'op': 'remove'}], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message'])
def test_get_chassis_list(self): uuids = [] for i in range(1, 6): n = utils.get_test_chassis(id=i, uuid=ironic_utils.generate_uuid()) self.dbapi.create_chassis(n) uuids.append(six.text_type(n['uuid'])) res = self.dbapi.get_chassis_list() res_uuids = [r.uuid for r in res] self.assertEqual(uuids.sort(), res_uuids.sort())
def test_add_root_non_existent(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/foo', 'value': 'bar', 'op': 'add'}], expect_errors=True) self.assertEqual('application/json', response.content_type) self.assertEqual(400, response.status_int) self.assertTrue(response.json['error_message'])
def test_delete_chassis(self): cdict = dbutils.get_test_chassis() self.post_json('/chassis', cdict) self.delete('/chassis/%s' % cdict['uuid']) response = self.get_json('/chassis/%s' % cdict['uuid'], expect_errors=True) self.assertEqual(response.status_int, 404) self.assertEqual(response.content_type, 'application/json') self.assertTrue(response.json['error_message'])
def test_delete_chassis_with_node(self): cdict = dbutils.get_test_chassis() self.dbapi.create_chassis(cdict) obj_utils.create_test_node(self.context, chassis_id=cdict['id']) response = self.delete('/chassis/%s' % cdict['uuid'], expect_errors=True) self.assertEqual(400, response.status_int) self.assertEqual('application/json', response.content_type) self.assertTrue(response.json['error_message'])
def setUp(self): super(TestPut, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) self.mox.StubOutWithMock(rpcapi.ConductorAPI, 'update_node') self.mox.StubOutWithMock(rpcapi.ConductorAPI, 'change_node_power_state')
def setUp(self): super(TestPut, self).setUp() cdict = dbutils.get_test_chassis() self.chassis = self.dbapi.create_chassis(cdict) ndict = dbutils.get_test_node() self.node = self.dbapi.create_node(ndict) p = mock.patch.object(rpcapi.ConductorAPI, 'change_node_power_state') self.mock_cnps = p.start() self.addCleanup(p.stop)
def test_links(self): uuid = utils.generate_uuid() ndict = dbutils.get_test_chassis(id=1, uuid=uuid) self.dbapi.create_chassis(ndict) data = self.get_json('/chassis/%s' % uuid) self.assertIn('links', data.keys()) self.assertEqual(2, len(data['links'])) self.assertIn(uuid, data['links'][0]['href']) self.assertTrue(self.validate_link(data['links'][0]['href'])) self.assertTrue(self.validate_link(data['links'][1]['href']))
def test_many(self): ch_list = [] for id in range(5): ndict = dbutils.get_test_chassis(id=id, uuid=utils.generate_uuid()) chassis = self.dbapi.create_chassis(ndict) ch_list.append(chassis['uuid']) data = self.get_json('/chassis') self.assertEqual(len(ch_list), len(data['chassis'])) uuids = [n['uuid'] for n in data['chassis']] self.assertEqual(ch_list.sort(), uuids.sort())
def test_get_chassis_list(self): uuids = [] for i in xrange(1, 6): n = utils.get_test_chassis(id=i, uuid=uuidutils.generate_uuid()) self.dbapi.create_chassis(n) uuids.append(unicode(n['uuid'])) res = self.dbapi.get_chassis_list() uuids.sort() res.sort() self.assertEqual(uuids, res)
def test_patch_nodes_subresource(self): cdict = dbutils.get_test_chassis() response = self.patch_json( '/chassis/%s/nodes' % cdict['uuid'], [{ 'path': '/extra/foo', 'value': 'bar', 'op': 'add' }], expect_errors=True) self.assertEqual(403, response.status_int)
def test_update_chassis(self): cdict = dbutils.get_test_chassis() self.post_json('/chassis', cdict) description = 'chassis-new-description' response = self.patch_json('/chassis/%s' % cdict['uuid'], {'description': description}) self.assertEqual(response.content_type, 'application/json') self.assertEqual(response.status_code, 200) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(result['description'], description)
def test_patch_nodes_subresource(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s/nodes' % cdict['uuid'], [{ 'path': '/extra/foo', 'value': 'bar', 'op': 'add' }], expect_errors=True) self.assertEqual(403, response.status_int)
def test_replace_singular(self): cdict = dbutils.get_test_chassis() description = 'chassis-new-description' response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/description', 'value': description, 'op': 'replace'}]) self.assertEqual(response.content_type, 'application/json') self.assertEqual(response.status_code, 200) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertEqual(result['description'], description)
def test_delete_chassis(self): cdict = dbutils.get_test_chassis() self.post_json('/chassis', cdict) self.delete('/chassis/%s' % cdict['uuid']) response = self.get_json('/chassis/%s' % cdict['uuid'], expect_errors=True) # TODO(yuriyz): change to 404 (bug 1200517) self.assertEqual(response.status_int, 500) self.assertEqual(response.content_type, 'application/json') self.assertTrue(response.json['error_message'])
def test_links(self): uuid = utils.generate_uuid() ndict = dbutils.get_test_chassis(id=1, uuid=uuid) self.dbapi.create_chassis(ndict) data = self.get_json('/chassis/%s' % uuid) self.assertIn('links', data.keys()) self.assertEqual(2, len(data['links'])) self.assertIn(uuid, data['links'][0]['href']) for l in data['links']: bookmark = l['rel'] == 'bookmark' self.assertTrue(self.validate_link(l['href'], bookmark=bookmark))
def get_test_chassis(ctxt, **kw): """Return a Chassis object with appropriate attributes. NOTE: The object leaves the attributes marked as changed, such that a create() could be used to commit it to the DB. """ db_chassis = db_utils.get_test_chassis(**kw) chassis = objects.Chassis(ctxt) for key in db_chassis: setattr(chassis, key, db_chassis[key]) return chassis
def test_collection_links(self): chassis = [] for id in range(5): ndict = dbutils.get_test_chassis(id=id, uuid=utils.generate_uuid()) ch = self.dbapi.create_chassis(ndict) chassis.append(ch['uuid']) data = self.get_json('/chassis/?limit=3') self.assertEqual(3, len(data['chassis'])) next_marker = data['chassis'][-1]['uuid'] self.assertIn(next_marker, data['next'])
def test_add_multi(self): cdict = dbutils.get_test_chassis() response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/foo1', 'value': 'bar1', 'op': 'add'}, {'path': '/extra/foo2', 'value': 'bar2', 'op': 'add'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) expected = {"foo1": "bar1", "foo2": "bar2"} self.assertEqual(expected, result['extra'])
def test_collection_links_default_limit(self): cfg.CONF.set_override('max_limit', 3, 'api') chassis = [] for id in range(5): ndict = dbutils.get_test_chassis(id=id, uuid=utils.generate_uuid()) ch = self.dbapi.create_chassis(ndict) chassis.append(ch['uuid']) data = self.get_json('/chassis') self.assertEqual(3, len(data['chassis'])) next_marker = data['chassis'][-1]['uuid'] self.assertIn(next_marker, data['next'])
def get_test_chassis(ctxt, **kw): """Return a Chassis object with appropriate attributes. NOTE: The object leaves the attributes marked as changed, such that a create() could be used to commit it to the DB. """ db_chassis = db_utils.get_test_chassis(**kw) # Let DB generate ID if it isn't specified explicitly if 'id' not in kw: del db_chassis['id'] chassis = objects.Chassis(ctxt) for key in db_chassis: setattr(chassis, key, db_chassis[key]) return chassis
def test_collection_links(self): chassis = [] for id in xrange(5): ndict = dbutils.get_test_chassis(id=id, uuid=uuidutils.generate_uuid()) ch = self.dbapi.create_chassis(ndict) chassis.append(ch['uuid']) data = self.get_json('/chassis/?limit=3') self.assertEqual(data['type'], 'chassis') self.assertEqual(len(data['items']), 3) next_marker = data['items'][-1]['uuid'] next_link = [l['href'] for l in data['links'] if l['rel'] == 'next'][0] self.assertIn(next_marker, next_link)
def test_remove_singular(self): cdict = dbutils.get_test_chassis(extra={'a': 'b'}, uuid=utils.generate_uuid(), id=None) self.dbapi.create_chassis(cdict) response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/description', 'op': 'remove'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) self.assertIsNone(result['description']) # Assert nothing else was changed self.assertEqual(cdict['uuid'], result['uuid']) self.assertEqual(cdict['extra'], result['extra'])
def test_replace_multi(self): extra = {"foo1": "bar1", "foo2": "bar2", "foo3": "bar3"} cdict = dbutils.get_test_chassis(extra=extra, uuid=utils.generate_uuid(), id=None) self.dbapi.create_chassis(cdict) new_value = 'new value' response = self.patch_json('/chassis/%s' % cdict['uuid'], [{'path': '/extra/foo2', 'value': new_value, 'op': 'replace'}]) self.assertEqual('application/json', response.content_type) self.assertEqual(200, response.status_code) result = self.get_json('/chassis/%s' % cdict['uuid']) extra["foo2"] = new_value self.assertEqual(extra, result['extra'])