/lib/galaxy/eggs/dist.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 92 lines · 79 code · 4 blank · 9 comment · 17 complexity · 205e5a3e049411a77c9b016f585b6cb5 MD5 · raw file

  1. """
  2. Manage Galaxy eggs
  3. """
  4. import os, sys, subprocess
  5. from scramble import ScrambleEgg, ScrambleCrate, ScrambleFailure, galaxy_dir, py
  6. from __init__ import Crate, CaseSensitiveConfigParser
  7. import logging
  8. log = logging.getLogger( __name__ )
  9. log.addHandler( logging.NullHandler() )
  10. class DistScrambleEgg( ScrambleEgg ):
  11. def set_dir( self ):
  12. self.dir = os.path.join( galaxy_dir, 'dist-eggs', self.name )
  13. if not os.path.exists( self.dir ):
  14. os.makedirs( self.dir )
  15. @property
  16. def path( self ):
  17. # don't look for compatible eggs, look for exact matches
  18. if os.path.exists( self.distribution.location ):
  19. return self.distribution.location
  20. return None
  21. def run_scramble_script( self ):
  22. log.warning( "%s(): Beginning build" % sys._getframe().f_code.co_name )
  23. # subprocessed to sterilize the env
  24. cmd = "ssh %s 'cd %s; PYTHONPATH= %s -ES %s'" % ( self.build_host, self.buildpath, self.python, 'scramble.py' )
  25. log.debug( '%s(): Executing:' % sys._getframe().f_code.co_name )
  26. log.debug( ' %s' % cmd )
  27. p = subprocess.Popen( args = cmd, shell = True )
  28. r = p.wait()
  29. if r != 0:
  30. raise ScrambleFailure( "%s(): Egg build failed for %s %s" % ( sys._getframe().f_code.co_name, self.name, self.version ) )
  31. def unpack_if_needed( self ):
  32. return # do not unpack dist eggs
  33. class DistScrambleCrate( ScrambleCrate ):
  34. """
  35. Holds eggs with info on how to build them for distribution.
  36. """
  37. dist_config_file = os.path.join( galaxy_dir, 'dist-eggs.ini' )
  38. def __init__( self, galaxy_config_file, build_on='all' ):
  39. self.dist_config = CaseSensitiveConfigParser()
  40. self.build_on = build_on
  41. ScrambleCrate.__init__( self, galaxy_config_file )
  42. def parse( self ):
  43. self.dist_config.read( DistScrambleCrate.dist_config_file )
  44. self.hosts = dict( self.dist_config.items( 'hosts' ) )
  45. self.groups = dict( self.dist_config.items( 'groups' ) )
  46. self.ignore = dict( self.dist_config.items( 'ignore' ) )
  47. self.platforms = self.get_platforms( self.build_on )
  48. self.noplatforms = self.get_platforms( 'noplatform' )
  49. Crate.parse( self )
  50. def get_platforms( self, wanted ):
  51. # find all the members of a group and process them
  52. if self.groups.has_key( wanted ):
  53. platforms = []
  54. for name in self.groups[wanted].split():
  55. for platform in self.get_platforms( name ):
  56. if platform not in platforms:
  57. platforms.append( platform )
  58. return platforms
  59. elif self.hosts.has_key( wanted ):
  60. return [ wanted ]
  61. else:
  62. raise Exception( "unknown platform: %s" % wanted )
  63. def parse_egg_section( self, eggs, tags, full_platform=False ):
  64. for name, version in eggs:
  65. self.eggs[name] = []
  66. tag = dict( tags ).get( name, '' )
  67. url = '/'.join( ( self.repo, name ) )
  68. try:
  69. sources = self.config.get( 'source', name ).split()
  70. except:
  71. sources = []
  72. try:
  73. dependencies = self.config.get( 'dependencies', name ).split()
  74. except:
  75. dependencies = []
  76. if full_platform:
  77. platforms = self.platforms
  78. else:
  79. platforms = self.noplatforms
  80. for platform in platforms:
  81. if name in self.ignore and platform in self.ignore[name].split():
  82. continue
  83. egg = DistScrambleEgg( name, version, tag, url, platform, self )
  84. host_info = self.hosts[platform].split()
  85. egg.build_host, egg.python = host_info[:2]
  86. egg.sources = sources
  87. egg.dependencies = dependencies
  88. self.eggs[name].append( egg )