Source code for pacifica.archiveinterface.backends.oracle_hsm_sideband.archive

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""HSM Sideband Backend Archive Module.

Module that implements the abstract_backend_archive class for a HSM Sideband
backend.
"""
import os
import stat
import shutil
from ...archive_utils import un_abs_path
from ...config import get_config
from ...exception import ArchiveInterfaceError
from .extended_file_factory import extended_hsmsideband_factory
from ..abstract.archive import AbstractBackendArchive
from ...id2filename import id2filename


[docs]def path_info_munge(filepath): """Munge the path for this filetype.""" return_path = un_abs_path(id2filename(int(filepath))) return return_path
[docs]class HsmSidebandBackendArchive(AbstractBackendArchive): """HSM Sideband Backend Archive Class. Class that implements the abstract base class for the hsm sideband archive interface backend. """
[docs] def __init__(self, prefix): """Constructor for HSM Sideband Backend Archive.""" super(HsmSidebandBackendArchive, self).__init__(prefix) self._prefix = prefix self._file = None self._fpath = None self._filepath = None # since the database prefix may be different then the system the file is mounted on self._sam_qfs_prefix = get_config().get( 'hsm_sideband', 'sam_qfs_prefix')
[docs] def open(self, filepath, mode): """Open a hsm sideband file.""" # want to close any open files first try: self.close() except ArchiveInterfaceError as ex: err_str = "Can't close previous HSM Sideband file before opening new "\ 'one with error: ' + str(ex) raise ArchiveInterfaceError(err_str) try: self._fpath = un_abs_path(filepath) filename = os.path.join(self._prefix, path_info_munge(self._fpath)) self._filepath = filename # path database refers to, rather then just the file system mount path sam_qfs_path = os.path.join( self._sam_qfs_prefix, path_info_munge(self._fpath)) dirname = os.path.dirname(filename) if not os.path.isdir(dirname): os.makedirs(dirname, 0o755) self._file = extended_hsmsideband_factory( self._filepath, mode, sam_qfs_path) return self except Exception as ex: err_str = "Can't open HSM Sideband file with error: " + str(ex) raise ArchiveInterfaceError(err_str)
[docs] def close(self): """Close a HSM Sideband file.""" try: if self._file: self._file.close() self._file = None except Exception as ex: err_str = "Can't close HSM Sideband file with error: " + str(ex) raise ArchiveInterfaceError(err_str)
[docs] def read(self, blocksize): """Read a HSM Sideband file.""" try: if self._file: return self._file.read(blocksize) except Exception as ex: err_str = "Can't read HSM SIdeband file with error: " + str(ex) raise ArchiveInterfaceError(err_str) err_str = 'Internal file handle invalid' raise ArchiveInterfaceError(err_str)
[docs] def write(self, buf): """Write a HSM Sideband file to the archive.""" try: if self._file: return self._file.write(buf) except Exception as ex: err_str = "Can't write HSM Sideband file with error: " + str(ex) raise ArchiveInterfaceError(err_str) err_str = 'Internal file handle invalid' raise ArchiveInterfaceError(err_str)
[docs] def set_mod_time(self, mod_time): """Set the mod time on a HSM file.""" try: if self._filepath: os.utime(self._filepath, (mod_time, mod_time)) except Exception as ex: err_str = "Can't set HSM Sideband file mod time with error: " + \ str(ex) raise ArchiveInterfaceError(err_str)
[docs] def set_file_permissions(self): """Set the file permissions for a posix file.""" try: if self._filepath: os.chmod(self._filepath, 0o444) except Exception as ex: err_str = "Can't set HSM Sideband file permissions with error: " + \ str(ex) raise ArchiveInterfaceError(err_str)
[docs] def stage(self): """Stage a HSM Sideband file.""" try: if self._file: return self._file.stage() except Exception as ex: err_str = "Can't stage HSM Sideband file with error: " + str(ex) raise ArchiveInterfaceError(err_str) err_str = 'Internal file handle invalid' raise ArchiveInterfaceError(err_str)
[docs] def status(self): """Get the status of a HSM Sideband file.""" try: if self._file: return self._file.status() except Exception as ex: err_str = "Can't get HSM Sideband file status with error: " + \ str(ex) raise ArchiveInterfaceError(err_str) err_str = 'Internal file handle invalid' raise ArchiveInterfaceError(err_str)
[docs] def patch(self, file_id, old_path): """Move a hsm file.""" try: fpath = un_abs_path(file_id) new_filepath = os.path.join(self._prefix, path_info_munge(fpath)) new_directories = os.path.dirname(new_filepath) if not os.path.exists(new_directories): os.makedirs(new_directories) shutil.move(old_path, new_filepath) except Exception as ex: err_str = "Can't move posix file with error: " + str(ex) raise ArchiveInterfaceError(err_str)
[docs] def remove(self): """Remove the file for a posix file.""" try: if self._filepath: os.chmod(self._filepath, stat.S_IWRITE) os.unlink(self._filepath) self._filepath = None except Exception as ex: err_str = "Can't remove posix file with error: " + str(ex) raise ArchiveInterfaceError(err_str)