Пример #1
0
 def run_audit(self, volume, lock=None, callback=None):
     spawn(lock,
           self.audit,
           volume,
           callback=callback,
           skip_fork=self.skip_fork,
           interruptible=True)
Пример #2
0
    def delete(self, volume_id, callback=None, lock=None):
        volume = self.get(volume_id)
        # If origin exists, this volume is a snapshot
        if volume['origin']:
            # scrub and remove snapshots synchronously
            self.remove_lvm_snapshot(volume)
            return

        # This is a normal volume delete
        if 'zero' not in volume['id']:
            # Does this volume have a snapshot?
            if self._get_snapshot(volume['id']):
                raise ServiceUnavailable("Refusing to delete volume '%s' "
                                         "with an active backup" %
                                         volume['id'])
            try:
                self.update_tags(volume, {'zero': True})
            except NotFound:
                pass
            volume = self.get(volume_id)
        spawn(lock,
              self.remove_lvm_volume,
              volume,
              callback=callback,
              skip_fork=self.skip_fork)
Пример #3
0
 def delete(self, volume, backup_id, callback=None, lock=None):
     spawn(lock,
           self.prune,
           volume,
           backup_id,
           callback=callback,
           skip_fork=self.skip_fork)
Пример #4
0
 def cleanup_tmp_vol(self, tmp_vol, convert_dir, scrub_callback):
     if not tmp_vol:
         raise ValueError("No tmp_vol")
     if not os.path.exists(tmp_vol['path']):
         raise ValueError("tmp_vol doesn't exist")
     if convert_dir:
         execute('umount', convert_dir)
         rmtree(convert_dir)
     spawn(NullResource(), self.remove_lvm_volume, tmp_vol,
           callback=scrub_callback, skip_fork=self.skip_fork)
Пример #5
0
 def cleanup_tmp_vol(self, tmp_vol, convert_dir, scrub_callback):
     if not tmp_vol:
         raise ValueError("No tmp_vol")
     if not os.path.exists(tmp_vol['path']):
         raise ValueError("tmp_vol doesn't exist")
     if convert_dir:
         execute('umount', convert_dir)
         rmtree(convert_dir)
     spawn(NullResource(), self.remove_lvm_volume, tmp_vol,
           callback=scrub_callback, skip_fork=self.skip_fork)
Пример #6
0
 def create(self, snapshot, backup_id, callback=None, lock=None, cinder=None, error_callback=None):
     spawn(
         lock,
         self.save,
         snapshot,
         backup_id,
         cinder,
         callback=callback,
         error_callback=error_callback,
         skip_fork=self.skip_fork,
     )
Пример #7
0
 def create(self,
            snapshot,
            backup_id,
            callback=None,
            lock=None,
            cinder=None,
            error_callback=None):
     spawn(lock,
           self.save,
           snapshot,
           backup_id,
           cinder,
           callback=callback,
           error_callback=error_callback,
           skip_fork=self.skip_fork)
Пример #8
0
    def delete(self, volume_id, callback=None, lock=None):
        volume = self.get(volume_id)
        # If origin exists, this volume is a snapshot
        if volume['origin']:
            # scrub and remove snapshots synchronously
            self.remove_lvm_snapshot(volume)
            return

        # This is a normal volume delete
        if 'zero' not in volume['id']:
            # Does this volume have a snapshot?
            if self._get_snapshot(volume['id']):
                raise ServiceUnavailable(
                    "Refusing to delete volume '%s' "
                    "with an active backup" % volume['id'])
            try:
                self.update_tags(volume, {'zero': True})
            except NotFound:
                pass
            volume = self.get(volume_id)
        spawn(lock, self.remove_lvm_volume, volume,
              callback=callback, skip_fork=self.skip_fork)
Пример #9
0
    def create_clone(self, volume_id, clone_id, iqn, iscsi_ip, iscsi_port,
                     callback=None, lock=None, cinder=None):
        volume = self.get(volume_id)
        size = volume['size'] / 1024 / 1024 / 1024
        logger.info("Cloning source '%s' to volume '%s'" %
                    (volume_id, clone_id))
        snapshot_name = uuid.uuid4()
        snapshot = self.create_snapshot(volume_id, snapshot_name,
                                        clone_id=clone_id, type_='clone')
        logger.info("Snapshot to clone id: '%s'" % snapshot['id'])
        try:
            new_volume = ISCSIDevice(iqn, iscsi_ip, iscsi_port)
            new_volume.connect()
        except (ISCSILoginFailed, ISCSINotConnected):
            msg = "Unable to open iscsi connection to %s:%s - %s" % \
                  (iscsi_ip, iscsi_port, iqn)
            logger.error(msg)
            self.delete(snapshot['id'])
            raise ServiceUnavailable(msg)

        spawn(lock, self._copy_clone, snapshot, clone_id, size, new_volume,
              cinder, callback=callback, skip_fork=self.skip_fork)
