eab58069ea
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
73 lines
2.8 KiB
Python
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
|