Allow volume operations when shelved

Volume operations are allowed when an instance is
shutdown, paused and even soft deleted, but not when
shelved or shelved_offloaded. This spec will enable them
when shelved and shelved_offloaded as well.

Besides being useful in itself, this is also a first
step towards allowing operations on the boot volume
when shelved.

blueprint volume-ops-when-shelved
APIImpact
Change-Id: I52f32831bad5f5e1ff378c51186ee798dc3efa2e
This commit is contained in:
Paul Murray
2015-11-09 13:07:20 +00:00
committed by Andrea Rosa
parent 5cbabc8de5
commit ae8b1881c6

View File

@@ -0,0 +1,191 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
==============================
Volume Operations When Shelved
==============================
https://blueprints.launchpad.net/nova/+spec/volume-ops-when-shelved
Currently attach, detach and swap volume operations are allowed when
an instance is paused, stopped and soft deleted, but are
not allowed when an instance has been shelved. These operations are
possible when an instance is shelved so we should enable them.
Problem description
===================
The attach, detach and swap volume operations are not allowed when an
instance is in the shelved or shelved_offloaded states. From a user's
perspective this is at odds with the fact these operations can be
performed on instances in other inactive states.
Use Cases
---------
As a cloud user I want to be able to detach volumes from my shelved instance
and use them elsewhere, without having to unshelve the instance first.
As a cloud user I want to be able to perform all the volume operations on
a shelved instance that I can when it is stopped, paused or soft deleted.
Proposed change
===============
Shelved instances can be in one of two possible states: shelved and
shelved_offloaded (ignoring transitions during shelving and unshelving).
When in shelved the instance is still on a host but inactive. When in
shelved_offloaded the instance has been removed from the host and the
resources it was using there are released.
Volume operations on an instance in the shelved state are similar to
any other state when on the host. The operations can be enabled by allowing
them at the compute API for this state. The existing compute manager code
does handle this case already; it is merely disabled in the API.
The shelved_offloaded state is different. In this case the instance is not
on any host, so functions to attach and detach need to be implemented in
the API in the same way that the code to detach volumes for deletion is done.
These will only perform the steps to manage the block device mappings and
register with cinder. Any actual attachment to a host will be completed
when the instance is unshelved as usual.
The compute api attach volume code makes an rpc call to the hosting compute
manager to select a name for the device, which includes a call into the virt
driver. This can not be done when the instance is offloaded
because it is not on a host.
In fact, devices names are set when an instance is booted
and there is no guarantee that a name provided by the user will be
respected. So the new attach method for the shelved_offloaded state will
defer name selection until the instance is unshelved. This avoids the need
to call a compute manager at all.
Alternatives
------------
The only clear alternative is to not allow volumes to be attached or detached
when an instance is shelved.
Data model impact
-----------------
None.
REST API impact
---------------
The attach, detach and swap operations will
be allowed when the instance is in the shelved and shelved_offloaded states.
Instead of returning the existing HTTP error 409 (Conflict)
the return values will be the same as they are for other valid states.
This change will require an API microversion increment.
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:
pmurray
Other contributors:
andrea-rosa-m
Work Items
----------
The following changes will be required:
#. Change the guards on the attach, detach and swap functions in the compute
API to allow them when the instance is in the shelved state.
#. Add functions to attach, detach and swap volumes that are be executed
locally at the API when the instance is in the shelved offloaded state.
#. Add code to handle device names on unshelve (devices attached in
shelved_offloaded will have had name selection deferred to unshelve).
#. Change the guards on the attach, detach and swap functions to allow them
when the instance is in the shelved_offloaded state.
Dependencies
============
This spec is a step towards allowing boot volumes to be attached and
detached when in the shelved_offloaded state (see [1]). But this spec
also provides useful functionality on its own.
This spec adds more opportunity to get race conditions due to
conflicting parallel operations, it is important to note that those races
are not introduced by this change but already exist in nova and they are
going to be addressed by a different change, please see [2] for more
information.
Testing
=======
Most of the attach and detach functionality can be tested with unit tests.
In particular the shelved state is the same as shutdown or stopped.
New unit tests will be needed for the new attach and detach functions in the
shelved offloaded state.
A tempest test will be added to check that the sequence of shelving,
detaching/attaching volumes and then unshelving leads to a running
instance with the expected volumes correctly attached.
Documentation Impact
====================
This spec will affect cloud users. They will now be able to perform volume
operations on shelved instances.
References
==========
[1] https://blueprints.launchpad.net/openstack/?searchtext=detach-boot-volume
[2] https://review.openstack.org/216578
History
=======
.. list-table:: Revisions
:header-rows: 1
* - Release Name
- Description
* - Mitaka
- Introduced