diff options
author | Matt Riedemann <mriedem@us.ibm.com> | 2015-07-28 14:18:26 -0700 |
---|---|---|
committer | Matt Riedemann <mriedem@us.ibm.com> | 2015-08-02 17:45:55 -0700 |
commit | 52be490ef98ffddc59cade7f482afe03f877d87a (patch) | |
tree | 9cbb9257f71963c5879c6de4d656fb831d990772 /nova/virt/libvirt/volume/smbfs.py | |
parent | c10f8a153beb89c053c96033f84fdca20602a03e (diff) | |
download | nova-52be490ef98ffddc59cade7f482afe03f877d87a.tar.gz |
libvirt: move LibvirtSMBFSVolumeDriver into it's own module
Part of blueprint consolidate-libvirt-fs-volume-drivers
Change-Id: I4c7f31e49ec6fb202e24eabe6bcd96d92a748e79
Diffstat (limited to 'nova/virt/libvirt/volume/smbfs.py')
-rw-r--r-- | nova/virt/libvirt/volume/smbfs.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/nova/virt/libvirt/volume/smbfs.py b/nova/virt/libvirt/volume/smbfs.py new file mode 100644 index 0000000000..3df46602b4 --- /dev/null +++ b/nova/virt/libvirt/volume/smbfs.py @@ -0,0 +1,101 @@ +# 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. + +import os +import re + +from oslo_config import cfg + +from nova import paths +from nova import utils +from nova.virt.libvirt import utils as libvirt_utils +from nova.virt.libvirt.volume import remotefs +from nova.virt.libvirt.volume import volume as libvirt_volume + +volume_opts = [ + cfg.StrOpt('smbfs_mount_point_base', + default=paths.state_path_def('mnt'), + help='Directory where the SMBFS shares are mounted on the ' + 'compute node'), + cfg.StrOpt('smbfs_mount_options', + default='', + help='Mount options passed to the SMBFS client. See ' + 'mount.cifs man page for details. Note that the ' + 'libvirt-qemu uid and gid must be specified.'), + ] + +CONF = cfg.CONF +CONF.register_opts(volume_opts, 'libvirt') + + +class LibvirtSMBFSVolumeDriver(libvirt_volume.LibvirtBaseVolumeDriver): + """Class implements libvirt part of volume driver for SMBFS.""" + + def __init__(self, connection): + super(LibvirtSMBFSVolumeDriver, + self).__init__(connection, is_block_dev=False) + self.username_regex = re.compile( + r"(user(?:name)?)=(?:[^ ,]+\\)?([^ ,]+)") + + def _get_device_path(self, connection_info): + smbfs_share = connection_info['data']['export'] + mount_path = self._get_mount_path(smbfs_share) + volume_path = os.path.join(mount_path, + connection_info['data']['name']) + return volume_path + + def _get_mount_path(self, smbfs_share): + mount_path = os.path.join(CONF.libvirt.smbfs_mount_point_base, + utils.get_hash_str(smbfs_share)) + return mount_path + + def get_config(self, connection_info, disk_info): + """Returns xml for libvirt.""" + conf = super(LibvirtSMBFSVolumeDriver, + self).get_config(connection_info, disk_info) + + conf.source_type = 'file' + conf.driver_cache = 'writethrough' + conf.source_path = connection_info['data']['device_path'] + conf.driver_format = connection_info['data'].get('format', 'raw') + return conf + + def connect_volume(self, connection_info, disk_info): + """Connect the volume.""" + smbfs_share = connection_info['data']['export'] + mount_path = self._get_mount_path(smbfs_share) + + if not libvirt_utils.is_mounted(mount_path, smbfs_share): + mount_options = self._parse_mount_options(connection_info) + remotefs.mount_share(mount_path, smbfs_share, + export_type='cifs', options=mount_options) + + device_path = self._get_device_path(connection_info) + connection_info['data']['device_path'] = device_path + + def disconnect_volume(self, connection_info, disk_dev): + """Disconnect the volume.""" + smbfs_share = connection_info['data']['export'] + mount_path = self._get_mount_path(smbfs_share) + remotefs.unmount_share(mount_path, smbfs_share) + + def _parse_mount_options(self, connection_info): + mount_options = " ".join( + [connection_info['data'].get('options') or '', + CONF.libvirt.smbfs_mount_options]) + + if not self.username_regex.findall(mount_options): + mount_options = mount_options + ' -o username=guest' + else: + # Remove the Domain Name from user name + mount_options = self.username_regex.sub(r'\1=\2', mount_options) + return mount_options.strip(", ").split(' ') |