Add Connector to create_export
This spec proposes adding the already existing connector object as a parameter to the driver's create_export method. Change-Id: I4a4447e82953de7fa445b50491a9c80bf3a37310 Implements: blueprint add-create-export-connector
This commit is contained in:
parent
0982dec286
commit
445e49f236
167
specs/liberty/create-export-connector.rst
Normal file
167
specs/liberty/create-export-connector.rst
Normal file
@ -0,0 +1,167 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
==========================================
|
||||
Add connector object to create_export call
|
||||
==========================================
|
||||
|
||||
https://blueprints.launchpad.net/cinder/+spec/add-create-export-connector
|
||||
|
||||
There are a good number of volume drivers in Cinder today, that are using
|
||||
initialize_connection to do the work of exporting a volume as a target
|
||||
to an initiator (nova compute host). One of the reasons that those drivers
|
||||
are doing that, is because the create_export method API doesn't include
|
||||
the connector object being passed in. This spec outlines adding the
|
||||
connector object to the standard volume driver API for create_export.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
There are many drivers in Cinder today that are doing volume target exports
|
||||
inside of initialize_connection, instead of the create_export method.
|
||||
One of the reasons for this is a documented understanding of what the
|
||||
differences between these 2 methods is supposed to be. The other problem
|
||||
that prevents drivers from doing the work inside of create_export, is that
|
||||
create_export is missing the connector object coming from the initiator.
|
||||
Some backends require the connector object, which contains the initiator
|
||||
information, in order to export a target from their array. So, drivers
|
||||
end up moving all of that exporting code into initialize_connection, because
|
||||
that's the only driver call that has the connector object.
|
||||
|
||||
The other issue with Cinder drivers doing the exporting of volume targets
|
||||
in initialize_connection, is that Nova calls initialize_connection repeatedly
|
||||
during other processes not involved with attaching a volume, such as live
|
||||
migration. Nova will call a driver's initialize_connection simply to fetch
|
||||
the connection_information about an exported volume, not because it wants
|
||||
to attach a volume.
|
||||
|
||||
Use Cases
|
||||
=========
|
||||
|
||||
The main use case is attaching a volume. When someone calls Cinder to attach
|
||||
a volume, they eventually call the volume manager's initialize_connection
|
||||
method. The volume manager's initialize_connection method first calls
|
||||
create_export, with the intention of asking the driver to create a target
|
||||
that is exported from the array to an initiator. Then the volume manager
|
||||
calls the driver's initialize_connection to fetch the target information to
|
||||
pass back to the caller, to discover the volume showing up.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
The proposed change is simple. Add the already existing connector object
|
||||
in the call to create_export. This makes the connector object universally
|
||||
available to all drivers during create_export time. Then each driver can
|
||||
eventually be changed by each maintainer to do the target exporting, instead
|
||||
of during initialize_connection time.
|
||||
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
We can do nothing, and ask that each driver maintainer be more careful about
|
||||
doing any creating of exports inside of initialize_connection if they already
|
||||
exist. This basically makes create_export useless and a noop for all of those
|
||||
drivers. I'd rather see every driver use each method as they were intended, so
|
||||
to make reviewing drivers more consistent accross all of Cinder.
|
||||
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
If driver developers move the creating of the exports into create_export,
|
||||
then any calls into initialize_connection should be faster, depending on the
|
||||
driver of course.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
Once the connector object is available inside of create_export, then it's
|
||||
possible for drivers to migrate their existing export creation code from
|
||||
initialize_connection into create_export. Reviewers should also be looking
|
||||
for this in existing and future reviews, and not approving drivers that ignore
|
||||
create_export.
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
walter-boring
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
First is to update the base driver.py's create_export method.
|
||||
Then each other driver that defines create_export will have to accept the
|
||||
new connector object.
|
||||
|
||||
Then the volume manager call to create_export will need to pass the connector.
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Any and all Unit tests will need to be updated to note the new connector
|
||||
object parameter. Driver's unit tests will need to be updated as well.
|
||||
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
None
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
A lot of research has gone into this, due to the efforts of trying to
|
||||
make Nova live migration with cinder volumes work. There is an existing
|
||||
etherpad that talks about the known issues of Nova, Cinder interaction.
|
||||
That etherpad also lists out the Cinder drivers that have potential problems
|
||||
with live migration due to creating exports inside of initialize_connection.
|
||||
|
||||
* https://etherpad.openstack.org/p/CinderNovaAPI
|
Loading…
Reference in New Issue
Block a user