def _load_plugin_package_json(tar_source): if not tarfile.is_tarfile(tar_source): raise manager_exceptions.InvalidPluginError( 'the provided tar archive can not be read.') with tarfile.open(tar_source) as tar: tar_members = tar.getmembers() # a wheel plugin will contain exactly one sub directory if not tar_members: raise manager_exceptions.InvalidPluginError( 'archive file structure malformed. expecting exactly one ' 'sub directory; got none.') package_json_path = os.path.join(tar_members[0].name, 'package.json') try: package_member = tar.getmember(package_json_path) except KeyError: raise manager_exceptions. \ InvalidPluginError("'package.json' was not found under {0}" .format(package_member)) try: package_json = tar.extractfile(package_member) except (tarfile.ExtractError, tarfile.EnvironmentError) as e: raise manager_exceptions. \ InvalidPluginError(str(e)) try: return json.load(package_json) except ValueError as e: raise manager_exceptions. \ InvalidPluginError("'package.json' is not a valid json: " "{json_str}. error is {error}" .format(json_str=package_json.read(), error=str(e)))
def _prepare_and_process_doc(self, data_id, file_server_root, archive_target_path, **kwargs): # support previous implementation wagon_target_path = archive_target_path # handle the archive_target_path, which may be zip or wagon if not self._is_wagon_file(archive_target_path): if not zipfile.is_zipfile(archive_target_path): raise manager_exceptions.InvalidPluginError( 'input can be only a wagon or a zip file.') archive_name = unzip(archive_target_path, logger=current_app.logger) os.remove(archive_target_path) shutil.move(archive_name, archive_target_path) try: wagon_target_path, _ = \ self._verify_archive(archive_target_path) except RuntimeError as re: raise manager_exceptions.InvalidPluginError(re.message) args = get_args_and_verify_arguments([ Argument('title'), Argument('private_resource', type=boolean), Argument('visibility')]) visibility = kwargs.get(_VISIBILITY, None) new_plugin = self._create_plugin_from_archive(data_id, args.title, wagon_target_path, args.private_resource, visibility) filter_by_name = {'package_name': new_plugin.package_name} sm = get_resource_manager().sm plugins = sm.list(Plugin, filters=filter_by_name) for plugin in plugins: if plugin.archive_name == new_plugin.archive_name: raise manager_exceptions.ConflictError( 'a plugin archive by the name of {archive_name} already ' 'exists for package with name {package_name} and version ' '{version}'.format(archive_name=new_plugin.archive_name, package_name=new_plugin.package_name, version=new_plugin.package_version)) if is_plugin_installing(new_plugin, plugin): raise manager_exceptions.ConflictError( 'a plugin archive by the name of {archive_name} for ' 'package with name {package_name} and version {version} ' 'is currently being installed'.format( archive_name=new_plugin.archive_name, package_name=new_plugin.package_name, version=new_plugin.package_version)) dest_path = new_plugin.archive_name new_plugin.archive_name = '{0}{1}'.format(INSTALLING_PREFIX, new_plugin.archive_name) sm.put(new_plugin) return new_plugin, dest_path
def _load_plugin_package_json(wagon_source): if wagon.validate(wagon_source): # wagon returns a list of validation issues. raise manager_exceptions.InvalidPluginError( 'the provided wagon can not be read.') return wagon.show(wagon_source)
def _load_plugin_package_json(wagon_source): # Disable validation for now - seems to break in certain # circumstances. # if wagon.validate(wagon_source): # # wagon returns a list of validation issues. # raise manager_exceptions.InvalidPluginError( # 'the provided wagon can not be read.') try: return wagon.show(wagon_source) except wagon.WagonError as e: raise manager_exceptions.InvalidPluginError( 'The provided wagon archive can not be read.\n{0}'.format( e.message))
def _prepare_and_process_doc(self, data_id, file_server_root, archive_target_path, **kwargs): # support previous implementation wagon_target_path = archive_target_path # handle the archive_target_path, which may be zip or wagon if not self._is_wagon_file(archive_target_path): if not zipfile.is_zipfile(archive_target_path): raise manager_exceptions.InvalidPluginError( 'input can be only a wagon or a zip file.') archive_name = unzip(archive_target_path, logger=current_app.logger) os.remove(archive_target_path) shutil.move(archive_name, archive_target_path) wagon_target_path, _ = self._verify_archive(archive_target_path) args = self._get_args() visibility = kwargs.get('visibility', None) new_plugin = self._create_plugin_from_archive(data_id, wagon_target_path, args.private_resource, visibility) filter_by_name = {'package_name': new_plugin.package_name} sm = get_resource_manager().sm plugins = sm.list(Plugin, filters=filter_by_name) for plugin in plugins: if plugin.archive_name == new_plugin.archive_name: raise manager_exceptions.ConflictError( 'a plugin archive by the name of {archive_name} already ' 'exists for package with name {package_name} and version ' '{version}'.format(archive_name=new_plugin.archive_name, package_name=new_plugin.package_name, version=new_plugin.package_version)) sm.put(new_plugin) return new_plugin, new_plugin.archive_name