/lib/galaxy/sample_tracking/external_service_types.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 113 lines · 108 code · 3 blank · 2 comment · 5 complexity · a83d8c68ea4e6f9f69bb86da6501430a MD5 · raw file

  1. import logging, os, sys
  2. from galaxy.util.odict import odict
  3. from galaxy.util.bunch import Bunch
  4. from galaxy import util, jobs, model
  5. from galaxy.forms.forms import form_factory
  6. from galaxy.external_services.service import ExternalServiceActionsGroup
  7. from elementtree.ElementTree import XML
  8. from galaxy.sample_tracking.data_transfer import data_transfer_factories
  9. log = logging.getLogger( __name__ )
  10. class ExternalServiceTypeNotFoundException( Exception ):
  11. pass
  12. class ExternalServiceTypesCollection( object ):
  13. def __init__( self, config_filename, root_dir, app ):
  14. self.all_external_service_types = odict()
  15. self.root_dir = root_dir
  16. self.app = app
  17. try:
  18. self.load_all( config_filename )
  19. except:
  20. log.exception( "ExternalServiceTypesCollection error reading %s", config_filename )
  21. def load_all( self, config_filename ):
  22. self.visible_external_service_types = []
  23. tree = util.parse_xml( config_filename )
  24. root = tree.getroot()
  25. for elem in root:
  26. try:
  27. if elem.tag == 'external_service_type':
  28. file_path = elem.get( "file" )
  29. visible = util.string_as_bool( elem.get( "visible" ) )
  30. external_service_type = self.load_external_service_type( os.path.join( self.root_dir, file_path ), visible )
  31. self.all_external_service_types[ external_service_type.id ] = external_service_type
  32. log.debug( "Loaded external_service_type: %s %s" % ( external_service_type.name, external_service_type.config_version ) )
  33. if visible:
  34. self.visible_external_service_types.append( external_service_type.id )
  35. except:
  36. log.exception( "error reading external_service_type from path: %s" % file_path )
  37. def load_external_service_type( self, config_file, visible=True ):
  38. # Parse XML configuration file and get the root element
  39. tree = util.parse_xml( config_file )
  40. root = tree.getroot()
  41. return ExternalServiceType( config_file, root, visible )
  42. def reload( self, external_service_type_id ):
  43. """
  44. Attempt to reload the external_service_type identified by 'external_service_type_id', if successful
  45. replace the old external_service_type.
  46. """
  47. if external_service_type_id not in self.all_external_service_types.keys():
  48. raise ExternalServiceTypeNotFoundException( "No external_service_type with id %s" % external_service_type_id )
  49. old_external_service_type = self.all_external_service_types[ external_service_type_id ]
  50. new_external_service_type = self.load_external_service_type( old_external_service_type.config_file )
  51. self.all_external_service_types[ external_service_type_id ] = new_external_service_type
  52. log.debug( "Reloaded external_service_type %s" %( external_service_type_id ) )
  53. return new_external_service_type
  54. class ExternalServiceType( object ):
  55. def __init__( self, external_service_type_xml_config, root, visible=True ):
  56. self.config_file = external_service_type_xml_config
  57. self.parse( root )
  58. self.visible = visible
  59. root.clear()
  60. def parse( self, root ):
  61. # Get the name
  62. self.name = root.get( "name" )
  63. if not self.name:
  64. raise Exception, "Missing external_service_type 'name'"
  65. # Get the UNIQUE id for the tool
  66. self.id = root.get( "id" )
  67. if not self.id:
  68. raise Exception, "Missing external_service_type 'id'"
  69. self.config_version = root.get( "version" )
  70. if not self.config_version:
  71. self.config_version = '1.0.0'
  72. self.description = util.xml_text(root, "description")
  73. self.version = util.xml_text( root.find( "version" ) )
  74. # parse the form
  75. self.form_definition = form_factory.from_elem( root.find( 'form' ) )
  76. self.parse_data_transfer_settings( root )
  77. self.parse_run_details( root )
  78. #external services actions
  79. self.actions = ExternalServiceActionsGroup.from_elem( root.find( 'actions' ), parent=self )
  80. def parse_data_transfer_settings( self, root ):
  81. self.data_transfer = {}
  82. data_transfer_settings_elem = root.find( 'data_transfer_settings' )
  83. # Currently only data transfer using scp or http is supported.
  84. for data_transfer_elem in data_transfer_settings_elem.findall( "data_transfer" ):
  85. if data_transfer_elem.get( 'protocol' ) == model.ExternalService.data_transfer_protocol.SCP:
  86. scp_data_transfer = data_transfer_factories[ model.ExternalService.data_transfer_protocol.SCP ]
  87. scp_data_transfer.parse( self.config_file, data_transfer_elem )
  88. self.data_transfer[ model.ExternalService.data_transfer_protocol.SCP ] = scp_data_transfer
  89. if data_transfer_elem.get( 'protocol' ) == model.ExternalService.data_transfer_protocol.HTTP:
  90. http_data_transfer = data_transfer_factories[ model.ExternalService.data_transfer_protocol.HTTP ]
  91. http_data_transfer.parse( self.config_file, data_transfer_elem )
  92. self.data_transfer[ model.ExternalService.data_transfer_protocol.HTTP ] = http_data_transfer
  93. def parse_run_details( self, root ):
  94. self.run_details = {}
  95. run_details_elem = root.find( 'run_details' )
  96. if run_details_elem:
  97. results_elem = run_details_elem.find( 'results' )
  98. if results_elem:
  99. # Get the list of resulting datatypes
  100. # TODO: the 'results_urls' attribute is only useful if the transfer protocol is http(s), so check if that is the case.
  101. self.run_details[ 'results' ], self.run_details[ 'results_urls' ] = self.parse_run_details_results( results_elem )
  102. def parse_run_details_results( self, root ):
  103. datatypes_dict = {}
  104. urls_dict = {}
  105. for datatype_elem in root.findall( "dataset" ):
  106. name = datatype_elem.get( 'name' )
  107. datatypes_dict[ name ] = datatype_elem.get( 'datatype' )
  108. urls_dict[ name ] = datatype_elem.get( 'url', None )
  109. return datatypes_dict, urls_dict