コード例 #1
0
ファイル: job.py プロジェクト: mylq/freezer
    def execute(self):
        conf = self.conf
        LOG.info('Executing FS restore...')
        restore_timestamp = None

        restore_abs_path = conf.restore_abs_path
        if conf.restore_from_date:
            restore_timestamp = utils.date_to_timestamp(conf.restore_from_date)
        if conf.backup_media == 'fs':
            self.engine.restore(
                hostname_backup_name=self.conf.hostname_backup_name,
                restore_path=restore_abs_path,
                overwrite=conf.overwrite,
                recent_to_date=restore_timestamp)

            try:
                if conf.consistency_checksum:
                    backup_checksum = conf.consistency_checksum
                    restore_checksum = checksum.CheckSum(restore_abs_path,
                                                         ignorelinks=True)
                    if restore_checksum.compare(backup_checksum):
                        LOG.info('Consistency check success.')
                    else:
                        raise ConsistencyCheckException(
                            "Backup Consistency Check failed: backup checksum "
                            "({0}) and restore checksum ({1}) did not match.".
                            format(backup_checksum, restore_checksum.checksum))
            except OSError as e:
                raise ConsistencyCheckException(
                    "Backup Consistency Check failed: could not checksum file"
                    " {0} ({1})".format(e.filename, e.strerror))
            return {}
        res = restore.RestoreOs(conf.client_manager, conf.container,
                                self.storage)
        if conf.backup_media == 'nova':
            LOG.info("Restoring nova backup. Instance ID: {0}, timestamp: {1}".
                     format(conf.nova_inst_id, restore_timestamp))
            nova_network = None
            if conf.nova_restore_network:
                nova_network = conf.nova_restore_network
            res.restore_nova(conf.nova_inst_id, restore_timestamp,
                             nova_network)
        elif conf.backup_media == 'cinder':
            LOG.info("Restoring cinder backup from glance. Volume ID: {0}, "
                     "timestamp: {1}".format(conf.cinder_vol_id,
                                             restore_timestamp))
            res.restore_cinder_by_glance(conf.cinder_vol_id, restore_timestamp)
        elif conf.backup_media == 'cindernative':
            LOG.info("Restoring cinder native backup. Volume ID {0}, Backup ID"
                     " {1}, timestamp: {2}".format(conf.cindernative_vol_id,
                                                   conf.cindernative_backup_id,
                                                   restore_timestamp))
            res.restore_cinder(conf.cindernative_vol_id,
                               conf.cindernative_backup_id, restore_timestamp)
        else:
            raise Exception("unknown backup type: %s" % conf.backup_media)
        return {}
