예제 #1
0
def install_klever_bridge_development(logger, src_dir):
    logger.info('Install/update development Klever Bridge')

    services = ('klever-bridge-development', 'klever-celery-development', 'klever-celerybeat-development')
    stop_services(logger, services)

    with Cd(os.path.join(src_dir, 'bridge')):
        _install_klever_bridge(logger)

    start_services(logger, services)
예제 #2
0
def install_klever_bridge_production(logger,
                                     src_dir,
                                     deploy_dir,
                                     populate_just_production_presets=True):
    logger.info('Install/update production Klever Bridge')

    services = ('nginx', 'klever-bridge', 'klever-celery', 'klever-celerybeat')
    stop_services(logger, services)

    logger.info('Copy Klever Bridge configuration file for NGINX')
    copy_from = os.path.join(src_dir, 'bridge/conf/nginx')

    if os.path.exists('/etc/nginx/sites-enabled'):
        shutil.copy(copy_from, '/etc/nginx/sites-enabled/klever-bridge.conf')
    else:
        shutil.copy(copy_from, '/etc/nginx/conf.d/klever-bridge.conf')

    logger.info('Install/update Klever Bridge source/binary code')
    shutil.rmtree('/var/www/klever-bridge', ignore_errors=True)
    shutil.copytree(os.path.join(src_dir, 'bridge'),
                    '/var/www/klever-bridge/bridge')
    shutil.copytree(os.path.join(src_dir, 'presets'),
                    '/var/www/klever-bridge/presets')

    logger.info('Prepare media directory')
    media = '/var/www/klever-bridge/bridge/media'
    media_real = os.path.join(os.path.realpath(deploy_dir), 'klever-media')
    shutil.rmtree(media)
    execute_cmd(logger, 'mkdir', '-p', media_real)
    execute_cmd(logger, 'ln', '-s', '-T', media_real, media)

    with Cd('/var/www/klever-bridge/bridge'):
        with open('bridge/settings.py', 'w') as fp:
            fp.write('from bridge.{0} import *\n'.format('production'))
            if not populate_just_production_presets:
                fp.write('POPULATE_JUST_PRODUCTION_PRESETS = False\n')

        _install_klever_bridge(logger)

        logger.info('Collect static files')
        execute_cmd(logger, sys.executable, './manage.py', 'collectstatic',
                    '--noinput')

    # Make available data from media, logs and static for its actual user.
    media_user = get_media_user(logger)
    user_group = '{}:{}'.format(media_user, media_user)

    execute_cmd(logger, 'chown', '-R', user_group, media_real)
    execute_cmd(logger, 'chown', '-R', user_group,
                '/var/www/klever-bridge/bridge/logs')
    execute_cmd(logger, 'chown', '-R', user_group,
                '/var/www/klever-bridge/bridge/static')

    start_services(logger, services)
