def reset_all_metadata_on_installed_repository( self, id ): """Reset all metadata on a single tool shed repository installed into a Galaxy instance.""" invalid_file_tups = [] metadata_dict = {} repository = repository_util.get_installed_tool_shed_repository( self.app, id ) repository_clone_url = common_util.generate_clone_url_for_installed_repository( self.app, repository ) tool_path, relative_install_dir = repository.get_tool_relative_path( self.app ) if relative_install_dir: original_metadata_dict = repository.metadata metadata_dict, invalid_file_tups = \ self.generate_metadata_for_changeset_revision( repository=repository, changeset_revision=repository.changeset_revision, repository_clone_url=repository_clone_url, shed_config_dict = repository.get_shed_config_dict( self.app ), relative_install_dir=relative_install_dir, repository_files_dir=None, resetting_all_metadata_on_repository=False, updating_installed_repository=False, persist=False ) repository.metadata = metadata_dict if metadata_dict != original_metadata_dict: self.update_in_shed_tool_config( repository ) self.app.install_model.context.add( repository ) self.app.install_model.context.flush() log.debug( 'Metadata has been reset on repository %s.' % repository.name ) else: log.debug( 'Metadata did not need to be reset on repository %s.' % repository.name ) else: log.debug( 'Error locating installation directory for repository %s.' % repository.name ) return invalid_file_tups, metadata_dict
def get_repo_info_dict_for_repair(self, rdim, repository): tool_panel_section_key = None repository_clone_url = common_util.generate_clone_url_for_installed_repository( self.app, repository) repository_dependencies = rdim.get_repository_dependencies_for_installed_tool_shed_repository( self.app, repository) metadata = repository.metadata if metadata: tool_dependencies = metadata.get('tool_dependencies', None) tool_panel_section_dict = metadata.get('tool_panel_section', None) if tool_panel_section_dict: # The repository must be in the uninstalled state. The structure of tool_panel_section_dict is: # {<tool guid> : # [{ 'id':<section id>, 'name':<section name>, 'version':<section version>, 'tool_config':<tool config file name> }]} # Here is an example: # {"localhost:9009/repos/test/filter/Filter1/1.1.0": # [{"id": "filter_and_sort", "name": "Filter and Sort", "tool_config": "filtering.xml", "version": ""}]} # Currently all tools contained within an installed tool shed repository must be loaded into the same # section in the tool panel, so we can get the section id of the first guid in the tool_panel_section_dict. # In the future, we'll have to handle different sections per guid. guid = tool_panel_section_dict.keys()[0] section_dicts = tool_panel_section_dict[guid] section_dict = section_dicts[0] tool_panel_section_id = section_dict['id'] tool_panel_section_name = section_dict['name'] if tool_panel_section_id: tpm = tool_panel_manager.ToolPanelManager(self.app) tool_panel_section_key, _ = \ tpm.get_or_create_tool_section( self.app.toolbox, tool_panel_section_id=tool_panel_section_id, new_tool_panel_section_label=tool_panel_section_name ) else: tool_dependencies = None repo_info_dict = repository_util.create_repo_info_dict( app=self.app, repository_clone_url=repository_clone_url, changeset_revision=repository.changeset_revision, ctx_rev=repository.ctx_rev, repository_owner=repository.owner, repository_name=repository.name, repository=None, repository_metadata=None, tool_dependencies=tool_dependencies, repository_dependencies=repository_dependencies) return repo_info_dict, tool_panel_section_key
def update_in_shed_tool_config(self): """ A tool shed repository is being updated so change the shed_tool_conf file. Parse the config file to generate the entire list of config_elems instead of using the in-memory list. """ shed_conf_dict = self.shed_config_dict or self.repository.get_shed_config_dict( self.app) shed_tool_conf = shed_conf_dict['config_filename'] tool_path = shed_conf_dict['tool_path'] self.tpm.generate_tool_panel_dict_from_shed_tool_conf_entries( self.repository) repository_tools_tups = self.get_repository_tools_tups() clone_url = common_util.generate_clone_url_for_installed_repository( self.app, self.repository) tool_shed = self.tool_shed_from_repository_clone_url() owner = self.repository.owner if not owner: cleaned_repository_clone_url = common_util.remove_protocol_and_user_from_clone_url( clone_url) owner = repository_util.get_repository_owner( cleaned_repository_clone_url) guid_to_tool_elem_dict = {} for tool_config_filename, guid, tool in repository_tools_tups: guid_to_tool_elem_dict[guid] = self.tpm.generate_tool_elem( tool_shed, self.repository.name, self.repository.changeset_revision, self.repository.owner or '', tool_config_filename, tool, None) config_elems = [] tree, error_message = xml_util.parse_xml(shed_tool_conf) if tree: root = tree.getroot() for elem in root: if elem.tag == 'section': for i, tool_elem in enumerate(elem): guid = tool_elem.attrib.get('guid') if guid in guid_to_tool_elem_dict: elem[i] = guid_to_tool_elem_dict[guid] elif elem.tag == 'tool': guid = elem.attrib.get('guid') if guid in guid_to_tool_elem_dict: elem = guid_to_tool_elem_dict[guid] config_elems.append(elem) self.tpm.config_elems_to_xml_file(config_elems, shed_tool_conf, tool_path)
def get_repo_info_dict_for_repair( self, rdim, repository ): tool_panel_section_key = None repository_clone_url = common_util.generate_clone_url_for_installed_repository( self.app, repository ) repository_dependencies = rdim.get_repository_dependencies_for_installed_tool_shed_repository( self.app, repository ) metadata = repository.metadata if metadata: tool_dependencies = metadata.get( 'tool_dependencies', None ) tool_panel_section_dict = metadata.get( 'tool_panel_section', None ) if tool_panel_section_dict: # The repository must be in the uninstalled state. The structure of tool_panel_section_dict is: # {<tool guid> : # [{ 'id':<section id>, 'name':<section name>, 'version':<section version>, 'tool_config':<tool config file name> }]} # Here is an example: # {"localhost:9009/repos/test/filter/Filter1/1.1.0": # [{"id": "filter_and_sort", "name": "Filter and Sort", "tool_config": "filtering.xml", "version": ""}]} # Currently all tools contained within an installed tool shed repository must be loaded into the same # section in the tool panel, so we can get the section id of the first guid in the tool_panel_section_dict. # In the future, we'll have to handle different sections per guid. guid = tool_panel_section_dict.keys()[ 0 ] section_dicts = tool_panel_section_dict[ guid ] section_dict = section_dicts[ 0 ] tool_panel_section_id = section_dict[ 'id' ] tool_panel_section_name = section_dict[ 'name' ] if tool_panel_section_id: tpm = tool_panel_manager.ToolPanelManager( self.app ) tool_panel_section_key, _ = \ tpm.get_or_create_tool_section( self.app.toolbox, tool_panel_section_id=tool_panel_section_id, new_tool_panel_section_label=tool_panel_section_name ) else: tool_dependencies = None repo_info_dict = repository_util.create_repo_info_dict( app=self.app, repository_clone_url=repository_clone_url, changeset_revision=repository.changeset_revision, ctx_rev=repository.ctx_rev, repository_owner=repository.owner, repository_name=repository.name, repository=None, repository_metadata=None, tool_dependencies=tool_dependencies, repository_dependencies=repository_dependencies ) return repo_info_dict, tool_panel_section_key
def update_in_shed_tool_config( self ): """ A tool shed repository is being updated so change the shed_tool_conf file. Parse the config file to generate the entire list of config_elems instead of using the in-memory list. """ shed_conf_dict = self.repository.get_shed_config_dict( self.app ) shed_tool_conf = shed_conf_dict[ 'config_filename' ] tool_path = shed_conf_dict[ 'tool_path' ] self.tpm.generate_tool_panel_dict_from_shed_tool_conf_entries( self.repository ) repository_tools_tups = self.get_repository_tools_tups() clone_url = common_util.generate_clone_url_for_installed_repository( self.app, self.repository ) tool_shed = self.tool_shed_from_repository_clone_url() owner = self.repository.owner if not owner: cleaned_repository_clone_url = common_util.remove_protocol_and_user_from_clone_url( clone_url ) owner = repository_util.get_repository_owner( cleaned_repository_clone_url ) guid_to_tool_elem_dict = {} for tool_config_filename, guid, tool in repository_tools_tups: guid_to_tool_elem_dict[ guid ] = self.tpm.generate_tool_elem( tool_shed, self.repository.name, self.repository.changeset_revision, self.repository.owner or '', tool_config_filename, tool, None ) config_elems = [] tree, error_message = xml_util.parse_xml( shed_tool_conf ) if tree: root = tree.getroot() for elem in root: if elem.tag == 'section': for i, tool_elem in enumerate( elem ): guid = tool_elem.attrib.get( 'guid' ) if guid in guid_to_tool_elem_dict: elem[i] = guid_to_tool_elem_dict[ guid ] elif elem.tag == 'tool': guid = elem.attrib.get( 'guid' ) if guid in guid_to_tool_elem_dict: elem = guid_to_tool_elem_dict[ guid ] config_elems.append( elem ) self.tpm.config_elems_to_xml_file( config_elems, shed_tool_conf, tool_path )
def set_repository(self, repository): super(InstalledRepositoryMetadataManager, self).set_repository(repository) self.repository_clone_url = common_util.generate_clone_url_for_installed_repository( self.app, repository)
def set_repository( self, repository ): super( InstalledRepositoryMetadataManager, self ).set_repository( repository ) self.repository_clone_url = common_util.generate_clone_url_for_installed_repository( self.app, repository )