Adds `resource_traits` field for flavors

The `resource_traits` field is intended to be used to reference
the resource qualities.

Partially Implements: bp new-flavor

Change-Id: I5fa154dbf8bc96d15c3cdd3699c671e5eccc1cdd
This commit is contained in:
Zhenguo Niu 2017-06-23 11:33:49 +08:00
parent fc005946a3
commit 4b6df25fd8
18 changed files with 57 additions and 42 deletions

View File

@ -35,12 +35,12 @@ Response
- links: links
- description: flavor_description
- resources: flavor_resources
- resource_traits: flavor_resource_traits
- uuid: flavor_uuid
- created_at: created_at
- updated_at: updated_at
- is_public: flavor_is_public
- disabled: flavor_disabled
- extra_specs: flavor_extra_specs
**Example List flavors**
@ -70,7 +70,7 @@ Request
- name: flavor_name
- description: flavor_description
- resources: flavor_resources
- extra_specs: flavor_extra_specs
- resource_traits: flavor_resource_traits
- is_public: flavor_is_public_not_required
- disabled: flavor_disabled
@ -88,12 +88,12 @@ Response
- links: links
- description: flavor_description
- resources: flavor_resources
- resource_traits: flavor_resource_traits
- uuid: flavor_uuid
- created_at: created_at
- updated_at: updated_at
- is_public: flavor_is_public
- disabled: flavor_disabled
- extra_specs: flavor_extra_specs
**Example Create flavor**
@ -139,12 +139,12 @@ Response
- links: links
- description: flavor_description
- resources: flavor_resources
- resource_traits: flavor_resource_traits
- uuid: flavor_uuid
- created_at: created_at
- updated_at: updated_at
- is_public: flavor_is_public
- disabled: flavor_disabled
- extra_specs: flavor_extra_specs
**Example Update flavor**
@ -178,12 +178,12 @@ Response
- links: links
- description: flavor_description
- resources: flavor_resources
- resource_traits: flavor_resource_traits
- uuid: flavor_uuid
- created_at: created_at
- updated_at: updated_at
- is_public: flavor_is_public
- disabled: flavor_disabled
- extra_specs: flavor_extra_specs
**Example Show Flavor Details**

View File

@ -154,12 +154,6 @@ flavor_disabled:
in: body
required: false
type: boolean
flavor_extra_specs:
description: |
Extra spec key and value pairs associate with the flavor.
in: body
required: true
type: object
flavor_is_public:
description: |
Whether the flavor is public (available to all projects) or scoped
@ -180,6 +174,13 @@ flavor_name:
in: body
required: true
type: string
flavor_resource_traits:
description: |
A dict of key and value pairs associate with the flavor including the resource
name and the qualities.
in: body
required: false
type: object
flavor_resources:
description: |
A dict of key and value pairs associate with the flavor including the resource

View File

@ -4,8 +4,8 @@
"resources": {
"CUSTOM_BAREMETAL_GOLD": 1
},
"extra_specs": {
"capabilities": "boot_mode:bios"
"resource_traits": {
"CUSTOM_BAREMETAL_GOLD": "FPGA"
},
"is_public": true,
"disabled": true

View File

@ -13,10 +13,12 @@
"resources": {
"CUSTOM_BAREMETAL_GOLD": 1
},
"resource_traits": {
"CUSTOM_BAREMETAL_GOLD": "FPGA"
},
"created_at": "2016-09-27T02:37:21.966342+00:00",
"uuid": "7de2859d-ec6d-42c7-bb86-9d630ba5ac94",
"updated_at": null,
"extra_specs": {},
"is_public": true,
"disabled": true,
"name": "test_flavor"

View File

@ -13,10 +13,12 @@
"resources": {
"CUSTOM_BAREMETAL_GOLD": 1
},
"resource_traits": {
"CUSTOM_BAREMETAL_GOLD": "FPGA"
},
"created_at": "2016-09-27T02:37:21.966342+00:00",
"uuid": "7de2859d-ec6d-42c7-bb86-9d630ba5ac94",
"updated_at": null,
"extra_specs": {},
"is_public": true,
"disabled": false,
"name": "test_flavor"

View File

@ -8,10 +8,5 @@
"op": "replace",
"path": "/is_public",
"value": false
},
{
"op": "add",
"path": "/extra_specs/k1",
"value": "v1"
}
]