コード例 #2
0
ファイル: job.py プロジェクト: kenedycpd/HoradeFestejar
    def backup(self, app_mode):
        """

        :type app_mode: freezer.mode.mode.Mode
        :return:
        """
        backup_media = self.conf.backup_media

        time_stamp = utils.DateTime.now().timestamp
        self.conf.time_stamp = time_stamp

        if backup_media == 'fs':
            LOG.info('Path to backup: {0}'.format(self.conf.path_to_backup))
            app_mode.prepare()
            snapshot_taken = snapshot.snapshot_create(self.conf)
            if snapshot_taken:
                app_mode.release()
            try:
                filepath = '.'
                chdir_path = os.path.expanduser(
                    os.path.normpath(self.conf.path_to_backup.strip()))
                if not os.path.exists(chdir_path):
                    msg = 'Path to backup does not exist {0}'.format(
                        chdir_path)
                    LOG.critical(msg)
                    raise IOError(msg)
                if not os.path.isdir(chdir_path):
                    filepath = os.path.basename(chdir_path)
                    chdir_path = os.path.dirname(chdir_path)
                os.chdir(chdir_path)

                # Checksum for Backup Consistency
                if self.conf.consistency_check:
                    ignorelinks = (self.conf.dereference_symlink is None
                                   or self.conf.dereference_symlink == 'hard')
                    consistency_checksum = checksum.CheckSum(
                        filepath, ignorelinks=ignorelinks).compute()
                    LOG.info('Computed checksum for consistency {0}'.format(
                        consistency_checksum))
                    self.conf.consistency_checksum = consistency_checksum

                return self.engine.backup(
                    backup_resource=filepath,
                    hostname_backup_name=self.conf.hostname_backup_name,
                    no_incremental=self.conf.no_incremental,
                    max_level=self.conf.max_level,
                    always_level=self.conf.always_level,
                    restart_always_level=self.conf.restart_always_level)

            finally:
                # whether an error occurred or not, remove the snapshot anyway
                app_mode.release()
                if snapshot_taken:
                    snapshot.snapshot_remove(self.conf, self.conf.shadow,
                                             self.conf.windows_volume)

        backup_os = backup.BackupOs(self.conf.client_manager,
                                    self.conf.container, self.storage)

        if backup_media == 'nova':
            if self.conf.project_id:
                return self.engine.backup_nova_tenant(
                    project_id=self.conf.project_id,
                    hostname_backup_name=self.conf.hostname_backup_name,
                    no_incremental=self.conf.no_incremental,
                    max_level=self.conf.max_level,
                    always_level=self.conf.always_level,
                    restart_always_level=self.conf.restart_always_level)

            elif self.conf.nova_inst_id:
                LOG.info('Executing nova backup. Instance ID: {0}'.format(
                    self.conf.nova_inst_id))

                hostname_backup_name = os.path.join(
                    self.conf.hostname_backup_name, self.conf.nova_inst_id)
                return self.engine.backup(
                    backup_resource=self.conf.nova_inst_id,
                    hostname_backup_name=hostname_backup_name,
                    no_incremental=self.conf.no_incremental,
                    max_level=self.conf.max_level,
                    always_level=self.conf.always_level,
                    restart_always_level=self.conf.restart_always_level)

            else:
                executor = futures.ThreadPoolExecutor(
                    max_workers=len(self.nova_instance_ids))
                futures_list = []
                for instance_id in self.nova_instance_ids:
                    hostname_backup_name = os.path.join(
                        self.conf.hostname_backup_name, instance_id)
                    futures_list.append(
                        executor.submit(
                            self.engine.backup(
                                backup_resource=instance_id,
                                hostname_backup_name=hostname_backup_name,
                                no_incremental=self.conf.no_incremental,
                                max_level=self.conf.max_level,
                                always_level=self.conf.always_level,
                                restart_always_level=self.conf.
                                restart_always_level)))

                futures.wait(futures_list, CONF.timeout)

        elif backup_media == 'cindernative':
            LOG.info('Executing cinder native backup. Volume ID: {0}, '
                     'incremental: {1}'.format(self.conf.cindernative_vol_id,
                                               self.conf.incremental))
            backup_os.backup_cinder(self.conf.cindernative_vol_id,
                                    name=self.conf.backup_name,
                                    incremental=self.conf.incremental)
        elif backup_media == 'cinder':
            if self.conf.cinder_vol_id:
                LOG.info('Executing cinder snapshot. Volume ID: {0}'.format(
                    self.conf.cinder_vol_id))
                backup_os.backup_cinder_by_glance(self.conf.cinder_vol_id)
            else:
                executor = futures.ThreadPoolExecutor(
                    max_workers=len(self.cinder_vol_ids))
                futures_list = []
                for instance_id in self.cinder_vol_ids:
                    LOG.info('Executing cinder snapshot. Volume ID:'
                             ' {0}'.format(instance_id))
                    futures_list.append(
                        executor.submit(
                            backup_os.backup_cinder_by_glance(instance_id)))

                futures.wait(futures_list, CONF.timeout)

        elif backup_media == 'cinderbrick':
            LOG.info('Executing cinder volume backup using os-brick. '
                     'Volume ID: {0}'.format(self.conf.cinderbrick_vol_id))
            return self.engine.backup(
                backup_resource=self.conf.cinderbrick_vol_id,
                hostname_backup_name=self.conf.hostname_backup_name,
                no_incremental=self.conf.no_incremental,
                max_level=self.conf.max_level,
                always_level=self.conf.always_level,
                restart_always_level=self.conf.restart_always_level)
        else:
            raise Exception('unknown parameter backup_media %s' % backup_media)
        return None
