Support volume_readonly_update using XML format

Almost all API support JSON and XML format together,
But this API does not support xml format.
In the request of xml format,
the type of parameter "readonly" in the body is string.
In the request of JSON format,
the type of parameter "readonly" in the body is bool.
But the code only support bool, not support string.
This branch is to solve this problem.

Closes-bug #1244848

Change-Id: I7f2b09a0063df9daad3fdd09789f8e19c43b0aa3
Remove duplication of ISCSIDriver in ISERDriver

ISERDriver is almost copy of ISCSIDriver.

Change-Id: I22394c7a3b26b140b19f76e052c98d11ec59145c
Remove dup of LVMISCSIDriver in LVMISERDriver

LVMISERDriver is almost copy of LVMISCSIDriver.

Change-Id: I27f03ba19908184e96d05e7f17e581d906fc119a
Don't use deprecated module commands

The commands module was deprecated since version 2.6 and it has been
removed in Python 3. Use the subprocess module instead.
See http://docs.python.org/2/library/commands#module-commands

Closes-Bug: #1248216
Change-Id: I4091179c6b312ae8534b30adc518eff67d68320a
Nexenta: Remove snapshot after volume-clone deletion.

Detect if volume was created via cloning and remove a snapshot from the
appliance if so. Return 'provider_location' to update the volume DB record
after creating a volume via cloning.

Closes-Bug: #1246079
Change-Id: I6c946d34871119600d7197614f5be22fa926e5dc
RequestContext initialization failed in cinder.

RequestContext initialization failed in cinder because of the following
error:
"TypeError: 'in <string>' requires string as left operand, not NoneType"

It must traverses in tuple not in string when find the "compute"
service_catalog.

Change-Id: I46f4bbd0ffb9d1db8bdcb0254ca95551fea08baf
Closes-Bug: #1248434
Nexenta NFS driver refactoring

Refactor NFS driver, redefined volume_backend_name attribute
inherited from RemoteFsDriver.

Change-Id: I607277053c1233c688dbfaf0c5e150f9511b83af
Report zero capacity if GPFS is unmounted

_get_available_capacity() calls df command to gather the capacity of GPFS
filesystem. If GPFS is unmounted, df command will return the capacity of
root file system. This change will let get_volume_stats() to report zero
capacity, so that Cinder can schedule the volume request to another volume
service After GPFS is mounted again, the correct capacity will be reported.

Change-Id: I4c229d78e7d659604a23a50e6ab46060642b4088
Closes-Bug: #1246779
Do not remove volume silently if GPFS is unmounted

When GPFS is not mounted, delete_volume() will complete successfully, so that
volume record is removed by cinder but volume file still resides on GPFS. This
change will prevent cinder to remove volume when GPFS is not mounted.

Change-Id: Ic3bf265e553f22c8b6a6e3568da04af88fab3322
Closes-Bug: #1249411
Add call to retrieve image metadata for volumes in bulk

When using the GET volume details REST API call, the image metadata API
contribution is making an individual db call for each of the available
volumes. When the number of volumes is large the details call can take
several minutes.

This patch adds a call to the volume.API to retrieve image metadata in
bulk, very similar to the one used to retrieve individual volume image
metadata.

Change-Id: Ic3aa721016704c72b7564cc5ceff71676806a24a
Partial-Bug: #1197612
Retrieve volume image metadata using single query

The image metadata REST API contributions are making an individual db
call for each of the available volumes. When the number of volumes is
large the volume details call can take several minutes.

This patch changes the image metadata API contributions to take
advantage of the new db query to retrieve metadata in bulk.

Change-Id: I9a35438c1f38ea8a3d8f5b687ae58ba1f3f78121
Partial-Bug: #1197612
Fail when image is bigger than the volume

When creating a new volume from a qcow2 image stored in glance, we will
be given the physical size of the image instead of the virtual size.
Most drivers will convert that image to raw after downloading for
resizing it to the requested volume size afterwards.

If the virtual size of the image is bigger than the requested one, the
resulting volume might end up being unusable after the resize even
though the creation went good.

This patch will make the volume creation fail if the virtual size of
the image exceeds the one of the requested volume.

Closes-Bug: #1235358
Change-Id: I254cd9e3acf5d9eb7eb913b37d27a14e97568dec
Nexenta iSCSI driver: extend volume stats of _update_volume_stats

Added location_info to stats provided by _update_volume_stats method
of Nexenta iSCSI volume driver.

Change-Id: Ib947180cb6d08d7639443a8998190ab911d1a4a4
Enable object caching in cinder REST API requests

Allow the core API to cache resources, such as DB results, so that
extensions can use data already retrieved within the same API request
eliminating additional expensive DB calls.

Loosely based on commit 9f9fbc54e7336da10fc3056bdaca2ec7d01c7f94 from
nova.

Change-Id: If9f49faf7305287c0489ad6209cf19b8bec612cc
Partial-Bug: #1197612
Use cached volumes in REST API extensions

This patch caches db volumes in the core volumes API so that they can be
used in the host and tenant attribute API extensions in order to lower
the response time by avoiding costly individual db queries for each
volume in the REST API contributions.

Change-Id: Ie0cbe929379df32fddbdce1953f13b6f26208bff
Partial-Bug: #1197612
Merge "Do not remove volume silently if GPFS is unmounted"
Merge "Report zero capacity if GPFS is unmounted"
Merge "RequestContext initialization failed in cinder."
Do not allow bad keys while updating quota

Raise 400 (bad request) error instead of 200 (ok) if bad keys
are passed to the update quota request

Closes-Bug: #1248815

Change-Id: Iaefaa4961dd3783dfab15f843cbb2dcb12195a7d
Merge "Nexenta: Remove snapshot after volume-clone deletion."