135 lines
5.5 KiB
Python
135 lines
5.5 KiB
Python
# Copyright 2016 Nexenta Systems, Inc.
|
|
# 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.
|
|
|
|
from oslo_log import log
|
|
|
|
from manila import exception
|
|
from manila.i18n import _
|
|
from manila.share import driver
|
|
from manila.share.drivers.nexenta.ns4 import nexenta_nfs_helper
|
|
from manila.share.drivers.nexenta import options
|
|
|
|
|
|
VERSION = '1.0'
|
|
LOG = log.getLogger(__name__)
|
|
|
|
|
|
class NexentaNasDriver(driver.ShareDriver):
|
|
"""Nexenta Share Driver.
|
|
|
|
Executes commands relating to Shares.
|
|
API version history:
|
|
1.0 - Initial version.
|
|
"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
"""Do initialization."""
|
|
LOG.debug('Initializing Nexenta driver.')
|
|
super(NexentaNasDriver, self).__init__(False, *args, **kwargs)
|
|
self.configuration = kwargs.get('configuration')
|
|
if self.configuration:
|
|
self.configuration.append_config_values(
|
|
options.nexenta_connection_opts)
|
|
self.configuration.append_config_values(
|
|
options.nexenta_nfs_opts)
|
|
self.configuration.append_config_values(
|
|
options.nexenta_dataset_opts)
|
|
self.helper = nexenta_nfs_helper.NFSHelper(self.configuration)
|
|
else:
|
|
raise exception.BadConfigurationException(
|
|
reason=_('Nexenta configuration missing.'))
|
|
|
|
@property
|
|
def share_backend_name(self):
|
|
if not hasattr(self, '_share_backend_name'):
|
|
self._share_backend_name = None
|
|
if self.configuration:
|
|
self._share_backend_name = self.configuration.safe_get(
|
|
'share_backend_name')
|
|
if not self._share_backend_name:
|
|
self._share_backend_name = 'NexentaStor4'
|
|
return self._share_backend_name
|
|
|
|
def do_setup(self, context):
|
|
"""Any initialization the Nexenta NAS driver does while starting."""
|
|
LOG.debug('Setting up the NexentaStor4 plugin.')
|
|
return self.helper.do_setup()
|
|
|
|
def check_for_setup_error(self):
|
|
"""Returns an error if prerequisites aren't met."""
|
|
self.helper.check_for_setup_error()
|
|
|
|
def create_share(self, context, share, share_server=None):
|
|
"""Create a share."""
|
|
LOG.debug('Creating share %s.', share['name'])
|
|
return self.helper.create_filesystem(share)
|
|
|
|
def create_share_from_snapshot(self, context, share, snapshot,
|
|
share_server=None, parent_share=None):
|
|
"""Is called to create share from snapshot."""
|
|
LOG.debug('Creating share from snapshot %s.', snapshot['name'])
|
|
return self.helper.create_share_from_snapshot(share, snapshot)
|
|
|
|
def delete_share(self, context, share, share_server=None):
|
|
"""Delete a share."""
|
|
LOG.debug('Deleting share %s.', share['name'])
|
|
self.helper.delete_share(share['name'])
|
|
|
|
def extend_share(self, share, new_size, share_server=None):
|
|
"""Extends a share."""
|
|
LOG.debug('Extending share %(name)s to %(size)sG.', {
|
|
'name': share['name'], 'size': new_size})
|
|
self.helper.set_quota(share['name'], new_size)
|
|
|
|
def create_snapshot(self, context, snapshot, share_server=None):
|
|
"""Create a snapshot."""
|
|
LOG.debug('Creating a snapshot of share %s.', snapshot['share_name'])
|
|
snap_id = self.helper.create_snapshot(
|
|
snapshot['share_name'], snapshot['name'])
|
|
LOG.info('Created snapshot %s.', snap_id)
|
|
|
|
def delete_snapshot(self, context, snapshot, share_server=None):
|
|
"""Delete a snapshot."""
|
|
LOG.debug('Deleting snapshot %(shr_name)s@%(snap_name)s.', {
|
|
'shr_name': snapshot['share_name'],
|
|
'snap_name': snapshot['name']})
|
|
self.helper.delete_snapshot(snapshot['share_name'], snapshot['name'])
|
|
|
|
def update_access(self, context, share, access_rules, add_rules,
|
|
delete_rules, share_server=None):
|
|
"""Update access rules for given share.
|
|
|
|
:param context: The `context.RequestContext` object for the request
|
|
:param share: Share that will have its access rules updated.
|
|
:param access_rules: All access rules for given share. This list
|
|
is enough to update the access rules for given share.
|
|
:param add_rules: Empty List or List of access rules which should be
|
|
added. access_rules already contains these rules. Not used by this
|
|
driver.
|
|
:param delete_rules: Empty List or List of access rules which should be
|
|
removed. access_rules doesn't contain these rules. Not used by
|
|
this driver.
|
|
:param share_server: Data structure with share server information.
|
|
Not used by this driver.
|
|
"""
|
|
self.helper.update_access(share['name'], access_rules)
|
|
|
|
def _update_share_stats(self, data=None):
|
|
super(NexentaNasDriver, self)._update_share_stats()
|
|
data = self.helper.update_share_stats()
|
|
data['driver_version'] = VERSION
|
|
data['share_backend_name'] = self.share_backend_name
|
|
self._stats.update(data)
|