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 = rp_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 = rp_obj.ResourceClass.get_by_name(context, name) except exception.NotFound: try: rc = rp_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() self.resource_provider = rp_obj.ResourceProvider( name=uuidsentinel.rp_name, uuid=uuidsentinel.rp_uuid) self.resource_class = rp_obj.ResourceClass( name='CUSTOM_BAREMETAL_GOLD', id=1000)
def start_fixture(self): super(GranularFixture, self).start_fixture() rp_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_cannot_create_requires_name(self): rc = resource_provider.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_provider.ResourceClass(self.context, id=1, name='CUSTOM_IRON_NFV') exc = self.assertRaises(exception.ObjectActionError, rc.create) self.assertIn('already created', str(exc))