예제 #3
0
    def _pre_uninstall(self, mode_services):
        services = list(mode_services)
        services.extend(
            ('klever-controller', 'klever-native-scheduler', 'klever-cgroup'))

        if need_verifiercloud_scheduler(self.prev_deploy_info):
            services.append('klever-verifiercloud-scheduler')

        stop_services(self.logger, services, ignore_errors=True)

        self.logger.info('Uninstall systemd services')
        for dirpath, _, filenames in os.walk('/etc/systemd/system'):
            for filename in filenames:
                if filename.startswith('klever'):
                    service = os.path.join(dirpath, filename)
                    self.logger.info('Remove "{0}"'.format(service))
                    os.remove(service)

        klever_env_file = '/etc/default/klever'
        if os.path.exists(klever_env_file):
            self.logger.info('Remove "{0}"'.format(klever_env_file))
            os.remove(klever_env_file)

        # Remove bridge files
        bridge_path = os.path.join(self.args.deployment_directory,
                                   'klever/bridge/bridge')
        for path in ('settings.py', 'db.json', 'rmq.json'):
            path = os.path.join(bridge_path, path)

            if os.path.exists(path):
                self.logger.info('Remove "{0}"'.format(path))
                os.remove(path)

        # Removing individual directories and files rather than the whole deployment directory allows to use standard
        # locations like "/", "/usr" or "/usr/local" for deploying Klever.
        for path in ('klever', 'klever-addons', 'klever-conf', 'klever-work',
                     'klever-media', 'klever.json'):
            path = os.path.join(self.args.deployment_directory, path)
            if os.path.exists(path) or os.path.islink(path):
                self.logger.info('Remove "{0}"'.format(path))
                if os.path.islink(path) or os.path.isfile(path):
                    os.remove(path)
                else:
                    shutil.rmtree(path)

        # Remove deployment directory if it is empty
        if os.path.exists(self.args.deployment_directory) and not os.listdir(
                self.args.deployment_directory):
            self.logger.info('Remove "{0}"'.format(
                self.args.deployment_directory))
            os.rmdir(self.args.deployment_directory)

        # Remove Klever Bridge NGINX configuration if so.
        for klever_bridge_nginx_conf_file in (
                '/etc/nginx/sites-enabled/klever-bridge.conf',
                '/etc/nginx/conf.d/klever-bridge.conf'):
            if os.path.exists(klever_bridge_nginx_conf_file):
                self.logger.info(
                    'Remove "{0}"'.format(klever_bridge_nginx_conf_file))
                os.remove(klever_bridge_nginx_conf_file)
        stop_services(self.logger, ('nginx', ))
        start_services(self.logger, ('nginx', ))

        try:
            pwd.getpwnam('postgres')
        except KeyError:
            # Do nothing if user "postgres" does not exist.
            pass
        else:
            self.logger.info('Delete PostgreSQL database')
            execute_cmd(self.logger,
                        'dropdb',
                        '--if-exists',
                        'klever',
                        username='******')

            self.logger.info('Delete PostgreSQL user')
            execute_cmd(self.logger,
                        'psql',
                        '-c',
                        "DROP USER IF EXISTS klever",
                        username='******')

        try:
            pwd.getpwnam('klever')
        except KeyError:
            # Do nothing if user "klever" does not exist.
            pass
        else:
            self.logger.info('Delete user "klever"')
            execute_cmd(self.logger, 'userdel', 'klever')

        try:
            self.logger.info('Delete RabbitMQ user')
            execute_cmd(self.logger, 'rabbitmqctl', 'delete_user', 'service')
        except (FileNotFoundError, subprocess.CalledProcessError):
            pass

        # Try to remove httpd_t from the list of permissive domains.
        try:
            execute_cmd(self.logger, 'semanage', 'permissive', '-d', 'httpd_t')
        except Exception:
            pass
