def test_create_duplicate_custom(self): rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc.create() self.assertEqual(rc_obj.ResourceClass.MIN_CUSTOM_RESOURCE_CLASS_ID, rc.id) rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) self.assertRaises(exception.ResourceClassExists, rc.create)
def test_create(self): rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc.create() min_id = rc_obj.ResourceClass.MIN_CUSTOM_RESOURCE_CLASS_ID self.assertEqual(min_id, rc.id) rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_ENTERPRISE', ) rc.create() self.assertEqual(min_id + 1, rc.id)
def test_destroy_fail_with_inventory(self): """Test that we raise an exception when attempting to delete a resource class that is referenced in an inventory record. """ rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc.create() rp = rp_obj.ResourceProvider( self.ctx, name='my rp', uuid=uuidsentinel.rp, ) rp.create() inv = inv_obj.Inventory( resource_provider=rp, resource_class='CUSTOM_IRON_NFV', total=1, ) rp.set_inventory([inv]) self.assertRaises(exception.ResourceClassInUse, rc.destroy) rp.set_inventory([]) rc.destroy() rc_list = rc_obj.get_all(self.ctx) rc_ids = (r.id for r in rc_list) self.assertNotIn(rc.id, rc_ids)
def test_create_fail_not_using_namespace(self): rc = rc_obj.ResourceClass( context=self.ctx, name='IRON_NFV', ) exc = self.assertRaises(exception.ObjectActionError, rc.create) self.assertIn('name must start with', str(exc))
def test_create_duplicate_id_retry_failing(self, mock_get): """negative case for test_create_duplicate_id_retry""" # This order of ID generation will create rc1 with an ID of 44, try to # create rc2 with the same ID, and then return 45 in the retry loop. mock_get.side_effect = (44, 44, 44, 44) rc1 = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc1.create() rc2 = rc_obj.ResourceClass( self.ctx, name='CUSTOM_TWO', ) rc2.RESOURCE_CREATE_RETRY_COUNT = 3 self.assertRaises(exception.MaxDBRetriesExceeded, rc2.create)
def test_create_duplicate_id_retry(self, mock_get): # This order of ID generation will create rc1 with an ID of 42, try to # create rc2 with the same ID, and then return 43 in the retry loop. mock_get.side_effect = (42, 42, 43) rc1 = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc1.create() rc2 = rc_obj.ResourceClass( self.ctx, name='CUSTOM_TWO', ) rc2.create() self.assertEqual(rc1.id, 42) self.assertEqual(rc2.id, 43)
def create_resource_class(req): """POST to create a resource class. On success return a 201 response with an empty body and a location header pointing to the newly created resource class. """ context = req.environ['placement.context'] context.can(policies.CREATE) data = util.extract_json(req.body, schema.POST_RC_SCHEMA_V1_2) try: rc = rc_obj.ResourceClass(context, name=data['name']) rc.create() except exception.ResourceClassExists: raise webob.exc.HTTPConflict( 'Conflicting resource class already exists: %(name)s' % {'name': data['name']}) except exception.MaxDBRetriesExceeded: raise webob.exc.HTTPConflict( 'Max retries of DB transaction exceeded attempting ' 'to create resource class: %(name)s, please ' 'try again.' % {'name': data['name']}) req.response.location = util.resource_class_url(req.environ, rc) req.response.status = 201 req.response.content_type = None return req.response
def update_resource_class(req): """PUT to create or validate the existence of single resource class. On a successful create return 201. Return 204 if the class already exists. If the resource class is not a custom resource class, return a 400. 409 might be a better choice, but 400 aligns with previous code. """ name = util.wsgi_path_item(req.environ, 'name') context = req.environ['placement.context'] context.can(policies.UPDATE) # Use JSON validation to validation resource class name. util.extract_json('{"name": "%s"}' % name, schema.PUT_RC_SCHEMA_V1_2) status = 204 try: rc = rc_obj.ResourceClass.get_by_name(context, name) except exception.NotFound: try: rc = rc_obj.ResourceClass(context, name=name) rc.create() status = 201 # We will not see ResourceClassCannotUpdateStandard because # that was already caught when validating the {name}. except exception.ResourceClassExists: # Someone just now created the class, so stick with 204 pass req.response.status = status req.response.content_type = None req.response.location = util.resource_class_url(req.environ, rc) return req.response
def setUp(self): super(TestPlacementURLs, self).setUp() fake_context = context.RequestContext(user_id='fake', project_id='fake') self.resource_provider = rp_obj.ResourceProvider( fake_context, name=uuidsentinel.rp_name, uuid=uuidsentinel.rp_uuid) self.resource_class = rc_obj.ResourceClass( fake_context, name='CUSTOM_BAREMETAL_GOLD', id=1000)
def start_fixture(self): super(GranularFixture, self).start_fixture() rc_obj.ResourceClass( context=self.context, name='CUSTOM_NET_MBPS').create() os.environ['AGGA'] = uuids.aggA os.environ['AGGB'] = uuids.aggB os.environ['AGGC'] = uuids.aggC cn_left = tb.create_provider(self.context, 'cn_left', uuids.aggA) os.environ['CN_LEFT'] = cn_left.uuid tb.add_inventory(cn_left, 'VCPU', 8) tb.add_inventory(cn_left, 'MEMORY_MB', 4096) tb.add_inventory(cn_left, 'DISK_GB', 500) tb.add_inventory(cn_left, 'VGPU', 8) tb.add_inventory(cn_left, 'SRIOV_NET_VF', 8) tb.add_inventory(cn_left, 'CUSTOM_NET_MBPS', 4000) tb.set_traits(cn_left, 'HW_CPU_X86_AVX', 'HW_CPU_X86_AVX2', 'HW_GPU_API_DXVA', 'HW_NIC_DCB_PFC', 'CUSTOM_FOO') cn_middle = tb.create_provider( self.context, 'cn_middle', uuids.aggA, uuids.aggB) os.environ['CN_MIDDLE'] = cn_middle.uuid tb.add_inventory(cn_middle, 'VCPU', 8) tb.add_inventory(cn_middle, 'MEMORY_MB', 4096) tb.add_inventory(cn_middle, 'SRIOV_NET_VF', 8) tb.add_inventory(cn_middle, 'CUSTOM_NET_MBPS', 4000) tb.set_traits(cn_middle, 'HW_CPU_X86_AVX', 'HW_CPU_X86_AVX2', 'HW_CPU_X86_SSE', 'HW_NIC_ACCEL_TLS') cn_right = tb.create_provider( self.context, 'cn_right', uuids.aggB, uuids.aggC) os.environ['CN_RIGHT'] = cn_right.uuid tb.add_inventory(cn_right, 'VCPU', 8) tb.add_inventory(cn_right, 'MEMORY_MB', 4096) tb.add_inventory(cn_right, 'DISK_GB', 500) tb.add_inventory(cn_right, 'VGPU', 8, max_unit=2) tb.set_traits(cn_right, 'HW_CPU_X86_MMX', 'HW_GPU_API_DXVA', 'CUSTOM_DISK_SSD') shr_disk_1 = tb.create_provider(self.context, 'shr_disk_1', uuids.aggA) os.environ['SHR_DISK_1'] = shr_disk_1.uuid tb.add_inventory(shr_disk_1, 'DISK_GB', 1000) tb.set_traits(shr_disk_1, 'MISC_SHARES_VIA_AGGREGATE', 'CUSTOM_DISK_SSD') shr_disk_2 = tb.create_provider( self.context, 'shr_disk_2', uuids.aggA, uuids.aggB) os.environ['SHR_DISK_2'] = shr_disk_2.uuid tb.add_inventory(shr_disk_2, 'DISK_GB', 1000) tb.set_traits(shr_disk_2, 'MISC_SHARES_VIA_AGGREGATE') shr_net = tb.create_provider(self.context, 'shr_net', uuids.aggC) os.environ['SHR_NET'] = shr_net.uuid tb.add_inventory(shr_net, 'SRIOV_NET_VF', 16) tb.add_inventory(shr_net, 'CUSTOM_NET_MBPS', 40000) tb.set_traits(shr_net, 'MISC_SHARES_VIA_AGGREGATE')
def test_get_by_name_custom(self): rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc.create() get_rc = rc_obj.ResourceClass.get_by_name( self.ctx, 'CUSTOM_IRON_NFV', ) self.assertEqual(rc.id, get_rc.id) self.assertEqual(rc.name, get_rc.name)
def test_save(self): rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc.create() rc = rc_obj.ResourceClass.get_by_name( self.ctx, 'CUSTOM_IRON_NFV', ) rc.name = 'CUSTOM_IRON_SILVER' rc.save() # Verify rc cache was purged of the old entry self.assertRaises(exception.NotFound, rc_obj.ResourceClass.get_by_name, self.ctx, 'CUSTOM_IRON_NFV')
def test_destroy(self): rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) rc.create() rc_list = rc_obj.get_all(self.ctx) rc_ids = (r.id for r in rc_list) self.assertIn(rc.id, rc_ids) rc = rc_obj.ResourceClass.get_by_name( self.ctx, 'CUSTOM_IRON_NFV', ) rc.destroy() rc_list = rc_obj.get_all(self.ctx) rc_ids = (r.id for r in rc_list) self.assertNotIn(rc.id, rc_ids) # Verify rc cache was purged of the old entry self.assertRaises(exception.ResourceClassNotFound, rc_obj.ResourceClass.get_by_name, self.ctx, 'CUSTOM_IRON_NFV')
def ensure_rc(context, name): try: rc_obj.ResourceClass.get_by_name(context, name) except exception.NotFound: rc_obj.ResourceClass(context, name=name).create()
def test_cannot_create_requires_name(self): rc = resource_class.ResourceClass(self.context) exc = self.assertRaises(exception.ObjectActionError, rc.create) self.assertIn('name is required', str(exc))
def test_cannot_create_with_id(self): rc = resource_class.ResourceClass(self.context, id=1, name='CUSTOM_IRON_NFV') exc = self.assertRaises(exception.ObjectActionError, rc.create) self.assertIn('already created', str(exc))
def test_create_duplicate_standard(self): rc = rc_obj.ResourceClass( context=self.ctx, name=orc.VCPU, ) self.assertRaises(exception.ResourceClassExists, rc.create)
def test_save_fail_no_id(self): rc = rc_obj.ResourceClass( self.ctx, name='CUSTOM_IRON_NFV', ) self.assertRaises(exception.ObjectActionError, rc.save)