CalibManager/src/PackageVersions.py

Go to the documentation of this file.
00001 #--------------------------------------------------------------------------
00002 # File and Version Information:
00003 #  $Id: PackageVersions.py 9895 2015-04-10 00:59:28Z dubrovin@SLAC.STANFORD.EDU $
00004 #
00005 # Description:
00006 #  Module PackageVersions.py...
00007 #
00008 #------------------------------------------------------------------------
00009 
00010 """
00011 Class PackageVersions launches subprocesses for slow command "psvn tags <pkg-name>"
00012 in background mode and saves results in log-files for list of package names.
00013 Access methods parse log-files and quickly extract the package version when needed.
00014 
00015 This software was developed for the SIT project.
00016 If you use all or part of it, please give an appropriate acknowledgment.
00017 
00018 @see 
00019 
00020 @version $Id: PackageVersions.py 9895 2015-04-10 00:59:28Z dubrovin@SLAC.STANFORD.EDU $
00021 
00022 @author Mikhail S. Dubrovin
00023 """
00024 
00025 #------------------------------
00026 #  Module's version from SVN --
00027 #------------------------------
00028 __version__ = "$Revision: 9895 $"
00029 # $Source$
00030 
00031 
00032 #--------------------------------
00033 #  Imports of standard modules --
00034 #--------------------------------
00035 import sys
00036 import os
00037 import subprocess # for subprocess.Popen
00038 from commands import getoutput
00039 import tempfile
00040 from time import time, sleep
00041 
00042 from CalibManager.SvnProps   import svnprops as spcm
00043 from ImgAlgos.SvnProps       import svnprops as spia
00044 from PSCalib.SvnProps        import svnprops as spps
00045 from pdscalibdata.SvnProps   import svnprops as spcd
00046 from CSPadPixCoords.SvnProps import svnprops as sppc
00047 
00048 from CalibManager.SvnPropsViewer import SvnPropsViewer
00049 
00050 from CalibManager.GlobalUtils import ready_to_start
00051 
00052 #from ConfigParametersForApp import cp
00053 #import GlobalUtils          as     gu
00054 #------------------------------
00055 
00056 def subproc_submit(command_seq, logname=None, env=None, shell=False) :
00057     # for example, command_seq=['bsub', '-q', cp.batch_queue, '-o', 'log-ls.txt', 'ls -l']
00058     log = subprocess.PIPE if logname is None else open(logname, 'w')
00059     p = subprocess.Popen(command_seq, stdout=log, stderr=subprocess.PIPE, env=env, shell=shell) #, stdin=subprocess.STDIN
00060     #p.wait()
00061     #err = p.stderr.read() # reads entire file
00062     #return err
00063 
00064 def get_text_from_file(path) :
00065     f=open(path,'r')
00066     text = f.read()
00067     f.close()
00068     return text
00069 
00070 def get_tempfname(mode='w+b',prefix='calibman-',suffix='.txt') :
00071     return tempfile.NamedTemporaryFile(mode=mode,prefix=prefix,suffix=suffix).name
00072 
00073 #------------------------------
00074 
00075 class PackageVersions :
00076     """Get info about tags of packages involved in the project
00077     """
00078     def __init__(self, list_of_pkgs = ['CalibManager', 'ImgAlgos', 'PSCalib', 'pdscalibdata', 'CSPadPixCoords'], print_bits=0) :
00079         t0_sec = time()
00080         self.list_of_pkgs = list_of_pkgs
00081         self.print_bits = print_bits
00082         self.delete_old_tmp_files()
00083         if self.print_bits & 1 : print 'PackageVersions: Old temporary files are deleted'
00084         self.make_logfiles_in_background_mode()
00085         if self.print_bits & 2 : print 'PackageVersions: make_logfiles_in_background_mode() is started'
00086 
00087         #msg = 'Consumed time to launch subprocesses = %7.3f sec' % (time()-t0_sec)
00088         #print msg
00089 
00090 
00091     def delete_old_tmp_files(self) :
00092         cmd = 'rm -f /tmp/calibman-*txt'
00093         try :
00094             #self.subproc_submit(cmd.split())
00095             output = getoutput(cmd)
00096             if self.print_bits & 4 : print 'delete_old_tmp_files(...):\n', output
00097             #stream = os.popen(cmd)
00098             #print stream.read()
00099         except :
00100             if self.print_bits & 4 : print 'delete_old_tmp_files(...):\nSome problem with cleanup tmp files "%s"' % cmd
00101 
00102 
00103     def make_logfiles_in_background_mode(self) :
00104         """Returns dictionary with temporary file names for packages as keys"""
00105 
00106         self.dict_pkg_fname = {pkg:get_tempfname() for pkg in self.list_of_pkgs}
00107         for pkg, fname in self.dict_pkg_fname.iteritems() :
00108             cmd = 'psvn tags %s' % pkg
00109             subproc_submit(cmd.split(), fname)
00110 
00111 
00112     def print_list_of_packages(self) :
00113         for pkg, fname in self.dict_pkg_fname.iteritems() :
00114             print pkg, fname
00115 
00116 
00117     def get_text_from_log_for_pkg(self, pkg) :
00118         fname = self.dict_pkg_fname[pkg]
00119         return get_text_from_file(fname)
00120 
00121 
00122     def print_log_for_pkg(self, pkg) :
00123         print self.get_text_from_log_for_pkg(pkg)
00124 
00125 
00126     def get_revision_str(self, props) :
00127         spv = SvnPropsViewer(props)
00128         return spv.get_pkg_revision()
00129 
00130 
00131     def get_revision_msg(self, props) :
00132         spv = SvnPropsViewer(props)
00133         return 'RN-%s' % spv.get_pkg_revision()
00134 
00135 
00136     def get_pkg_revision(self, pkg='CalibManager') :
00137         """Returns package revision number"""
00138         if   pkg=='CalibManager'   : return self.get_revision_str(spcm)
00139         elif pkg=='ImgAlgos'       : return self.get_revision_str(spia)
00140         elif pkg=='PSCalib'        : return self.get_revision_str(spps)
00141         elif pkg=='pdscalibdata'   : return self.get_revision_str(spcd)
00142         elif pkg=='CSPadPixCoords' : return self.get_revision_str(sppc)
00143 
00144         #if   pkg=='CalibManager'   : return self.get_pkg_tag(pkg)
00145         #elif pkg=='ImgAlgos'       : return self.get_pkg_tag(pkg)
00146         #elif pkg=='PSCalib'        : return self.get_pkg_tag(pkg)
00147         #elif pkg=='pdscalibdata'   : return self.get_pkg_tag(pkg)
00148         #elif pkg=='CSPadPixCoords' : return self.get_pkg_tag(pkg)
00149 
00150         else : return 'N/A' 
00151 
00152 
00153     def get_pkg_tag(self, pkg='CalibManager') :
00154         """Returns the latest version of the package"""
00155         try :
00156             output = self.get_text_from_log_for_pkg(pkg).rstrip('\n')
00157             lines = output.split('\n')
00158             last_line = lines[-1]
00159             fields = last_line.split()
00160             version = fields[-1].rstrip('/')
00161             #print 'output:\n', output         
00162             #print 'Last line: ', last_line
00163             #print 'Version: ', version
00164             return version
00165         except :
00166             return 'V-is-N/A'
00167 
00168 
00169     def get_pkg_version(self, pkg='CalibManager') :
00170         """Returns the latest version of the package"""
00171         return self.get_pkg_revision(pkg)
00172         #return self.get_pkg_tag(pkg)
00173 
00174 
00175     def get_tag_for_rev(self, pkg='CalibManager', rev_inq='8050') :
00176         """Returns the package tag for """
00177         try :
00178             rev_num = int(rev_inq)
00179             #print 'rev_num:',  rev_num
00180             output = self.get_text_from_log_for_pkg(pkg).rstrip('\n')
00181             lines = output.split('\n')
00182             for line in lines[1:] :
00183                 #print 'line:', line
00184                 fields = line.split()
00185                 rev = fields[0]                
00186                 tag = fields[-1].rstrip('/')
00187                 #print 'rev, tag =', rev, tag
00188                 if int(rev) >= rev_num :
00189                     return tag            
00190 
00191         except :
00192             return 'V-is-N/A'
00193         
00194 
00195     def text_version_for_all_packages(self) :
00196         txt = 'Version of packages'
00197         for pkg in self.list_of_pkgs :
00198             txt += '\n    %s  %s' % (self.get_pkg_version(pkg), pkg)
00199         return txt
00200 
00201 
00202     def text_rev_and_tag_for_all_packages(self) :
00203         txt = 'Revision and tag of packages'
00204         for pkg in self.list_of_pkgs :            
00205             rev = self.get_pkg_revision(pkg)
00206             tag = self.get_tag_for_rev(pkg,rev)
00207             txt += '\n    %s  %s  %s' % (rev, tag, pkg)
00208             #print 'test of rev, tag, pkg:', rev, tag, pkg
00209         return txt
00210 
00211 
00212 #------------------------------
00213 
00214 def test_packege_version(test_num):
00215 
00216     print 'Test: %d' % test_num
00217 
00218     if not ready_to_start(check_bits=02, fatal_bits=02) : #1,2,4 = old LUSTRE, Kerberos ticket,  AFS token
00219         sys.exit('Not ready to start aplication yet...')
00220 
00221     pv = PackageVersions(print_bits=0377)
00222 
00223     t0_sec = time()
00224 
00225     if test_num == 0 :
00226         pv.print_list_of_packages()
00227     else : 
00228         sleep(4)
00229         t0_sec = time()
00230 
00231     if test_num == 1 :
00232         pv.print_log_for_pkg('CalibManager')
00233 
00234     elif test_num == 2 :
00235         pkg = 'CalibManager'
00236         print 'Package %s, version: %s' % (pkg, pv.get_pkg_version(pkg))
00237         
00238     elif test_num == 3 :
00239         print pv.text_version_for_all_packages()
00240 
00241     elif test_num == 4 :
00242         pkg = 'CalibManager'
00243         rev = pv.get_pkg_revision(pkg)
00244         tag = pv.get_tag_for_rev(pkg,rev)
00245         print 'Package %s, revision: %s, tag: %s' % (pkg, rev, tag)
00246 
00247     elif test_num == 5 :
00248         pkg = 'pdscalibdata'
00249         rev = pv.get_pkg_revision(pkg)
00250         tag = pv.get_tag_for_rev(pkg,rev)
00251         print 'Package %s, revision: %s, tag: %s' % (pkg, rev, tag)
00252         
00253     elif test_num == 6 :
00254         pkg = 'CalibManager'
00255         print 'Package %s latest tag: %s' % (pkg, pv.get_pkg_tag(pkg))
00256 
00257     elif test_num == 7 :
00258         txt = pv.text_rev_and_tag_for_all_packages()
00259         print txt
00260 
00261 
00262     msg = 'Consumed time to test method = %7.3f sec' % (time()-t0_sec)
00263     print msg
00264 
00265 #------------------------------
00266 
00267 if __name__ == "__main__" :
00268 
00269     if len(sys.argv)!=2 or sys.argv[1] == '-h' :
00270         msg  = 'NOTE!!! psvn command needs in Kerberos ticket !!!'
00271         msg += '\nUse %s with a single parameter, <test number=0,1,2,...>' % sys.argv[0]
00272         msg += '\n    0 - print_list_of_packages() and associated tmp files'
00273         msg += '\n    1 - print_log_for_pkg("CalibManager")'
00274         msg += '\n    2 - get_pkg_version("CalibManager")'
00275         msg += '\n    3 - text_version_for_all_packages()'
00276         msg += '\n    4 - get_pkg_revision("CalibManager")'
00277         msg += '\n    5 - get_pkg_revision("pdscalibdata")'
00278         msg += '\n    6 - get_pkg_tag("CalibManager")'
00279         msg += '\n    7 - text_rev_and_tag_for_all_packages()'
00280         msg += '\n   -h - this help'
00281         print msg
00282 
00283     else :
00284 
00285         try    :
00286             test_num = int(sys.argv[1])
00287             test_packege_version(test_num)
00288         except :
00289             test_packege_version(0)
00290 
00291     sys.exit ( 'End of test.' )
00292 
00293 #------------------------------

Generated on 19 Dec 2016 for PSDMSoftware by  doxygen 1.4.7