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)
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
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)
Beispiel #6
0
    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)
Beispiel #7
0
    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)
Beispiel #8
0
    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 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)
Beispiel #10
0
 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)
Beispiel #11
0
    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)
Beispiel #12
0
    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)
Beispiel #13
0
    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)