def create_clone(share, new_name, request, logger, snapshot=None): # if snapshot is None, create clone of the share. # If it's not, then clone it. if (re.match(settings.SHARE_REGEX + '$', new_name) is None): e_msg = ('Clone name is invalid. It must start with a letter and can' ' contain letters, digits, _, . and - characters') handle_exception(Exception(e_msg), request) if (Share.objects.filter(name=new_name).exists()): e_msg = ('Another Share with name: %s already exists.' % new_name) handle_exception(Exception(e_msg), request) pool_device = Disk.objects.filter(pool=share.pool)[0].name if (Snapshot.objects.filter(share=share, name=new_name).exists()): e_msg = ('Snapshot with name: %s already exists for the ' 'share: %s. Choose a different name' % (new_name, share.name)) handle_exception(Exception(e_msg), request) try: share_name = share.subvol_name if (snapshot is not None): share_name = snapshot.real_name add_snap(share.pool.name, pool_device, share_name, new_name, share_prepend=False, readonly=False) snap_id = share_id(share.pool.name, pool_device, new_name) qgroup_id = ('0/%s' % snap_id) update_quota(share.pool.name, pool_device, qgroup_id, share.size * 1024) new_share = Share(pool=share.pool, qgroup=qgroup_id, name=new_name, size=share.size, subvol_name=new_name) new_share.save() return Response(ShareSerializer(new_share).data) except Exception, e: handle_exception(e, request)
def _create(self, share, snap_name, request, uvisible, snap_type, writable): if (Snapshot.objects.filter(share=share, name=snap_name).exists()): e_msg = ('Snapshot(%s) already exists for the Share(%s).' % (snap_name, share.name)) handle_exception(Exception(e_msg), request) snap_size = 0 qgroup_id = '0/na' if (snap_type == 'replication'): writable = False add_snap(share.pool, share.subvol_name, snap_name, writable) snap_id = share_id(share.pool, snap_name) qgroup_id = ('0/%s' % snap_id) qgroup_assign(qgroup_id, share.pqgroup, ('%s/%s' % (settings.MNT_PT, share.pool.name))) snap_size, eusage = share_usage(share.pool, qgroup_id) s = Snapshot(share=share, name=snap_name, real_name=snap_name, size=snap_size, qgroup=qgroup_id, uvisible=uvisible, snap_type=snap_type, writable=writable) s.save() return Response(SnapshotSerializer(s).data)
def _create(self, share, snap_name, pool_device, request, uvisible, snap_type, writable): if (Snapshot.objects.filter(share=share, name=snap_name).exists()): e_msg = ('Snapshot(%s) already exists for the Share(%s).' % (snap_name, share.name)) handle_exception(Exception(e_msg), request) real_name = snap_name snap_size = 0 qgroup_id = '0/na' if (snap_type != 'receiver'): if (snap_type == 'replication'): writable = False add_snap(share.pool, pool_device, share.subvol_name, real_name, readonly=not writable) snap_id = share_id(share.pool, pool_device, real_name) qgroup_id = ('0/%s' % snap_id) snap_size = share_usage(share.pool, pool_device, qgroup_id) s = Snapshot(share=share, name=snap_name, real_name=real_name, size=snap_size, qgroup=qgroup_id, uvisible=uvisible, snap_type=snap_type, writable=writable) s.save() return Response(SnapshotSerializer(s).data)
def _create(self, share, snap_name, request, uvisible, snap_type, writable): if (Snapshot.objects.filter(share=share, name=snap_name).exists()): # Note e_msg is consumed by replication/util.py create_snapshot() e_msg = ('Snapshot ({}) already exists for ' 'the share ({}).').format(snap_name, share.name) handle_exception(Exception(e_msg), request) snap_size = 0 qgroup_id = '0/na' if (snap_type == 'replication'): writable = False add_snap(share.pool, share.subvol_name, snap_name, writable) snap_id = share_id(share.pool, snap_name) qgroup_id = ('0/%s' % snap_id) if share.pqgroup is not settings.MODEL_DEFS['pqgroup']: pool_mnt_pt = '{}{}'.format(settings.MNT_PT, share.pool.name) qgroup_assign(qgroup_id, share.pqgroup, pool_mnt_pt) snap_size, eusage = volume_usage(share.pool, qgroup_id) s = Snapshot(share=share, name=snap_name, real_name=snap_name, size=snap_size, qgroup=qgroup_id, uvisible=uvisible, snap_type=snap_type, writable=writable) # The following share.save() was informed by test_snapshot.py share.save() s.save() return Response(SnapshotSerializer(s).data)
def create_clone(share, new_name, request, logger): if (Share.objects.filter(name=new_name).exists()): e_msg = ('Share with name: %s already exists.' % new_name) handle_exception(Exception(e_msg), request) pool_device = Disk.objects.filter(pool=share.pool)[0].name snap_name = ('%s-clone-%s-snapshot' % (share.name, new_name)) if (Snapshot.objects.filter(share=share, name=snap_name).exists()): e_msg = ('Snapshot with name: %s already exists for the ' 'share: %s' % (snap_name, share.name)) handle_exception(Exception(e_msg), request) try: add_snap(share.pool.name, pool_device, share.subvol_name, snap_name, share_prepend=False) snap_id = share_id(share.pool.name, pool_device, snap_name) qgroup_id = ('0/%s' % snap_id) update_quota(share.pool.name, pool_device, qgroup_id, share.size * 1024) new_share = Share(pool=share.pool, qgroup=qgroup_id, name=new_name, size=share.size, subvol_name=snap_name) new_share.save() return Response(ShareSerializer(new_share).data) except Exception, e: e_msg = ('Failed to create clone due to a system error.') logger.error(e_msg) logger.exception(e) handle_exception(Exception(e_msg), request)
def _create(self, share, snap_name, request, uvisible, snap_type, writable): if Snapshot.objects.filter(share=share, name=snap_name).exists(): # Note e_msg is consumed by replication/util.py create_snapshot() e_msg = ("Snapshot ({}) already exists for the share ({}).").format( snap_name, share.name ) handle_exception(Exception(e_msg), request) snap_size = 0 qgroup_id = "0/na" if snap_type == "replication": writable = False add_snap(share, snap_name, writable) snap_id = share_id(share.pool, snap_name) qgroup_id = "0/{}".format(snap_id) if share.pqgroup != settings.MODEL_DEFS["pqgroup"]: qgroup_assign(qgroup_id, share.pqgroup, share.pool.mnt_pt) snap_size, eusage = volume_usage(share.pool, qgroup_id) s = Snapshot( share=share, name=snap_name, real_name=snap_name, size=snap_size, qgroup=qgroup_id, uvisible=uvisible, snap_type=snap_type, writable=writable, ) # The following share.save() was informed by test_snapshot.py share.save() s.save() return Response(SnapshotSerializer(s).data)
def _create(self, share, snap_name, pool_device, request, uvisible, snap_type, writable): if (Snapshot.objects.filter(share=share, name=snap_name).exists()): e_msg = ('Snapshot with name: %s already exists for the ' 'share: %s' % (snap_name, share.name)) handle_exception(Exception(e_msg), request) try: real_name = ('%s_%s' % (share.name, snap_name)) snap_size = 0 qgroup_id = '0/na' if (snap_type != 'receiver'): add_snap(share.pool.name, pool_device, share.subvol_name, real_name, share_prepend=False, readonly=not writable) snap_id = share_id(share.pool.name, pool_device, real_name) qgroup_id = ('0/%s' % snap_id) snap_size = share_usage(share.pool.name, pool_device, qgroup_id) s = Snapshot(share=share, name=snap_name, real_name=real_name, size=snap_size, qgroup=qgroup_id, uvisible=uvisible, snap_type=snap_type, writable=writable) s.save() return Response(SnapshotSerializer(s).data) except Exception, e: e_msg = ('Failed to create snapshot due to a system error.') logger.error(e_msg) logger.exception(e) handle_exception(Exception(e_msg), request)
def _create(self, share, snap_name, pool_device, request, uvisible, snap_type): if (Snapshot.objects.filter(share=share, name=snap_name).exists()): e_msg = ('Snapshot with name: %s already exists for the ' 'share: %s' % (snap_name, share.name)) handle_exception(Exception(e_msg), request) try: real_name = ('%s_%s' % (share.name, snap_name)) snap_size = 0 qgroup_id = '0/na' if (snap_type != 'receiver'): add_snap(share.pool.name, pool_device, share.subvol_name, real_name, share_prepend=False) snap_id = share_id(share.pool.name, pool_device, real_name) qgroup_id = ('0/%s' % snap_id) snap_size = share_usage(share.pool.name, pool_device, qgroup_id) s = Snapshot(share=share, name=snap_name, real_name=real_name, size=snap_size, qgroup=qgroup_id, uvisible=uvisible, snap_type=snap_type) s.save() return Response(SnapshotSerializer(s).data) except Exception, e: e_msg = ('Failed to create snapshot due to a system error.') logger.error(e_msg) logger.exception(e) handle_exception(Exception(e_msg), request)
def post(self, request, sname): snap_name = request.DATA['name'] share = Share.objects.get(name=sname) pool_device = Disk.objects.filter(pool=share.pool)[0].name s = Snapshot(share=share, name=snap_name) add_snap(share.pool.name, pool_device, sname, snap_name) s.save() return Response(SnapshotSerializer(s).data)
def _create(self, share, snap_name, request, uvisible, snap_type, writable): if (Snapshot.objects.filter(share=share, name=snap_name).exists()): e_msg = ('Snapshot(%s) already exists for the Share(%s).' % (snap_name, share.name)) handle_exception(Exception(e_msg), request) snap_size = 0 qgroup_id = '0/na' if (snap_type == 'replication'): writable = False add_snap(share.pool, share.subvol_name, snap_name, writable) snap_id = share_id(share.pool, snap_name) qgroup_id = ('0/%s' % snap_id) qgroup_assign(qgroup_id, share.pqgroup, ('%s/%s' % (settings.MNT_PT, share.pool.name))) snap_size, eusage = volume_usage(share.pool, qgroup_id) s = Snapshot(share=share, name=snap_name, real_name=snap_name, size=snap_size, qgroup=qgroup_id, uvisible=uvisible, snap_type=snap_type, writable=writable) s.save() return Response(SnapshotSerializer(s).data)
def post(self, request, sname, snap_name, command=None): share = self._validate_share(sname, request) pool_device = Disk.objects.filter(pool=share.pool)[0].name if (command is None): if (Snapshot.objects.filter(share=share, name=snap_name).exists()): e_msg = ('Snapshot with name: %s already exists for the ' 'share: %s' % (snap_name, sname)) handle_exception(Exception(e_msg), request) add_snap(share.pool.name, pool_device, share.subvol_name, snap_name) snap_id = share_id(share.pool.name, pool_device, snap_name) qgroup_id = ('0/%s' % snap_id) s = Snapshot(share=share, name=snap_name, qgroup=qgroup_id) s.save() return Response(SnapshotSerializer(s).data) if (command == 'rollback'): try: snap = Snapshot.objects.get(share=share, name=snap_name) except: e_msg = ('Snapshot with name: %s does not exist for the ' 'share: %s' % (snap_name, sname)) handle_exception(Exception(e_msg), request) try: rollback_snap(snap_name, sname, share.subvol_name, share.pool.name, pool_device) share.subvol_name = snap_name update_quota(share.pool.name, pool_device, snap.qgroup, share.size * 1024) share.qgroup = snap.qgroup share.save() snap.delete() return Response() except Exception, e: logger.exception(e) handle_exception(e, request)