Add "disable local disks" option to flavors

This feature adds the possibility to define a flavor,
that does not create any ephemeral disks locally on the hypervisor.
If the new flavor key 'local_disks' is set to 'False', users are
"forced" to create a bootable volume to launch an instance from
that flavor.

APIImpact
DocImpact

Change-Id: I52b8d473d86ce471e61a2c3505f6c274ad0643b8
Implements: blueprint flavor-root-disk-none
This commit is contained in:
Tom Patzig 2016-01-27 13:20:11 +01:00
parent 3e9cdd9d02
commit 53d651ed3e
1 changed files with 279 additions and 0 deletions

View File

@ -0,0 +1,279 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
=====================================================
Add support for flavors with no local ephemeral disks
=====================================================
https://blueprints.launchpad.net/nova/+spec/flavor-root-disk-none
This feature adds the possibility to define a flavor,
that does not create any ephemeral disk locally on the hypervisor.
The proposal is to add a new flavor key ``local_disks``.
If ``local_disks`` is set to ``False``, no hypervisor-local root disk
or any other local ephemeral disk will be created.
A bootable volume needs to be created to launch an instance
from that flavor. All other additional disks can only be volume-based,
as well.
Problem description
===================
Currently there is no way to force root disk being on cinder and having
no hypervisor-local ephemeral disks at all.
Setting ``root_gb`` to 0 defaults in creating an ephemeral root disk
with the size of the glance image.
We do not want to have ephemeral disks locally on the hypervisor;
not on a local filesystem nor on a share mounted to /var/lib/nova/instances.
As these shares grow, they become unmaintainable and performance gets worse.
Storing the ephemeral root disk in the hypervisor's local filesystem is also
not a good idea, since consumer data on the root disk often cannot simply
be deleted.
Having more or less all block devices in cinder volumes gives us a unique
and flexible feature set for maintaining block storage of instances and
the instances themselves.
Use Cases
---------
The use case for End Users is to not create ephemeral (root) disks locally on
the hypervisor by accident.
When launching an instance from a flavor with disabled local disks,
the user will be informed to create a bootable volume in order to launch
the instance with that volume. The volume can be an existing one or a new
one, created upon the instance launch request via the block-device parameter.
The end user does not need to worry about disk placement; which impacts
instance migration, data persistence/loss, and/or shared storage performance.
The use case for deployers is to have the ability to prevent customers
from creating ephemeral (root) disks locally on the hypervisor. Deployers do
not have to worry to much about local HV filesystem sizing nor they do not
need to create one big share for /var/lib/nova/instances, which gets mounted on
all hypervisors. As that share grows it gets unmaintainable and performance is
gets worse. They do not have to deal with customer data loss on ephemeral
disks, stored on local hypervisor FS, in case of hypervisor outage.
Proposed change
===============
The scope of the change:
* new flavor key ``local_disks`` in the API
* new boolean column ``local_disks`` for table flavors
* default value for ``local_disks`` is True
* older microversions display value of 0 for ``root_gb``, ``ephemeral_gb`` and
``swap_gb``, if ``local_disks=False``
* newer microversions do not return the keys ``root_gb``, ``ephemeral_gb`` and
``swap_gb``, if ``local_disks=False``
* if ``local_disks=False`` is given ``root_gb``, ``ephemeral_gb`` and
``swap_gb`` are optional
* if ``local_disks=False`` is given ``root_gb``, ``ephemeral_gb`` and
``swap_gb`` are automatically set to 0, given values get ignored
* if ``local_disks`` is omitted or set to True, ``root_gb`` is mandatory again
* error, when flavor create request with ``local_disks=False`` and
``root_gb`` > 0 and/or ``emphemeral_gb`` > 0 and/or ``swap_gb`` > 0
* return descriptive exception, when flavor with ``local_disks=False`` and
requested image larger than given blockdevice layout
* return descriptive exception, when flavor with ``local_disks=False`` and
given block_device parameter includes ``dest_type`` 'local'
* return descriptive exception, when resizing instance from flavor with
``local_disks=True`` to flavor with ``local_disks=False``
* adjust api doc to include detailed description of ``local_disks`` key
* config-drive will not be touched by that change, config-drive will still
reside on local HV disks, like libvirt.xml and console.log do
Alternatives
------------
The alternative is to always boot instances with the additional block_device
parameter and ``dest_type`` 'volume', to make sure (root) disks are on cinder
volumes and no hypervisor-local ephemeral disk gets created.
But this has the downside, that someone might forget it and ephemeral disks
get created locally on the HV.
There is no way to force users, that no ephemeral root disks are being created
on the hypervisor.
Data model impact
-----------------
* add new column ``local_disks`` type boolean to flavor table (default is True)
REST API impact
---------------
* introduce new api microversion which allows 'None' as disk value
* POST v2.1/<tenant_id>/flavors:
::
{
"flavor": {
"name": "flavor_without_local_ephemeral_disks",
"ram": 1024,
"vcpus": 2,
"local_disks": false,
}
}
* flavor show omits ``root_gb``, ``ephemeral_gb`` and ``swap_gb``,
when ``local_disks=False``:
::
{
"flavor": {
"OS-FLV-DISABLED:disabled": false,
"local_disks": false,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
{
"href": "http://openstack.example.com/v2.1/openstack/flavors/1",
"rel": "self"
},
{
"href": "http://openstack.example.com/openstack/flavors/1",
"rel": "bookmark"
}
],
"name": "m1.tiny",
"ram": 512,
"vcpus": 1
}
}
* with older microversions, ``root_gb``, ``ephemeral_gb`` and ``swap_gb`` will
be returned with value 0, when ``local_disks=False``:
::
{
"flavor": {
"OS-FLV-DISABLED:disabled": false,
"local_disks": false,
"disk": 0,
"OS-FLV-EXT-DATA:ephemeral": 0,
"os-flavor-access:is_public": true,
"id": "1",
"links": [
{
"href": "http://openstack.example.com/v2.1/openstack/flavors/1",
"rel": "self"
},
{
"href": "http://openstack.example.com/openstack/flavors/1",
"rel": "bookmark"
}
],
"name": "m1.tiny",
"ram": 512,
"swap": 0,
"vcpus": 1
}
}
* ``root_gb`` is no longer mandatory with ``local_disks=False``
* return 400 error when flavor has ``local_disks=False`` and no BD mapping
given
* return 400 error when flavor has ``local_disks=False`` and ``dest_type``
local given in BD mapping
* return 400 error when flavor has ``local_disks=True`` and instance resize to
flavor ``local_disks=False`` requested
* return 400 error on flavor create, when ``local_disks=False`` and ``root_gb``
and/or ``ephemeral_gb`` and/or ``swap_gb`` given
Security impact
---------------
None
Notifications impact
--------------------
None
Other end user impact
---------------------
End users need to provide a proper blockdevice mapping with ``dest_type``
volume, in order to use a flavor with ``local_disks=False``.
Performance Impact
------------------
None
Other deployer impact
---------------------
If a deployer doesn't want any ephemeral/local disk on the hypervisor nodes,
they just create flavors with ``local_disks=False`` and then all users of that
cloud have to provide a blockdevice mapping with ``dest_type`` 'volume' when
creating an instance.
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
tpatzig
Work Items
----------
* create db column
* create api microversion with new key
* support ``local_disks=False`` for flavor show
* exception handling if ``local_disks=False`` in flavor and request contains
local BD mapping
* adjust flavor unit test
Dependencies
============
None
Testing
=======
* Create flavor with ``local_disks=False``
* Boot instance with such flavor without volume
* Boot instance with such flavor with local BD mapping
* Boot instance with such flavor with volume
Documentation Impact
====================
http://docs.openstack.org/openstack-ops/content/flavors.html
API doc will be updated to include the new flavor option ``local_disks``.
References
==========
None
History
=======
.. list-table:: Revisions
:header-rows: 1
* - Release Name
- Description
* - Newton
- Introduced