Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
 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))
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
    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')
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
    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')
Ejemplo n.º 13
0
    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')
Ejemplo n.º 14
0
def ensure_rc(context, name):
    try:
        rc_obj.ResourceClass.get_by_name(context, name)
    except exception.NotFound:
        rc_obj.ResourceClass(context, name=name).create()
Ejemplo n.º 15
0
 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))
Ejemplo n.º 16
0
 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))
Ejemplo n.º 17
0
 def test_create_duplicate_standard(self):
     rc = rc_obj.ResourceClass(
         context=self.ctx,
         name=orc.VCPU,
     )
     self.assertRaises(exception.ResourceClassExists, rc.create)
Ejemplo n.º 18
0
 def test_save_fail_no_id(self):
     rc = rc_obj.ResourceClass(
         self.ctx,
         name='CUSTOM_IRON_NFV',
     )
     self.assertRaises(exception.ObjectActionError, rc.save)