nova/nova/virt/libvirt/volume/scaleio.py
Gaudenz Steinlin eab58069ea Extend volume for libvirt network volumes (RBD)
Implement support for extending RBD attached volumes using the libvirt
network volume driver.

This adds a new parameter "requested_size" to the extend_volume method.
This is necessary because the new volume size can not be detected by
libvirt for network volumes. All other volume types currently
implementing the extend_volume call have a block device on the
hypervisor which needs to be updated and can be polled for it's new
size. For network volumes no such block device exists.

Alternatively this could be implemented without a new parameter by
calling into Ceph using os_brick to get the new size of the volume.
This would make the LibvirtNetVolumeDriver Ceph specific.

This also extends the logic to get the device_path for extending volumes
in the libvirt driver. This is necessary as network volumes don't have
the device path in the connection_info. The device_path is retrieved by
matching the connection_info serial (= volume UUID) against all guest
disks.

Co-Authored-By: Jose Castro Leon <jose.castro.leon@cern.ch>

Blueprint: extend-in-use-rbd-volumes

Change-Id: I5698e451861828a8b1240d046d1610d8d37ca5a2
2019-03-06 16:37:57 +01:00

73 lines
2.8 KiB
Python

# Copyright (c) 2015 EMC Corporation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Libvirt volume driver for ScaleIO."""
from os_brick import initiator
from os_brick.initiator import connector
from oslo_log import log as logging
import nova.conf
from nova import utils
from nova.virt.libvirt.volume import volume as libvirt_volume
LOG = logging.getLogger(__name__)
CONF = nova.conf.CONF
class LibvirtScaleIOVolumeDriver(libvirt_volume.LibvirtBaseVolumeDriver):
"""Class ScaleIO Libvirt volume Driver
Implements Libvirt part of volume driver for ScaleIO cinder driver.
Uses the ScaleIO connector from the os-brick projects
"""
def __init__(self, host):
super(LibvirtScaleIOVolumeDriver, self).__init__(host,
is_block_dev=False)
self.connector = connector.InitiatorConnector.factory(
initiator.SCALEIO, utils.get_root_helper(),
device_scan_attempts=CONF.libvirt.num_volume_scan_tries)
def get_config(self, connection_info, disk_info):
conf = super(LibvirtScaleIOVolumeDriver, self).get_config(
connection_info, disk_info)
conf.source_type = 'block'
conf.source_path = connection_info['data']['device_path']
conf.driver_io = "native"
return conf
def connect_volume(self, connection_info, instance):
device_info = self.connector.connect_volume(connection_info['data'])
LOG.debug("Attached ScaleIO volume %s.", device_info)
connection_info['data']['device_path'] = device_info['path']
def disconnect_volume(self, connection_info, instance):
self.connector.disconnect_volume(connection_info['data'], None)
LOG.debug("Disconnected volume", instance=instance)
super(LibvirtScaleIOVolumeDriver, self).disconnect_volume(
connection_info, instance)
def extend_volume(self, connection_info, instance, requested_size):
LOG.debug("calling os-brick to extend ScaleIO Volume",
instance=instance)
new_size = self.connector.extend_volume(connection_info['data'])
LOG.debug("Extend ScaleIO Volume %s; new_size=%s",
connection_info['data']['device_path'],
new_size, instance=instance)
return new_size