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)
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
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)
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))