7 from TestSsh import TestSsh
10 # (*) plc trackers remembers the running myplcs
11 # (*) qemu trackers keeps track of the running qemu nodes
13 # trackers allow us to let the test run after the build has finished,
14 # and to kill/stop the oldest instances later when we need space
17 #################### Tracker
20 def __init__ (self, options,filename, instances):
22 self.filename=filename
23 self.instances=instances
25 tracks=file(self.filename).readlines()
26 tracks = [ track.strip() for track in tracks ]
29 self.tracks = [track for track in tracks if track]
33 contents=file(self.filename).read()
34 print "==>",self.filename,"<=="
37 print "xxxxxxxxxxxx",self.filename,"not found"
40 out = file(self.filename,'w')
41 for track in self.tracks:
42 out.write('%s\n'%(track))
45 def record (self,track):
46 for already in self.tracks:
48 print '%s is already included in %s'%(already,self.filename)
50 if self.options.dry_run:
51 print 'dry_run: Tracker.record - skipping %s'%(track)
53 self.tracks.append( track )
54 print "Recorded %s in tracker %s"%(track,self.filename)
56 # this stops the instances currently attached with this test session and release tracker
57 def release (self,track):
58 for already in self.tracks:
60 if self.options.dry_run:
61 print 'dry_run: Tracker.release - skipping %s'%(track)
63 self.tracks.remove(track)
64 print "Releasing %s in tracker %s"%(track,self.filename)
65 command = self.stop_command (track)
66 utils.header("Trackers.make_space track : %s"%command)
68 print '%s was not found in %s'%(track,self.filename)
71 # this actually stops the old instances, so that the total fits in the number of instances
72 def make_space (self):
73 # number of instances to stop
74 how_many=len(self.tracks)-self.instances
75 # nothing todo until we have more than keep_vservers in the tracker
77 print 'Tracker.make_space : limit %d not reached'%self.instances
79 to_stop = self.tracks[:how_many]
81 command = self.stop_command (track)
82 utils.header("Trackers.make_space track : %s"%command)
84 if not self.options.dry_run:
85 self.tracks = self.tracks[how_many:]
87 # this stops ALL known instances
89 for track in self.tracks:
90 command=self.stop_command(track)
91 utils.header("Trackers.cleanup track : %s"%command)
93 if not self.options.dry_run:
96 class TrackerPlc (Tracker):
98 DEFAULT_FILENAME=os.environ['HOME']+"/tracker-plcs"
99 # how many concurrent plcs are we keeping alive - adjust with the IP pool size
100 DEFAULT_MAX_INSTANCES = 12
102 def __init__ (self,options,filename=None,instances=0):
103 if not filename: filename=TrackerPlc.DEFAULT_FILENAME
104 if not instances: instances=TrackerPlc.DEFAULT_MAX_INSTANCES
105 Tracker.__init__(self,options,filename,instances)
107 def record (self, hostname, vservername):
108 Tracker.record (self,"%s@%s"%(hostname,vservername))
110 def release (self, hostname, vservername):
111 Tracker.release (self,"%s@%s"%(hostname,vservername))
113 def stop_command (self, track):
114 (hostname,vservername) = track.split('@')
115 return TestSsh(hostname).actual_command("vserver --silent %s stop"%vservername)
118 return [ self.plcname(track) for track in self.tracks ]
120 def plcname (self, track):
121 (hostname,vservername) = track.split('@')
122 return vservername.rsplit('-',1)[1]
124 class TrackerQemu (Tracker):
126 DEFAULT_FILENAME=os.environ['HOME']+"/tracker-qemus"
127 # how many concurrent plcs are we keeping alive - adjust with the IP pool size
128 DEFAULT_MAX_INSTANCES = 3
130 def __init__ (self,options,filename=None,instances=0):
131 if not filename: filename=TrackerQemu.DEFAULT_FILENAME
132 if not instances: instances=TrackerQemu.DEFAULT_MAX_INSTANCES
133 Tracker.__init__(self,options,filename,instances)
135 def record (self, hostname, buildname, nodename):
136 Tracker.record (self,"%s@%s@%s"%(hostname,buildname,nodename))
138 def release (self, hostname, buildname, nodename):
139 Tracker.release (self,"%s@%s@%s"%(hostname,buildname,nodename))
141 def stop_command (self, track):
142 (hostname,buildname,nodename) = track.split('@')
143 return TestSsh(hostname).actual_command("%s/qemu-%s/qemu-kill-node this"%(buildname,nodename))
145 def hostnames (self):
146 return [ self.hostname(track) for track in self.tracks ]
148 def hostname (self, track):
149 (hostname,buildname,nodename) = track.split('@')
152 def nodenames (self):
153 return [ self.nodename(track) for track in self.tracks ]
155 def nodename (self, track):
156 (hostname,buildname,nodename) = track.split('@')