예제 #1
0
def _install_managed_plugin(plugin, args):
    dst_dir = target_plugin_prefix(
        name=plugin.package_name,
        tenant_name=ctx.tenant_name,
        version=plugin.package_version
    )
    with _lock(dst_dir):
        if is_already_installed(dst_dir, plugin.id):
            ctx.logger.info(
                'Using existing installation of managed plugin: %s [%s]',
                plugin.id, _get_plugin_description(plugin))
            return

        ctx.logger.info(
            'Installing managed plugin: %s [%s]',
            plugin.id, _get_plugin_description(plugin))
        _make_virtualenv(dst_dir)
        try:
            _wagon_install(plugin, venv=dst_dir, args=args)
            with open(os.path.join(dst_dir, 'plugin.id'), 'w') as f:
                f.write(plugin.id)
        except Exception as e:
            shutil.rmtree(dst_dir, ignore_errors=True)
            tpe, value, tb = sys.exc_info()
            exc = NonRecoverableError(
                'Failed installing managed plugin: {0} [{1}][{2}]'
                .format(plugin.id, plugin, e))
            reraise(NonRecoverableError, exc, tb)
예제 #2
0
def uninstall(plugin, deployment_id=None):
    name = plugin.get('package_name') or plugin['name']
    dst_dir = target_plugin_prefix(
        name=name,
        tenant_name=ctx.tenant_name,
        version=plugin['package_version'],
        deployment_id=deployment_id
    )
    ctx.logger.info('uninstalling %s', dst_dir)
    if os.path.isdir(dst_dir):
        shutil.rmtree(dst_dir, ignore_errors=True)
    lock_file = '{0}.lock'.format(dst_dir)
    if os.path.exists(lock_file):
        try:
            os.remove(lock_file)
        except OSError as e:
            if e.errno != errno.ENOENT:
                raise

    parent_dir = os.path.dirname(dst_dir)
    try:
        if not os.listdir(parent_dir):
            shutil.rmtree(parent_dir, ignore_errors=True)
    except OSError as e:
        if e.errno != errno.ENOENT:
            raise
예제 #3
0
def test_install_from_wagon_already_exists_missing_plugin_id(
        file_server, test_plugins):
    test_install_from_wagon(test_plugins, file_server)
    plugin_dir = target_plugin_prefix(name=plugins.PACKAGE_NAME,
                                      version=plugins.PACKAGE_VERSION,
                                      tenant_name='default_tenant')
    plugin_id_path = os.path.join(plugin_dir, 'plugin.id')
    os.remove(plugin_id_path)
    # the installation here should identify a plugin.id missing
    # and re-install the plugin
    with pytest.raises(exceptions.PluginInstallationError,
                       match='.*corrupted state.*'):
        test_install_from_wagon(test_plugins, file_server)
예제 #4
0
def _install_source_plugin(deployment_id, plugin, source, args):
    name = plugin.get('package_name') or plugin['name']
    dst_dir = target_plugin_prefix(name=name,
                                   tenant_name=ctx.tenant_name,
                                   version=plugin.get('package_version'),
                                   deployment_id=deployment_id)
    with _lock(dst_dir):
        if is_already_installed(dst_dir, 'source-{0}'.format(deployment_id)):
            ctx.logger.info('Using existing installation of source plugin: %s',
                            name)
            return

        ctx.logger.info('Installing plugin from source: %s', name)
        _make_virtualenv(dst_dir)
        try:
            _pip_install(source=source, venv=dst_dir, args=args)
        except Exception:
            shutil.rmtree(dst_dir, ignore_errors=True)
            raise
        with open(os.path.join(dst_dir, 'plugin.id'), 'w') as f:
            f.write('source-{0}'.format(deployment_id))