Пример #10
0
    def create_clone(self, volume_id, clone_id, iqn, iscsi_ip, iscsi_port,
                     callback=None, lock=None, cinder=None):
        volume = self.get(volume_id)
        size = volume['size'] / 1024 / 1024 / 1024
        logger.info("Cloning source '%s' to volume '%s'" %
                    (volume_id, clone_id))
        snapshot_name = uuid.uuid4()
        snapshot = self.create_snapshot(volume_id, snapshot_name,
                                        clone_id=clone_id, type_='clone')
        logger.info("Snapshot to clone id: '%s'" % snapshot['id'])
        try:
            new_volume = ISCSIDevice(iqn, iscsi_ip, iscsi_port)
            new_volume.connect()
        except (ISCSILoginFailed, ISCSINotConnected):
            msg = "Unable to open iscsi connection to %s:%s - %s" % \
                  (iscsi_ip, iscsi_port, iqn)
            logger.error(msg)
            self.delete(snapshot['id'])
            raise ServiceUnavailable(msg)

        spawn(lock, self._copy_clone, snapshot, clone_id, size, new_volume,
              cinder, callback=callback, skip_fork=self.skip_fork)
Пример #11
0
                raise InvalidImage("Error fetching image: %s" % image_id)

        # Create a tag to apply to the lvm volume
        tag = encode_tag(backup_source_volume_id=backup_source_volume_id,
                         backup_id=backup_id)

        try:
            self._do_create(volume_id, size_str, tag, backup_source_volume_id)
        except Exception, e:
            # If we ran out of space due to the tmp_vol
            logger.error('Failed to create volume: %s' % e)
            # Update cinder immediately.
            if callback:
                callback()
            if tmp_vol:
                spawn(NullResource(), self.remove_lvm_volume, tmp_vol,
                      callback=scrub_callback, skip_fork=self.skip_fork)
            raise

        def log_duration():
            duration = time() - op_start

            parts = ['STAT: Create Volume']
            if volume_id:
                parts.append('Volume_ID: %s' % (volume_id,))
            if backup_id:
                parts.append('Backup_ID: %s' % (backup_id,))
            if backup_source_volume_id:
                parts.append('Backup_Source_Volume_ID: %s' % (backup_id,))
            if image_id:
                parts.append('Image_ID: %s' % (image_id,))
            parts.append('Size: %s' % size)
Пример #12
0
 def run_audit(self, volume, lock=None, callback=None):
     spawn(lock, self.audit, volume, callback=callback,
           skip_fork=self.skip_fork, interruptible=True)
Пример #13
0
 def delete(self, volume, backup_id, callback=None, lock=None):
     spawn(lock, self.prune, volume, backup_id,
           callback=callback, skip_fork=self.skip_fork)
Пример #14
0
        # Create a tag to apply to the lvm volume
        tag = encode_tag(backup_source_volume_id=backup_source_volume_id,
                         backup_id=backup_id)

        try:
            self._do_create(volume_id, size_str, tag, backup_source_volume_id)
        except Exception, e:
            # If we ran out of space due to the tmp_vol
            logger.error('Failed to create volume: %s' % e)
            # Update cinder immediately.
            if callback:
                callback()
            if tmp_vol:
                spawn(NullResource(),
                      self.remove_lvm_volume,
                      tmp_vol,
                      callback=scrub_callback,
                      skip_fork=self.skip_fork)
            raise

        def log_duration():
            duration = time() - op_start

            parts = ['STAT: Create Volume']
            if volume_id:
                parts.append('Volume_ID: %s' % (volume_id, ))
            if backup_id:
                parts.append('Backup_ID: %s' % (backup_id, ))
            if backup_source_volume_id:
                parts.append('Backup_Source_Volume_ID: %s' % (backup_id, ))
            if image_id: