Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
# Copyright 2015 TrilioData, Inc
# All Rights Reserved.
#

"""Disklist Drive helper."""

import os

try:
    from oslo_config import cfg
except BaseException:
    from oslo.config import cfg

try:
    from oslo_utils import fileutils
except BaseException:
    from nova.openstack.common import fileutils

from nova import utils

diskfiles_drive_format = "iso9660"
mkisofs_cmd = "genisoimage"

# Diskfiles drives are 64mb, if we can't size to the exact size of the data
DISKFILESDRIVESIZE_BYTES = 64 * 1024

diskfilesdrive_opts = [
    cfg.StrOpt(
        "diskfiles_drive_format",
        default="iso9660",
        help="Disk files drive format. One of iso9660 (default) or vfat",
    ),
    # cfg.StrOpt('mkisofs_cmd',
    # default='genisoimage',
    # help='Name and optionally path of the tool used for '
    #'ISO image creation')
]

CONF = cfg.CONF
CONF.register_opts(diskfilesdrive_opts)


class DiskfilesDriveBuilder(object):
    def __init__(self, diskfiles):
        self.diskfiles = diskfiles

    def __enter__(self):
        return self

    def __exit__(self, exctype, excval, exctb):
        if exctype is not None:
            return False
        self.cleanup()

    def _add_file(self, basedir, path, data):
        filepath = os.path.join(basedir, path)
        dirname = os.path.dirname(filepath)
        fileutils.ensure_tree(dirname)
        with open(filepath, "wb") as f:
            f.write(data)

    def _write_disk_files(self, basedir):
        self._add_file(basedir, "diskfiles", self.diskfiles)

    def _make_iso9660(self, path, tmpdir):
        publisher = "%(product)s %(version)s" % {
            "product": "TrilioVault",
            "version": "1.0.",
        }

        utils.execute(
            CONF.mkisofs_cmd,
            "-o",
            path,
            "-ldots",
            "-allow-lowercase",
            "-allow-multidot",
            "-l",
            "-publisher",
            publisher,
            "-quiet",
            "-J",
            "-r",
            "-V",
            "diskdrives-1",
            tmpdir,
            attempts=1,
            run_as_root=False,
        )

    def make_drive(self, path):
        """Make the diskfiles drive.

        :param path: the path to place the diskfiles drive image at

        :raises ProcessExecuteError if a helper process has failed.
        """
        with utils.tempdir() as tmpdir:
            self._write_disk_files(tmpdir)

            if os.path.exists(path):
                os.remove(path)

            self._make_iso9660(path, tmpdir)

    def cleanup(self):
        pass

    def __repr__(self):
        return "<DiskfilesDriveBuilder: " + str(self.mdfiles) + ">"