View File

@ -13,10 +13,12 @@
"resources": {
"CUSTOM_BAREMETAL_GOLD": 1
},
"resource_traits": {
"CUSTOM_BAREMETAL_GOLD": "FPGA"
},
"created_at": "2016-09-27T02:37:21.966342+00:00",
"uuid": "7de2859d-ec6d-42c7-bb86-9d630ba5ac94",
"updated_at": null,
"extra_specs": {},
"is_public": false,
"disabled": false,
"name": "updated_flavor"

View File

@ -15,12 +15,12 @@
"resources": {
"CUSTOM_BAREMETAL_GOLD": 1
},
"resource_traits": {
"CUSTOM_BAREMETAL_GOLD": "FPGA"
},
"created_at": "2016-09-22T03:21:57+00:00",
"uuid": "2ce3df6b-f571-42e8-b6a8-8f7fa1c019ce",
"updated_at": null,
"extra_specs": {
"key": "value"
},
"is_public": true,
"disabled": false,
"name": "new_test1"
@ -40,10 +40,12 @@
"resources": {
"CUSTOM_BAREMETAL_GOLD": 1
},
"resource_traits": {
"CUSTOM_BAREMETAL_GOLD": "FPGA"
},
"created_at": "2016-09-27T02:37:21+00:00",
"uuid": "7de2859d-ec6d-42c7-bb86-9d630ba5ac94",
"updated_at": null,
"extra_specs": {},
"is_public": true,
"disabled": false,
"name": "new_test2"

View File

@ -66,8 +66,8 @@ class Flavor(base.APIBase):
resources = {wtypes.text: types.jsontype}
"""The resources of the flavor"""
extra_specs = {wtypes.text: types.jsontype}
"""The extra specs of the flavor"""
resource_traits = {wtypes.text: types.jsontype}
"""The resource traits of the flavor"""
links = wsme.wsattr([link.Link], readonly=True)
"""A list containing a self link"""

View File

@ -23,7 +23,7 @@ create_flavor = {
'name': parameter_types.name,
'description': {'type': 'string', 'minLength': 1},
'resources': parameter_types.resources,
'extra_specs': parameter_types.metadata,
'resource_traits': parameter_types.resource_traits,
'is_public': parameter_types.boolean,
'disabled': parameter_types.boolean,
},

View File

@ -84,6 +84,17 @@ resources = {
}
resource_traits = {
'type': 'object',
'patternProperties': {
'^[a-zA-Z0-9-_:.]{1,255}$': {
'type': 'string', 'maxLength': 255
}
},
'additionalProperties': False
}
mac_address = {
'type': 'string',
'pattern': '^([0-9a-fA-F]{2})(:[0-9a-fA-F]{2}){5}$'

View File

@ -36,7 +36,7 @@ def upgrade():
sa.Column('name', sa.String(length=255), nullable=False),
sa.Column('description', sa.Text(), nullable=True),
sa.Column('resources', sa.Text(), nullable=True),
sa.Column('extra_specs', sa.Text(), nullable=True),
sa.Column('resource_traits', sa.Text(), nullable=True),
sa.Column('is_public', sa.Boolean(), nullable=False),
sa.Column('disabled', sa.Boolean(), nullable=False),
sa.PrimaryKeyConstraint('uuid'),

View File

@ -157,7 +157,7 @@ class Flavors(Base):
name = Column(String(255), nullable=False)
description = Column(MediumText())
resources = Column(db_types.JsonEncodedDict)
extra_specs = Column(db_types.JsonEncodedDict)
resource_traits = Column(db_types.JsonEncodedDict)
is_public = Column(Boolean, default=True)
disabled = Column(Boolean, default=False)
servers = orm.relationship(

View File

@ -38,7 +38,7 @@ class Flavor(base.MoganObject, object_base.VersionedObjectDictCompat):
'is_public': object_fields.BooleanField(),
'disabled': object_fields.BooleanField(),
'resources': object_fields.FlexibleDictField(nullable=True),
'extra_specs': object_fields.FlexibleDictField(nullable=True),
'resource_traits': object_fields.FlexibleDictField(nullable=True),
'projects': object_fields.ListOfStringsField(),
}

View File

@ -39,14 +39,16 @@ class TestFlavor(v1_test.APITestV1):
def test_flavor_post(self):
body = {"name": "test", "description": "just test",
"extra_specs": {"k1": "v1"}}
"resources": {"CUSTOM_GOLD": 1},
"resource_traits": {"CUSTOM_GOLD": "FPGA"}}
resp = self.post_json(
'/flavors', body, headers=self.headers, status=201)
resp = resp.json
self.assertEqual('test', resp['name'])
self.assertEqual('just test', resp['description'])
self.assertEqual(True, resp['is_public'])
self.assertEqual({'k1': 'v1'}, resp['extra_specs'])
self.assertEqual({'CUSTOM_GOLD': 1}, resp['resources'])
self.assertEqual({'CUSTOM_GOLD': 'FPGA'}, resp['resource_traits'])
self.assertIn('uuid', resp)
self.assertIn('links', resp)
@ -78,11 +80,8 @@ class TestFlavor(v1_test.APITestV1):
self.assertEqual('test0', resp['name'])
self.patch_json('/flavors/' + self.FLAVOR_UUIDS[0],
[{'path': '/name', 'value': 'updated_name',
'op': 'replace'},
{'path': '/extra_specs/k1', 'value': 'v1',
'op': 'add'}],
'op': 'replace'}],
headers=self.headers, status=200)
resp = self.get_json('/flavors/' + self.FLAVOR_UUIDS[0],
headers=self.headers)
self.assertEqual('updated_name', resp['name'])
self.assertEqual({'k1': 'v1'}, resp['extra_specs'])

