Node aggregates
This spec introduces aggregate concept to Mogan. Change-Id: I371605d56dc41a39f56dad060f640dad6bf0c6b7 Implements: bp node-aggregate
This commit is contained in:
parent
605c0698c0
commit
a533d36231
248
specs/pike/approved/node-aggregate.rst
Normal file
248
specs/pike/approved/node-aggregate.rst
Normal file
@ -0,0 +1,248 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
===============
|
||||
Node Aggregates
|
||||
===============
|
||||
|
||||
https://blueprints.launchpad.net/mogan/+spec/node-aggregate
|
||||
|
||||
This introduces the concept of aggregate into Mogan, which is quite like Nova
|
||||
host aggregate, but we are based on baremetal nodes. Node aggregate allows the
|
||||
partition of baremetal nodes into logical groups for server distribution.
|
||||
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently Mogan only have a concept of availability zones which is for
|
||||
providing isolation and redundancy from other availability zones. We need a
|
||||
mechanism to further partitioning baremetal nodes.
|
||||
|
||||
Use Cases
|
||||
---------
|
||||
|
||||
* As a cloud operator, I want to classify baremetal nodes based on the
|
||||
location like rack, row, cage, zone, DC.
|
||||
|
||||
* As a cloud operator, I want to classify baremetal nodes based on the
|
||||
hardware specs like with GPU, FPGA, ceph storage backend.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
* A new mogan.objects.aggregate.Aggregate object would be added to the object
|
||||
model.
|
||||
|
||||
* Add a set of API that only allow admins to create, delete, and list
|
||||
aggregates, also admins should be able to add nodes to the specific aggregate
|
||||
and remove nodes from it.
|
||||
|
||||
* When do resources update we will cache the resource providers and the map of
|
||||
aggregates with resource providers. Add a node list API for admins which will
|
||||
derive resource providers from the cache.
|
||||
|
||||
* Before scheduling, mogan will handle the flavor resource_aggregates matching
|
||||
with node aggregate metadata, then got a list of aggregates, and pass it to
|
||||
placement with `member_of` parameter when listing resource providers::
|
||||
|
||||
/resource_providers?member_of=in:{agg1_uuid},{agg2_uuid},{agg3_uuid}
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
None
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
The proposed change will be adding the following fields to the aggregate
|
||||
object with their data type and default value for migrations.
|
||||
|
||||
+-----------------------+--------------+
|
||||
| Field Name | Field Type |
|
||||
+=======================+==============+
|
||||
| id | Integer |
|
||||
+-----------------------+--------------+
|
||||
| uuid | UUID |
|
||||
+-----------------------+--------------+
|
||||
| name | String |
|
||||
+-----------------------+--------------+
|
||||
| metadata | DictOfStrings|
|
||||
+-----------------------+--------------+
|
||||
|
||||
For the database schema, the following table constructs would suffice ::
|
||||
|
||||
op.create_table(
|
||||
'aggregates',
|
||||
sa.Column('created_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('updated_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('id', sa.Integer(), nullable=False),
|
||||
sa.Column('uuid', sa.String(length=36), nullable=False),
|
||||
sa.Column('name', sa.String(length=255), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
mysql_ENGINE='InnoDB',
|
||||
mysql_DEFAULT_CHARSET='UTF8'
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
'aggregate_metadata',
|
||||
sa.Column('created_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('updated_at', sa.DateTime(), nullable=True),
|
||||
sa.Column('id', sa.Integer(), primary_key=True, nullable=False),
|
||||
sa.Column('key', sa.String(length=255), nullable=False),
|
||||
sa.Column('value', sa.String(length=255), nullable=False),
|
||||
sa.Column('aggregate_id', sa.Integer(), nullable=False),
|
||||
sa.PrimaryKeyConstraint('id'),
|
||||
sa.ForeignKeyConstraint(['aggregate_id'],
|
||||
['aggregate.id']),
|
||||
mysql_ENGINE='InnoDB',
|
||||
mysql_DEFAULT_CHARSET='UTF8'
|
||||
)
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
- To create a new aggregate, a user will ::
|
||||
|
||||
POST /v1/aggregates
|
||||
|
||||
With a body containing the JSON description of the aggregate.
|
||||
|
||||
JSON Schema::
|
||||
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {"type": "string", "minLength": 1, "maxLength": 255},
|
||||
"metadata": {
|
||||
'type': 'object',
|
||||
'patternProperties': {
|
||||
'^[a-zA-Z0-9-_:. ]{1,255}$': {
|
||||
'type': 'string', 'maxLength': 255
|
||||
}
|
||||
},
|
||||
'additionalProperties': False
|
||||
},
|
||||
},
|
||||
"required": ["name"],
|
||||
"additionalProperties": False,
|
||||
}
|
||||
|
||||
- To list aggregates, a user will ::
|
||||
|
||||
GET /v1/aggregates
|
||||
|
||||
- To show aggregate details, a user will ::
|
||||
|
||||
GET /v1/aggregates/{aggregate_id}
|
||||
|
||||
- To update aggregate, a user will ::
|
||||
|
||||
PATCH /v1/aggregates/{aggregate_id}
|
||||
|
||||
With a body containing the JSON description of the fileds to be updated.
|
||||
|
||||
Example Update Aggregate: JSON request::
|
||||
|
||||
[
|
||||
{
|
||||
"op": "replace",
|
||||
"path": "/name",
|
||||
"value": "foo"
|
||||
},
|
||||
{
|
||||
"op": "add",
|
||||
"path": "/metadata/k1",
|
||||
"value": "v1"
|
||||
}
|
||||
]
|
||||
|
||||
- To delete an aggregate, a user will ::
|
||||
|
||||
DELETE /v1/aggregates/{aggregate_id}
|
||||
|
||||
- To add nodes to an aggregate, a user will ::
|
||||
|
||||
POST /v1/aggregates/{aggregate_id}/nodes
|
||||
|
||||
With a body containing a list of node uuid to be added to the aggregate.
|
||||
|
||||
- To remove node from an aggregate, a user will ::
|
||||
|
||||
DELETE /v1/aggregates/{aggregate_id}/nodes/{node}
|
||||
|
||||
- To get nodes from an aggregate, a user will ::
|
||||
|
||||
GET /v1/aggregates/{aggregate_id}/nodes
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
<niu-zglinux>
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Add aggregate object.
|
||||
* Add APIs that allows an admin to add, remove, and list node aggregates.
|
||||
* Add APIs that allows an admin to add/remove nodes to an aggregate.
|
||||
* Add new CLIs to manage node aggregates.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Unit Testing will be added.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
Docs about node aggregates will be added.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
None
|
Loading…
Reference in New Issue
Block a user