def snapshot_update_access(self, context, snapshot, access_rules, add_rules, delete_rules, share_server=None): """Update access rules for given snapshot. This driver has two different behaviors according to parameters: 1. Recovery after error - 'access_rules' contains all access_rules, 'add_rules' and 'delete_rules' shall be empty. Previously existing access rules are cleared and then added back according to 'access_rules'. 2. Adding/Deleting of several access rules - 'access_rules' contains all access_rules, 'add_rules' and 'delete_rules' contain rules which should be added/deleted. Rules in 'access_rules' are ignored and only rules from 'add_rules' and 'delete_rules' are applied. :param context: Current context :param snapshot: Snapshot model with snapshot data. :param access_rules: All access rules for given snapshot :param add_rules: Empty List or List of access rules which should be added. access_rules already contains these rules. :param delete_rules: Empty List or List of access rules which should be removed. access_rules doesn't contain these rules. :param share_server: None or Share server model """ helper = self._get_helper(snapshot['share']) access_rules, add_rules, delete_rules = utils.change_rules_to_readonly( access_rules, add_rules, delete_rules) helper.update_access(self.share_server, snapshot['name'], access_rules, add_rules=add_rules, delete_rules=delete_rules)
def snapshot_update_access(self, context, snapshot, access_rules, add_rules, delete_rules, share_server=None): # snapshots are to be mounted in read-only mode, see: # "Add mountable snapshots" on openstack specs. access_rules, _, _ = utils.change_rules_to_readonly( access_rules, [], []) try: self._update_access(snapshot, access_rules, is_snapshot=True) except exception.InvalidShareAccess as e: raise exception.InvalidSnapshotAccess(e)
def revert_to_snapshot(self, context, snapshot, share_access_rules, snapshot_access_rules, share_server=None): share = snapshot['share'] # Temporarily remove all access rules self._get_helper(share).update_access(self.share_server, snapshot['name'], [], [], []) self._get_helper(share).update_access(self.share_server, share['name'], [], [], []) # Unmount the snapshot filesystem self._unmount_device(snapshot) # Unmount the share filesystem self._unmount_device(share) # Merge the snapshot LV back into the share, reverting it snap_lv_name = "%s/%s" % (self.configuration.lvm_share_volume_group, snapshot['name']) self._execute('lvconvert', '--merge', snap_lv_name, run_as_root=True) # Now recreate the snapshot that was destroyed by the merge self._create_snapshot(context, snapshot) # At this point we can mount the share again device_name = self._get_local_path(share) self._mount_device(share, device_name) # Also remount the snapshot device_name = self._get_local_path(snapshot) self._mount_device(snapshot, device_name) # Lastly we add all the access rules back self._get_helper(share).update_access(self.share_server, share['name'], share_access_rules, [], []) snapshot_access_rules, __, __ = utils.change_rules_to_readonly( snapshot_access_rules, [], []) self._get_helper(share).update_access(self.share_server, snapshot['name'], snapshot_access_rules, [], [])