View File

@ -50,7 +50,8 @@ class BaremetalComputeAPITest(base.BaseBaremetalComputeTest):
# Create a flavor
body = {"name": 'mogan_flavor_create',
"description": "mogan flavor description",
'is_public': True, 'resources': {'gold': 1}}
'is_public': True, 'resources': {'gold': 1},
'resource_traits': {'gold': 'foo'}}
resp = self.baremetal_compute_client.create_flavor(**body)
self.assertEqual('mogan_flavor_create', resp['name'])
self.assertEqual('mogan flavor description',
@ -58,7 +59,7 @@ class BaremetalComputeAPITest(base.BaseBaremetalComputeTest):
self.assertEqual(True, resp['is_public'])
self.assertEqual(False, resp['disabled'])
self.assertEqual({'gold': 1}, resp['resources'])
self.assertEqual({}, resp['extra_specs'])
self.assertEqual({'gold': 'foo'}, resp['resource_traits'])
self.assertIn('uuid', resp)
self.assertIn('links', resp)
self.flavor_ids.append(resp['uuid'])
@ -72,7 +73,7 @@ class BaremetalComputeAPITest(base.BaseBaremetalComputeTest):
self.assertEqual(True, resp['is_public'])
self.assertEqual(False, resp['disabled'])
self.assertEqual({}, resp['resources'])
self.assertEqual({}, resp['extra_specs'])
self.assertEqual({}, resp['resource_traits'])
self.assertIn('uuid', resp)
self.assertIn('links', resp)

View File

@ -166,7 +166,7 @@ def get_test_flavor(**kw):
'name': kw.get('name', 'test'),
'description': kw.get('description', 'test'),
'resources': kw.get('resources', {}),
'extra_specs': kw.get('extra_specs', {}),
'resource_traits': kw.get('resource_traits', {}),
'is_public': kw.get('is_public', 1),
'disabled': kw.get('disabled', 0),
'updated_at': kw.get('updated_at'),

View File

@ -389,7 +389,7 @@ expected_object_fingerprints = {
'ComputePortList': '1.0-33a2e1bb91ad4082f9f63429b77c1244',
'ServerFault': '1.0-74349ff701259e4834b4e9dc2dac1b12',
'ServerFaultList': '1.0-43e8aad0258652921f929934e9e048fd',
'Flavor': '1.0-ed05427767e256d81161ab212bf5e808',
'Flavor': '1.0-f53b71bd4aaaadea0d9284b811a82bb5',
'MyObj': '1.1-aad62eedc5a5cc8bcaf2982c285e753f',
'ServerNic': '1.0-ebbd767c2f6a7f14bd524c6067f2b382',
'ServerNics': '1.0-33a2e1bb91ad4082f9f63429b77c1244',