summaryrefslogtreecommitdiffstats
path: root/tests/test-framework/vmware/ftpsource.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-framework/vmware/ftpsource.py')
-rw-r--r--tests/test-framework/vmware/ftpsource.py117
1 files changed, 117 insertions, 0 deletions
diff --git a/tests/test-framework/vmware/ftpsource.py b/tests/test-framework/vmware/ftpsource.py
new file mode 100644
index 000000000..306c76b63
--- /dev/null
+++ b/tests/test-framework/vmware/ftpsource.py
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+from ftplib import FTP
+import datetime, functools, os, time, tempfile
+from source import Installer
+import utils
+
+def _timestampFromFilename( platform, fn ):
+ # windows: assumed format is YYYY_mm_dd_HH_MM as prefix
+ # linux: assumed format is YYYY-mm-dd as suffix
+ if platform.startswith( 'windows' ):
+ format = '%Y_%m_%d_%H_%M'
+ length = len( 'YYYY_mm_dd_HH_MM' )
+ return datetime.datetime.strptime( fn[0:length], format )
+ else:
+ format = '%Y-%m-%d'
+ length = len( 'YYYY-mm-dd' )
+ return datetime.datetime.strptime( fn[-length:], format )
+
+
+
+def timestampFromFilename( platform, fn ):
+ try:
+ return _timestampFromFilename( platform, fn )
+ except ValueError:
+ return None
+
+def filesNewerThan( files, dt ):
+ if dt:
+ return filter( lambda (x,y): y >= dt, files )
+ else:
+ return files
+
+#internal to FtpSource
+class Location:
+ def __init__( self, host, path, platform ):
+ self.host = host
+ self.path = path
+ self.platform = platform
+ self.testedFiles = []
+
+ def ls( self ):
+ ftp = FTP( self.host )
+ ftp.login()
+ try:
+ return map( utils.basename, ftp.nlst( self.path ) )
+ finally:
+ ftp.close()
+
+ def filesSortedByTimestamp( self ):
+ files = self.ls()
+ withTS = [( i, timestampFromFilename( self.platform, i ) ) for i in files]
+ filtered = filter( lambda (x,y): y != None, withTS )
+ filtered.sort( key=lambda (x,y): y )
+ return filtered
+
+ def untestedFilesSortedByTimestamp( self ):
+ l = self.filesSortedByTimestamp()
+ return filter( lambda ( x, y ): not self.isTested( x ), l )
+
+ def markAsTested( self, filename ):
+ self.testedFiles.append( filename )
+
+ def isTested( self, filename ):
+ return filename in self.testedFiles
+
+ def description( self ):
+ return "host={0} path={1} platform={2}".format( self.host, self.path, self.platform )
+
+ def download( self, fn, target ):
+ ftp = FTP( self.host )
+ ftp.login()
+ try:
+ ftp.retrbinary( 'RETR {0}/{1}'.format( self.path, fn ), target.write )
+ finally:
+ ftp.close()
+
+class FtpSource:
+ def __init__( self, delay=60*60, tempdir='/tmp' ):
+ self._locations = []
+ self._delay = delay
+ self._tempdir = tempdir
+ self._startDate = None
+
+ def setStartDate( self, date ):
+ self._startDate = date
+
+ def addLocation( self, host, path, platform ):
+ self._locations.append( Location( host, path, platform ) )
+
+ def nextInstaller( self ):
+ while True:
+ for i in self._locations:
+ print( "** Checking FTP location: " + i.description() )
+ files = i.untestedFilesSortedByTimestamp()
+ if self._startDate != None:
+ files = filesNewerThan( files, self._startDate )
+ if len( files ) == 0:
+ continue;
+ fn, ts = files[0]
+ print( "** Downloading new installer: {0}...".format( fn ) )
+ tmp = tempfile.NamedTemporaryFile( dir=self._tempdir, prefix=fn )
+ i.download( fn, tmp )
+ print( "** Download completed. ({0})".format( tmp.name ) )
+ i.lastTested = ts
+ inst = Installer( tmp.name, i.platform, i, ts, tmp )
+ inst.sourceFilename = fn
+ return inst
+ print( "** No installers found. Going to sleep for {0} seconds...".format( self._delay ) )
+ time.sleep( self._delay )
+
+if __name__ == "__main__":
+ src = FtpSource()
+ src.addLocation( "hegel", "/projects/ndk/installers/windows", "windows" )
+ while True:
+ inst = src.nextInstaller()
+ print inst
+ inst.markAsTested()