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    
workloadmgr / usr / lib / python3 / dist-packages / workloadmgr / post_install.py
Size: Mime:
import os
import pwd
import sys
import configparser
import subprocess
import fnmatch
from pathlib import Path
from distutils.dir_util import copy_tree
from distutils.sysconfig import (
    EXEC_PREFIX,
    get_python_lib,
)
import jinja2
from workloadmgr.openstack.common import setup as common_setup

requires = common_setup.parse_requirements()
depend_links = common_setup.parse_dependency_links()
project = 'workloadmgr'
services_dir = '/etc/triliovault-wlm'
config_dir = '/etc/triliovault-wlm'
log_dir = '/var/log/triliovault'
signin_dir = '/var/cache/workloadmgr'
mount_dirs = ['/var/triliovault-mounts', '/var/triliovault']
template_files = {
    "wlm-api.service": "templates/wlm-api.service.j2",
    "wlm-cron.service": "templates/wlm-cron.service.j2",
    "wlm-scheduler.service": "templates/wlm-scheduler.service.j2",
    "wlm-workloads.service": "templates/wlm-workloads.service.j2"
}
log_files = ['workloadmgr-api.log',
             'workloadmgr-cron.log',
             'workloadmgr-scheduler.log',
             'workloadmgr-workloads.log'
             ]


# Gets the user info from the linux passwd db such as u_id, g_id, home dir etc.
# and return the u_id, g_id
def get_user_info(user_name):
    try:
        user_info = pwd.getpwnam(user_name)
        u_id = user_info.pw_uid
        g_id = user_info.pw_gid
    except KeyError:
        u_id = 162  # nova u_id
        g_id = 162  # nova g_id
    return u_id, g_id


# Recursive search for a file root path
def find(pattern, path):
    for root, dirs, files in os.walk(path):
        for name in files:
            if fnmatch.fnmatch(name, pattern):
                return root


# Recursive chown
def _chown(s_dir, u_id, g_id):
    os.chown(s_dir, u_id, g_id)
    for root, dirs, files in os.walk(s_dir):
        for dir in dirs:
            os.chown(os.path.join(root, dir), u_id, g_id)
        for file in files:
            os.chown(os.path.join(root, file), u_id, g_id)


# Set config parameters
def set_config_param(bin_path):

    config = configparser.ConfigParser()
    config_file = './etc/triliovault-wlm/triliovault-wlm.conf'
    config.read(config_file)
    config['DEFAULT']['wlm_rootwrap'] = '%s/workloadmgr-rootwrap' % (bin_path)

    with open(config_file, 'w') as configfile:
        config.write(configfile)


# Build and set guestfs appliance
def build_guestfs(path):
    # Build guestfs appliance at desired path
    bin_file = 'libguestfs-make-fixed-appliance'
    bin_path = find(bin_file, '/usr')
    build_cmd = 'sudo %s %s' % (bin_path + os.path.sep + bin_file, path)
    subprocess.run(build_cmd.split())

    # include the sys dist-package location to the current env
    lib_path = find('libguestfsmod*.so', '/usr')
    pth_file = get_python_lib() + os.path.sep + 'wlmfs.pth'
    with open(pth_file, 'w') as _file:
        _file.write("%s\n" % (lib_path))


# Post installation script to minimize manual intervention
def _post_install():
    print('POST INSTALLATION')

    binary_path = os.path.abspath(os.path.join(sys.executable, os.pardir))
    bin_paths = ['%s/bin' % (EXEC_PREFIX),
                 '%s/local/bin' % (EXEC_PREFIX)]

    for path in bin_paths:
        if os.path.isfile('%s/workloadmgr-api' % (path)):
            binary_path = path
            break

    config_parameters = {'exec_path': binary_path}

    Path(services_dir).mkdir(exist_ok=True)
    Path(config_dir).mkdir(exist_ok=True)
    u_id, g_id = get_user_info('nova')

    print("Creating service files from templates...")
    env = jinja2.Environment(
        loader=jinja2.FileSystemLoader(searchpath="."),
        trim_blocks=True,
        autoescape=True,
        lstrip_blocks=True)
    for serv_file, temp_file in template_files.items():
        template = env.get_template(temp_file)
        result = template.render(config_parameters)
        if result:
            with open(os.path.join(services_dir, serv_file), "w") as f:
                f.write(result)

    print("Setting config parmaters")
    set_config_param(binary_path)

    print("Copying config files")
    copy_tree('./etc/triliovault-wlm', config_dir)
    _chown(config_dir, u_id, g_id)

    print("Creating log files")
    Path(log_dir).mkdir(exist_ok=True)
    for log_file in log_files:
        Path('%s/%s' % (log_dir, log_file)).touch(exist_ok=True)
    _chown(log_dir, u_id, g_id)

    print("Creating mount directories")
    for mount_dir in mount_dirs:
        Path(mount_dir).mkdir(exist_ok=True)
        _chown(mount_dir, u_id, g_id)

    print("Creating signin directory")
    Path(signin_dir).mkdir(exist_ok=True)
    _chown(signin_dir, u_id, g_id)

    print("POST INSTALLATION DONE")

if __name__ == '__main__':
    _post_install()