summaryrefslogtreecommitdiff
path: root/nova/virt/libvirt/volume/smbfs.py
diff options
context:
space:
mode:
authorMatt Riedemann <mriedem@us.ibm.com>2015-07-28 14:18:26 -0700
committerMatt Riedemann <mriedem@us.ibm.com>2015-08-02 17:45:55 -0700
commit52be490ef98ffddc59cade7f482afe03f877d87a (patch)
tree9cbb9257f71963c5879c6de4d656fb831d990772 /nova/virt/libvirt/volume/smbfs.py
parentc10f8a153beb89c053c96033f84fdca20602a03e (diff)
downloadnova-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.py101
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(' ')