Merge "Add Flatten Attributes Specification"

This commit is contained in:
Jenkins 2016-11-18 02:24:17 +00:00 committed by Gerrit Code Review
commit 8b213835be
1 changed files with 307 additions and 0 deletions

View File

@ -0,0 +1,307 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
==============================================
Flatten Cluster and ClusterTemplate Attributes
==============================================
Launchpad blueprint:
https://blueprints.launchpad.net/magnum/+spec/flatten-attributes
Including all user-specified attributes in Clusters and ClusterTemplates will
increase flexibility for users during ClusterTemplate definition and Cluster
creation.
Note that this spec only deals with changes to magnum's data model, not
API changes. Please see the NodeGroup spec for these details:
https://blueprints.launchpad.net/magnum/+spec/nodegroups
Problem Description
===================
Clusters rely on attributes from both the magnum Cluster and ClusterTemplate
resources, but the line between attributes that belong in one or the other is
not well-defined. Most attributes make sense where they are, but there will be
times that users will want to capture different attributes in a ClusterTemplate
or specify them during cluster creation. The current system has little
flexibility, with only keypairs able to exist in either.
Use Cases
=========
1. Users that want to specify attributes in ClusterTemplates that they can't
right now, such as node count.
2. Users that want to specify/override attributes when creating a Cluster that
they can't right now, since attributes that come from ClusterTemplates are
currently unchangeable.
Proposed Change
===============
Give both Cluster and ClusterTemplate a copy of all user-specifed attributes.
The python object for ClusterTemplate will work much the same, just with more
attributes available.
The python object for Cluster will no longer (and should not) need to use
attributes from its ClusterTemplate, since it will have all the attributes it
needs and it is possible that some attributes will have been overridden in the
cluster-create request.
For example, `cluster.cluster_template.fixed_network` will become
`cluster.fixed_network`.
Alternatives
============
The shared fields can be added to the existing Cluster and ClusterTemplate
tables. This acheives the same effect, but brings with it the burden of
maintaining two sets of the same fields in different tables.
Data Model Impact
=================
A new database table, ClusterAttributes, will be added. The shared fields will
be moved to this table.
A foreign key to ClusterAttributes will be added to the Cluster and
ClusterTemplate tables. The relationship between Cluster and ClusterAttributes
is one-to-one. The same is true between ClusterTemplate and ClusterAttributes.
That is, Clusters and ClusterTemplates have their own separate copy of cluster
attributes.
Database tables before, with fields that will be shared marked:
cluster:
=================== =======
Attribute Shared?
------------------- -------
id
uuid
project_id
user_id
name
stack_id
status
status_reason
api_address
trust_id
trustee_username
trustee_user_id
trustee_password
coe_version
container_version
ca_cert_ref
magnum_cert_ref
cluster_template_id
node_addresses
master_addresses
create_timeout Yes
discovery_url Yes
node_count Yes
master_count Yes
keypair Yes
=================== =======
cluster_template:
===================== =======
Attribute Shared?
--------------------- -------
id
uuid
project_id
user_id
name
public
apiserver_port Yes
keypair_id Yes
labels Yes
external_network_id Yes
fixed_network Yes
fixed_subnet Yes
network_driver Yes
volume_driver Yes
dns_nameserver Yes
coe Yes
http_proxy Yes
https_proxy Yes
no_proxy Yes
registry_enabled Yes
tls_disabled Yes
insecure_registry Yes
master_lb_enabled Yes
floating_ip_enabled Yes
image_id Yes
flavor_id Yes
docker_volume_size Yes
docker_storage_driver Yes
cluster_distro Yes
server_type Yes
master_flavor_id Yes
===================== =======
Database tables after:
cluster:
- id
- uuid
- project_id
- user_id
- name
- stack_id
- status
- status_reason
- api_address
- trust_id
- trustee_username
- trustee_user_id
- trustee_password
- coe_version
- container_version
- ca_cert_ref
- magnum_cert_ref
- cluster_template_id
- node_addresses
- master_addresses
- FK to cluster_attributes (new)
cluster_template:
- id
- uuid
- project_id
- user_id
- name
- public
- FK to cluster_attributes (new)
cluster_attributes:
- id (new)
- apiserver_port
- create_timeout
- discovery_url
- node_count
- master_count
- keypair_id
- labels
- external_network_id
- fixed_network
- fixed_subnet
- network_driver
- volume_driver
- dns_nameserver
- coe
- http_proxy
- https_proxy
- no_proxy
- registry_enabled
- tls_disabled
- insecure_registry
- master_lb_enabled
- floating_ip_enabled
- image_id
- flavor_id
- docker_volume_size
- docker_storage_driver
- cluster_distro
- server_type
- master_flavor_id
REST API Impact
===============
None
Security Impact
===============
None identified
Notifications Impact
====================
None
Other End-user Impact
=====================
None
Performance Impact
==================
Negligible. Two-table joins should have minimal performance impact. There may
be cases where only the Cluster/ClusterTemplate or ClusterAttributes table
needs to be queried/written that will further offset the small performance
impact or even improve performance since these operations will be dealing with
narrower tables.
Other Deployer Impact
=====================
This change will require a database migration.
Developer Impact
================
Developers will not have to remember which attributes come from ClusterTemplate
because they will all be available in Cluster.
Implementation
==============
Assignee(s)
-----------
Spyros Trigazis (strigazi)
Work Items
----------
1. Database migration to add ClusterAttributes table.
2. Updates to python code.
Dependencies
============
None
Testing
=======
Unit tests will need to be updated, but functional tests will still pass as
this is an internal change.
Documentation Impact
====================
None for this spec, as the changes are internal.
References
==========
None