Ejemplo n.º 1
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)
Ejemplo n.º 2
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)
Ejemplo n.º 3
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)
Ejemplo n.º 4
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)
Ejemplo n.º 5
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)