コード例 #3
0
    def execute(self):
        conf = self.conf
        LOG.info('Executing Restore...')
        restore_timestamp = None

        restore_abs_path = conf.restore_abs_path
        if conf.restore_from_date:
            restore_timestamp = utils.date_to_timestamp(conf.restore_from_date)
        if conf.backup_media == 'fs':
            self.engine.restore(
                hostname_backup_name=self.conf.hostname_backup_name,
                restore_resource=restore_abs_path,
                overwrite=conf.overwrite,
                recent_to_date=restore_timestamp,
                backup_media=conf.mode)

            try:
                if conf.consistency_checksum:
                    backup_checksum = conf.consistency_checksum
                    restore_checksum = checksum.CheckSum(restore_abs_path,
                                                         ignorelinks=True)
                    if restore_checksum.compare(backup_checksum):
                        LOG.info('Consistency check success.')
                    else:
                        raise ConsistencyCheckException(
                            "Backup Consistency Check failed: backup checksum "
                            "({0}) and restore checksum ({1}) did not match.".
                            format(backup_checksum, restore_checksum.checksum))
            except OSError as e:
                raise ConsistencyCheckException(
                    "Backup Consistency Check failed: could not checksum file"
                    " {0} ({1})".format(e.filename, e.strerror))
            return {}
        res = restore.RestoreOs(conf.client_manager, conf.container,
                                self.storage)
        if conf.backup_media == 'nova':
            if self.conf.project_id:
                return self.engine.restore_nova_tenant(
                    project_id=self.conf.project_id,
                    hostname_backup_name=self.conf.hostname_backup_name,
                    overwrite=conf.overwrite,
                    recent_to_date=restore_timestamp)

            elif conf.nova_inst_id:
                LOG.info("Restoring nova backup. Instance ID: {0}, "
                         "timestamp: {1} network-id {2}".format(
                             conf.nova_inst_id, restore_timestamp,
                             conf.nova_restore_network))
                hostname_backup_name = os.path.join(
                    self.conf.hostname_backup_name, self.conf.nova_inst_id)
                self.engine.restore(hostname_backup_name=hostname_backup_name,
                                    restore_resource=conf.nova_inst_id,
                                    overwrite=conf.overwrite,
                                    recent_to_date=restore_timestamp,
                                    backup_media=conf.mode)

            else:
                for instance_id in self.nova_instance_ids:
                    LOG.info("Restoring nova backup. Instance ID: {0}, "
                             "timestamp: {1} network-id {2}".format(
                                 instance_id, restore_timestamp,
                                 conf.nova_restore_network))
                    hostname_backup_name = os.path.join(
                        self.conf.hostname_backup_name, instance_id)
                    self.engine.restore(
                        hostname_backup_name=hostname_backup_name,
                        restore_resource=instance_id,
                        overwrite=conf.overwrite,
                        recent_to_date=restore_timestamp,
                        backup_media=conf.mode)

        elif conf.backup_media == 'glance':
            if self.conf.project_id:
                return self.engine.restore_glance_tenant(
                    project_id=self.conf.project_id,
                    hostname_backup_name=self.conf.hostname_backup_name,
                    overwrite=conf.overwrite,
                    recent_to_date=restore_timestamp)

            elif conf.glance_image_id:
                LOG.info("Restoring glance backup. Image ID: {0}, "
                         "timestamp: {1} ".format(conf.glance_image_id,
                                                  restore_timestamp))
                hostname_backup_name = os.path.join(
                    self.conf.hostname_backup_name, self.conf.glance_image_id)
                self.engine.restore(hostname_backup_name=hostname_backup_name,
                                    restore_resource=conf.glance_image_id,
                                    overwrite=conf.overwrite,
                                    recent_to_date=restore_timestamp,
                                    backup_media=conf.mode)

            else:
                for image_id in self.glance_image_ids:
                    LOG.info("Restoring glance backup. Image ID: {0}, "
                             "timestamp: {1}".format(image_id,
                                                     restore_timestamp))
                    hostname_backup_name = os.path.join(
                        self.conf.hostname_backup_name, image_id)
                    self.engine.restore(
                        hostname_backup_name=hostname_backup_name,
                        restore_resource=image_id,
                        overwrite=conf.overwrite,
                        recent_to_date=restore_timestamp,
                        backup_media=conf.mode)

        elif conf.backup_media == 'cinder':
            if conf.cinder_vol_id:
                LOG.info("Restoring cinder backup from glance. "
                         "Volume ID: {0}, timestamp: {1}".format(
                             conf.cinder_vol_id, restore_timestamp))
                res.restore_cinder_by_glance(conf.cinder_vol_id,
                                             restore_timestamp)
            else:
                for instance_id in self.cinder_vol_ids:
                    LOG.info("Restoring cinder backup from glance. "
                             "Volume ID: {0}, timestamp: {1}".format(
                                 instance_id, restore_timestamp))
                    res.restore_cinder_by_glance(instance_id,
                                                 restore_timestamp)
        elif conf.backup_media == 'cindernative':
            LOG.info("Restoring cinder native backup. Volume ID {0}, Backup ID"
                     " {1}, timestamp: {2}".format(conf.cindernative_vol_id,
                                                   conf.cindernative_backup_id,
                                                   restore_timestamp))
            res.restore_cinder(conf.cindernative_vol_id,
                               conf.cindernative_backup_id, restore_timestamp)
        elif conf.backup_media == 'cinderbrick':
            LOG.info("Restoring cinder backup using os-brick. Volume ID {0}, "
                     "timestamp: {1}".format(conf.cinderbrick_vol_id,
                                             restore_timestamp))
            self.engine.restore(
                hostname_backup_name=self.conf.hostname_backup_name,
                restore_resource=conf.cinderbrick_vol_id,
                overwrite=conf.overwrite,
                recent_to_date=restore_timestamp,
                backup_media=conf.mode)
        else:
            raise Exception("unknown backup type: %s" % conf.backup_media)
        return {}