def configure_controller_and_schedulers(logger, development, src_dir,
                                        deploy_dir, prev_deploy_info):
    logger.info(
        '(Re)configure {0} Klever Controller and Klever schedulers'.format(
            'development' if development else 'production'))

    services = [
        'klever-controller', 'klever-native-scheduler', 'klever-cgroup'
    ]
    if need_verifiercloud_scheduler(prev_deploy_info):
        services.append('klever-verifiercloud-scheduler')
    stop_services(logger, services)

    conf_dir = os.path.join(src_dir, 'klever', 'scheduler', 'conf')
    deploy_dir_abs = os.path.realpath(deploy_dir)

    logger.info('Configure Klever Controller')
    with open(os.path.join(conf_dir, 'controller.json')) as fp:
        controller_conf = json.load(fp)

    controller_conf['common']['working directory'] = os.path.join(
        deploy_dir_abs, 'klever-work/controller')

    controller_conf['Klever Bridge'].update({
        'user': '******',
        'password': '******'
    })

    controller_conf['client-controller']['consul'] = get_klever_addon_abs_path(
        deploy_dir, prev_deploy_info, 'Consul')

    with open(os.path.join(deploy_dir, 'klever-conf/controller.json'),
              'w') as fp:
        json.dump(controller_conf, fp, sort_keys=True, indent=4)

    logger.info('Configure Klever Native Scheduler')
    with open(os.path.join(conf_dir, 'native-scheduler.json')) as fp:
        native_scheduler_conf = json.load(fp)

    native_scheduler_conf['common']['working directory'] = os.path.join(
        deploy_dir_abs, 'klever-work/native-scheduler')
    if development:
        native_scheduler_conf['common']['keep working directory'] = True

    native_scheduler_conf['Klever Bridge'].update({
        'user': '******',
        'password': '******'
    })

    native_scheduler_conf['Klever jobs and tasks queue'].update({
        'username':
        '******',
        'password':
        '******'
    })

    native_scheduler_conf['scheduler'].update({
        'disable CPU cores account':
        True,
        'job client configuration':
        os.path.realpath(
            os.path.join(deploy_dir,
                         'klever-conf/native-scheduler-job-client.json')),
        'task client configuration':
        os.path.realpath(
            os.path.join(deploy_dir,
                         'klever-conf/native-scheduler-task-client.json'))
    })

    if development:
        native_scheduler_conf['scheduler']['keep working directory'] = True

    with open(os.path.join(deploy_dir, 'klever-conf/native-scheduler.json'),
              'w') as fp:
        json.dump(native_scheduler_conf, fp, sort_keys=True, indent=4)

    logger.info('Configure Klever Native Scheduler Job Worker')

    with open(os.path.join(conf_dir, 'job-client.json')) as fp:
        job_client_conf = json.load(fp)

    configure_task_and_job_configuration_paths(deploy_dir, prev_deploy_info,
                                               job_client_conf)

    with open(
            os.path.join(deploy_dir,
                         'klever-conf/native-scheduler-job-client.json'),
            'w') as fp:
        json.dump(job_client_conf, fp, sort_keys=True, indent=4)

    if need_verifiercloud_scheduler(prev_deploy_info):
        logger.info('Configure Klever VerifierCloud Scheduler')
        with open(os.path.join(conf_dir,
                               'verifiercloud-scheduler.json')) as fp:
            verifiercloud_scheduler_conf = json.load(fp)

        verifiercloud_scheduler_conf['common']['working directory'] = \
            os.path.join(deploy_dir_abs, 'klever-work/verifiercloud-scheduler')

        verifiercloud_scheduler_conf['Klever Bridge'].update({
            'user':
            '******',
            'password':
            '******'
        })

        verifiercloud_scheduler_conf['Klever jobs and tasks queue'].update({
            'username':
            '******',
            'password':
            '******'
        })

        verifiercloud_scheduler_conf['scheduler']['web client location'] =\
            get_klever_addon_abs_path(deploy_dir, prev_deploy_info, 'VerifierCloud Client')

        with open(
                os.path.join(deploy_dir,
                             'klever-conf/verifiercloud-scheduler.json'),
                'w') as fp:
            json.dump(verifiercloud_scheduler_conf,
                      fp,
                      sort_keys=True,
                      indent=4)

    logger.info('Configure Klever Native Scheduler Task Worker')

    with open(os.path.join(conf_dir, 'task-client.json')) as fp:
        task_client_conf = json.load(fp)

    configure_task_and_job_configuration_paths(deploy_dir, prev_deploy_info,
                                               task_client_conf)
    verification_backends = task_client_conf['client'][
        'verification tools'] = {}
    for name, desc in prev_deploy_info['Klever Addons'][
            'Verification Backends'].items():
        if desc['name'] not in verification_backends:
            verification_backends[desc['name']] = {}
        verification_backends[desc['name']][desc['version']] = \
            get_klever_addon_abs_path(deploy_dir, prev_deploy_info, name, verification_backend=True)

    with open(
            os.path.join(deploy_dir,
                         'klever-conf/native-scheduler-task-client.json'),
            'w') as fp:
        json.dump(task_client_conf, fp, sort_keys=True, indent=4)

    start_services(logger, services)