| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | import sys, os | 
					
						
							| 
									
										
										
										
											2009-09-15 19:53:18 +00:00
										 |  |  | import http, http.client, http.server, urllib, socket | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | import subprocess, shutil, time, hashlib | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from netrender.utils import * | 
					
						
							|  |  |  | import netrender.model | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | import netrender.balancing | 
					
						
							| 
									
										
										
										
											2009-09-23 01:59:57 +00:00
										 |  |  | import netrender.master_html | 
					
						
							| 
									
										
										
										
											2009-08-30 02:40:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | class MRenderFile: | 
					
						
							| 
									
										
										
										
											2009-09-09 02:25:14 +00:00
										 |  |  | 	def __init__(self, filepath, start, end): | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 		self.filepath = filepath | 
					
						
							| 
									
										
										
										
											2009-09-09 02:25:14 +00:00
										 |  |  | 		self.start = start | 
					
						
							|  |  |  | 		self.end = end | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 		self.found = False | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def test(self): | 
					
						
							|  |  |  | 		self.found = os.path.exists(self.filepath) | 
					
						
							|  |  |  | 		return self.found | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | class MRenderSlave(netrender.model.RenderSlave): | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 	def __init__(self, name, address, stats): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		super().__init__() | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 		self.id = hashlib.md5(bytes(repr(name) + repr(address), encoding='utf8')).hexdigest() | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.name = name | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 		self.address = address | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.stats = stats | 
					
						
							|  |  |  | 		self.last_seen = time.time() | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		self.job = None | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 		self.job_frames = [] | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		netrender.model.RenderSlave._slave_map[self.id] = self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def seen(self): | 
					
						
							|  |  |  | 		self.last_seen = time.time() | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def finishedFrame(self, frame_number): | 
					
						
							|  |  |  | 		self.job_frames.remove(frame_number) | 
					
						
							|  |  |  | 		if not self.job_frames: | 
					
						
							|  |  |  | 			self.job = None | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class MRenderJob(netrender.model.RenderJob): | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 	def __init__(self, job_id, job_type, name, files, chunks = 1, priority = 1, blacklist = []): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		super().__init__() | 
					
						
							|  |  |  | 		self.id = job_id | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 		self.type = job_type | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.name = name | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 		self.files = files | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.frames = [] | 
					
						
							|  |  |  | 		self.chunks = chunks | 
					
						
							|  |  |  | 		self.priority = priority | 
					
						
							| 
									
										
										
										
											2009-09-24 21:05:54 +00:00
										 |  |  | 		self.usage = 0.0 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.blacklist = blacklist | 
					
						
							|  |  |  | 		self.last_dispatched = time.time() | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		# force one chunk for process jobs | 
					
						
							|  |  |  | 		if self.type == netrender.model.JOB_PROCESS: | 
					
						
							|  |  |  | 			self.chunks = 1 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 		# special server properties | 
					
						
							| 
									
										
										
										
											2009-09-23 21:46:29 +00:00
										 |  |  | 		self.last_update = 0 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 		self.save_path = "" | 
					
						
							| 
									
										
										
										
											2009-09-09 02:25:14 +00:00
										 |  |  | 		self.files_map = {path: MRenderFile(path, start, end) for path, start, end in files} | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 		self.status = JOB_WAITING | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def save(self): | 
					
						
							|  |  |  | 		if self.save_path: | 
					
						
							|  |  |  | 			f = open(self.save_path + "job.txt", "w") | 
					
						
							|  |  |  | 			f.write(repr(self.serialize())) | 
					
						
							|  |  |  | 			f.close() | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 	def testStart(self): | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 		for f in self.files_map.values(): | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 			if not f.test(): | 
					
						
							|  |  |  | 				return False | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		self.start() | 
					
						
							|  |  |  | 		return True | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-23 21:46:29 +00:00
										 |  |  | 	def testFinished(self): | 
					
						
							|  |  |  | 		for f in self.frames: | 
					
						
							|  |  |  | 			if f.status == QUEUED or f.status == DISPATCHED: | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			self.status = JOB_FINISHED | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-30 02:40:42 +00:00
										 |  |  | 	def start(self): | 
					
						
							|  |  |  | 		self.status = JOB_QUEUED | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 	def addLog(self, frames): | 
					
						
							|  |  |  | 		log_name = "_".join(("%04d" % f for f in frames)) + ".log" | 
					
						
							|  |  |  | 		log_path = self.save_path + log_name | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		for number in frames: | 
					
						
							|  |  |  | 			frame = self[number] | 
					
						
							|  |  |  | 			if frame: | 
					
						
							|  |  |  | 				frame.log_path = log_path | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 	def addFrame(self, frame_number, command): | 
					
						
							|  |  |  | 		frame = MRenderFrame(frame_number, command) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.frames.append(frame) | 
					
						
							|  |  |  | 		return frame | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	def reset(self, all): | 
					
						
							|  |  |  | 		for f in self.frames: | 
					
						
							|  |  |  | 			f.reset(all) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def getFrames(self): | 
					
						
							|  |  |  | 		frames = [] | 
					
						
							|  |  |  | 		for f in self.frames: | 
					
						
							|  |  |  | 			if f.status == QUEUED: | 
					
						
							| 
									
										
										
										
											2009-09-23 21:46:29 +00:00
										 |  |  | 				self.last_dispatched = time.time() | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				frames.append(f) | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				if len(frames) >= self.chunks: | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 					break | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		return frames | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MRenderFrame(netrender.model.RenderFrame): | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 	def __init__(self, frame, command): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		super().__init__() | 
					
						
							|  |  |  | 		self.number = frame | 
					
						
							|  |  |  | 		self.slave = None | 
					
						
							|  |  |  | 		self.time = 0 | 
					
						
							|  |  |  | 		self.status = QUEUED | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 		self.command = command | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 		self.log_path = None | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 	def reset(self, all): | 
					
						
							|  |  |  | 		if all or self.status == ERROR: | 
					
						
							|  |  |  | 			self.slave = None | 
					
						
							|  |  |  | 			self.time = 0 | 
					
						
							|  |  |  | 			self.status = QUEUED | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RenderHandler(http.server.BaseHTTPRequestHandler): | 
					
						
							| 
									
										
										
										
											2009-09-23 01:59:57 +00:00
										 |  |  | 	def send_head(self, code = http.client.OK, headers = {}, content = "application/octet-stream"): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.send_response(code) | 
					
						
							| 
									
										
										
										
											2009-09-23 01:59:57 +00:00
										 |  |  | 		self.send_header("Content-type", content) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		for key, value in headers.items(): | 
					
						
							|  |  |  | 			self.send_header(key, value) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		self.end_headers() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def do_HEAD(self): | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		if self.path == "/status": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			job_id = self.headers.get('job-id', "") | 
					
						
							|  |  |  | 			job_frame = int(self.headers.get('job-frame', -1)) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			job = self.server.getJobID(job_id) | 
					
						
							|  |  |  | 			if job: | 
					
						
							|  |  |  | 				frame = job[job_frame] | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				 | 
					
						
							|  |  |  | 				if frame: | 
					
						
							|  |  |  | 					self.send_head(http.client.OK) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				else: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					# no such frame | 
					
						
							| 
									
										
										
										
											2009-09-08 01:18:06 +00:00
										 |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			else: | 
					
						
							|  |  |  | 				# no such job id | 
					
						
							|  |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def do_GET(self): | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		if self.path == "/version": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			self.send_head() | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			self.server.stats("", "Version check") | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			self.wfile.write(VERSION) | 
					
						
							|  |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/render": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			job_id = self.headers['job-id'] | 
					
						
							|  |  |  | 			job_frame = int(self.headers['job-frame']) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			if job: | 
					
						
							|  |  |  | 				frame = job[job_frame] | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				if frame: | 
					
						
							|  |  |  | 					if frame.status in (QUEUED, DISPATCHED): | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 						self.send_head(http.client.ACCEPTED) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 					elif frame.status == DONE: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 						self.server.stats("", "Sending result to client") | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 						f = open(job.save_path + "%04d" % job_frame + ".exr", 'rb') | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 						 | 
					
						
							|  |  |  | 						self.send_head() | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						shutil.copyfileobj(f, self.wfile) | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						f.close() | 
					
						
							|  |  |  | 					elif frame.status == ERROR: | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 						self.send_head(http.client.PARTIAL_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				else: | 
					
						
							|  |  |  | 					# no such frame | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			else: | 
					
						
							|  |  |  | 				# no such job id | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/log": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			job_id = self.headers['job-id'] | 
					
						
							|  |  |  | 			job_frame = int(self.headers['job-frame']) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			if job: | 
					
						
							|  |  |  | 				frame = job[job_frame] | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				if frame: | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 					if not frame.log_path or frame.status in (QUEUED, DISPATCHED): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 						self.send_head(http.client.PROCESSING) | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 					else: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 						self.server.stats("", "Sending log to client") | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 						f = open(frame.log_path, 'rb') | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 						 | 
					
						
							|  |  |  | 						self.send_head() | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						shutil.copyfileobj(f, self.wfile) | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						f.close() | 
					
						
							|  |  |  | 				else: | 
					
						
							|  |  |  | 					# no such frame | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			else: | 
					
						
							|  |  |  | 				# no such job id | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/status": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			job_id = self.headers.get('job-id', "") | 
					
						
							|  |  |  | 			job_frame = int(self.headers.get('job-frame', -1)) | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			if job_id: | 
					
						
							|  |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				if job: | 
					
						
							|  |  |  | 					if job_frame != -1: | 
					
						
							|  |  |  | 						frame = job[frame] | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						if frame: | 
					
						
							|  |  |  | 							message = frame.serialize() | 
					
						
							|  |  |  | 						else: | 
					
						
							|  |  |  | 							# no such frame | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 							self.send_heat(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 							return | 
					
						
							|  |  |  | 					else: | 
					
						
							|  |  |  | 						message = job.serialize() | 
					
						
							|  |  |  | 				else: | 
					
						
							|  |  |  | 					# no such job id | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 					return | 
					
						
							|  |  |  | 			else: # status of all jobs | 
					
						
							|  |  |  | 				message = [] | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				for job in self.server: | 
					
						
							|  |  |  | 					message.append(job.serialize()) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			self.server.stats("", "Sending status") | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			self.send_head() | 
					
						
							|  |  |  | 			self.wfile.write(bytes(repr(message), encoding='utf8')) | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/job": | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			self.server.balance() | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			slave_id = self.headers['slave-id'] | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			slave = self.server.getSeenSlave(slave_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			if slave: # only if slave id is valid | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				job, frames = self.server.newDispatch(slave_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							|  |  |  | 				if job and frames: | 
					
						
							|  |  |  | 					for f in frames: | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 						print("dispatch", f.number) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 						f.status = DISPATCHED | 
					
						
							|  |  |  | 						f.slave = slave | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 					slave.job = job | 
					
						
							|  |  |  | 					slave.job_frames = [f.number for f in frames] | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 					self.send_head(headers={"job-id": job.id}) | 
					
						
							|  |  |  | 					 | 
					
						
							|  |  |  | 					message = job.serialize(frames) | 
					
						
							|  |  |  | 					 | 
					
						
							|  |  |  | 					self.wfile.write(bytes(repr(message), encoding='utf8')) | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					self.server.stats("", "Sending job to slave") | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				else: | 
					
						
							|  |  |  | 					# no job available, return error code | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					slave.job = None | 
					
						
							|  |  |  | 					slave.job_frames = [] | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 					self.send_head(http.client.ACCEPTED) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			else: # invalid slave id | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/file": | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 			slave_id = self.headers['slave-id'] | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			slave = self.server.getSeenSlave(slave_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 			if slave: # only if slave id is valid | 
					
						
							|  |  |  | 				job_id = self.headers['job-id'] | 
					
						
							|  |  |  | 				job_file = self.headers['job-file'] | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				if job: | 
					
						
							|  |  |  | 					render_file = job.files_map.get(job_file, None) | 
					
						
							|  |  |  | 					 | 
					
						
							|  |  |  | 					if render_file: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 						self.server.stats("", "Sending file to slave") | 
					
						
							| 
									
										
										
										
											2009-09-16 19:47:58 +00:00
										 |  |  | 						f = open(render_file.filepath, 'rb') | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 						 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:47:58 +00:00
										 |  |  | 						self.send_head() | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 						shutil.copyfileobj(f, self.wfile) | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						f.close() | 
					
						
							|  |  |  | 					else: | 
					
						
							|  |  |  | 						# no such file | 
					
						
							|  |  |  | 						self.send_head(http.client.NO_CONTENT) | 
					
						
							|  |  |  | 				else: | 
					
						
							|  |  |  | 					# no such job id | 
					
						
							|  |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							|  |  |  | 			else: # invalid slave id | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 		elif self.path == "/slaves": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			message = [] | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			self.server.stats("", "Sending slaves status") | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			for slave in self.server.slaves: | 
					
						
							|  |  |  | 				message.append(slave.serialize()) | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			self.send_head() | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			self.wfile.write(bytes(repr(message), encoding='utf8')) | 
					
						
							| 
									
										
										
										
											2009-09-23 01:59:57 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			# hand over the rest to the html section | 
					
						
							|  |  |  | 			netrender.master_html.get(self) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	def do_POST(self): | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		if self.path == "/job": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			length = int(self.headers['content-length']) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 			job_info = netrender.model.RenderJob.materialize(eval(str(self.rfile.read(length), encoding='utf8'))) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 			job_id = self.server.nextJobID() | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 			job = MRenderJob(job_id, job_info.type, job_info.name, job_info.files, chunks = job_info.chunks, priority = job_info.priority, blacklist = job_info.blacklist) | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			for frame in job_info.frames: | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 				frame = job.addFrame(frame.number, frame.command) | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			self.server.addJob(job) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 			headers={"job-id": job_id} | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			if job.testStart(): | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				self.server.stats("", "New job, missing files") | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				self.send_head(headers=headers) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			else: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				self.server.stats("", "New job, started") | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				self.send_head(http.client.ACCEPTED, headers=headers) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/cancel": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			job_id = self.headers.get('job-id', "") | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			job = self.server.getJobID(job_id) | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			if job: | 
					
						
							|  |  |  | 				self.server.stats("", "Cancelling job") | 
					
						
							|  |  |  | 				self.server.removeJob(job) | 
					
						
							|  |  |  | 				self.send_head() | 
					
						
							|  |  |  | 			else:  | 
					
						
							|  |  |  | 				# no such job id | 
					
						
							|  |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 		elif self.path == "/clear": | 
					
						
							|  |  |  | 			# cancel all jobs | 
					
						
							|  |  |  | 			self.server.stats("", "Clearing jobs") | 
					
						
							|  |  |  | 			self.server.clear() | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							|  |  |  | 			self.send_head() | 
					
						
							|  |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/reset": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			job_id = self.headers.get('job-id', "") | 
					
						
							|  |  |  | 			job_frame = int(self.headers.get('job-frame', "-1")) | 
					
						
							|  |  |  | 			all = bool(self.headers.get('reset-all', "False")) | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			if job: | 
					
						
							|  |  |  | 				if job_frame != -1: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					 | 
					
						
							|  |  |  | 					frame = job[job_frame] | 
					
						
							|  |  |  | 					if frame: | 
					
						
							|  |  |  | 						self.server.stats("", "Reset job frame") | 
					
						
							|  |  |  | 						frame.reset(all) | 
					
						
							|  |  |  | 						self.send_head() | 
					
						
							|  |  |  | 					else: | 
					
						
							|  |  |  | 						# no such frame | 
					
						
							|  |  |  | 						self.send_head(http.client.NO_CONTENT) | 
					
						
							|  |  |  | 						 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				else: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					self.server.stats("", "Reset job") | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 					job.reset(all) | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					self.send_head() | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 					 | 
					
						
							|  |  |  | 			else: # job not found | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/slave": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			length = int(self.headers['content-length']) | 
					
						
							|  |  |  | 			job_frame_string = self.headers['job-frame'] | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			self.server.stats("", "New slave connected") | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-08-30 02:40:42 +00:00
										 |  |  | 			slave_info = netrender.model.RenderSlave.materialize(eval(str(self.rfile.read(length), encoding='utf8'))) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-08-30 02:40:42 +00:00
										 |  |  | 			slave_id = self.server.addSlave(slave_info.name, self.client_address, slave_info.stats) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			self.send_head(headers = {"slave-id": slave_id}) | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/log": | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 			slave_id = self.headers['slave-id'] | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			slave = self.server.getSeenSlave(slave_id) | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			if slave: # only if slave id is valid | 
					
						
							|  |  |  | 				length = int(self.headers['content-length']) | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				log_info = netrender.model.LogFile.materialize(eval(str(self.rfile.read(length), encoding='utf8'))) | 
					
						
							|  |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				job = self.server.getJobID(log_info.job_id) | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 				 | 
					
						
							|  |  |  | 				if job: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					self.server.stats("", "Log announcement") | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 					job.addLog(log_info.frames) | 
					
						
							|  |  |  | 					self.send_head(http.client.OK) | 
					
						
							|  |  |  | 				else: | 
					
						
							|  |  |  | 					# no such job id | 
					
						
							|  |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							|  |  |  | 			else: # invalid slave id | 
					
						
							|  |  |  | 				self.send_head(http.client.NO_CONTENT)	 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | 
					
						
							|  |  |  | 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							|  |  |  | 	def do_PUT(self): | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		if self.path == "/file": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			self.server.stats("", "Receiving job") | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			length = int(self.headers['content-length']) | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 			job_id = self.headers['job-id'] | 
					
						
							|  |  |  | 			job_file = self.headers['job-file'] | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 			if job: | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				render_file = job.files_map.get(job_file, None) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				if render_file: | 
					
						
							| 
									
										
										
										
											2009-09-16 19:47:58 +00:00
										 |  |  | 					main_file = job.files[0][0] # filename of the first file | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 					 | 
					
						
							|  |  |  | 					main_path, main_name = os.path.split(main_file) | 
					
						
							|  |  |  | 					 | 
					
						
							|  |  |  | 					if job_file != main_file: | 
					
						
							|  |  |  | 						file_path = prefixPath(job.save_path, job_file, main_path) | 
					
						
							|  |  |  | 					else: | 
					
						
							|  |  |  | 						file_path = job.save_path + main_name | 
					
						
							|  |  |  | 					 | 
					
						
							|  |  |  | 					buf = self.rfile.read(length) | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-08 01:18:06 +00:00
										 |  |  | 					# add same temp file + renames as slave | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 					f = open(file_path, "wb") | 
					
						
							|  |  |  | 					f.write(buf) | 
					
						
							|  |  |  | 					f.close() | 
					
						
							|  |  |  | 					del buf | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-16 19:47:58 +00:00
										 |  |  | 					render_file.filepath = file_path # set the new path | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 					 | 
					
						
							|  |  |  | 					if job.testStart(): | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 						self.server.stats("", "File upload, starting job") | 
					
						
							| 
									
										
										
										
											2009-09-16 19:47:58 +00:00
										 |  |  | 						self.send_head(http.client.OK) | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 					else: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 						self.server.stats("", "File upload, file missings") | 
					
						
							| 
									
										
										
										
											2009-09-16 19:47:58 +00:00
										 |  |  | 						self.send_head(http.client.ACCEPTED) | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				else: # invalid file | 
					
						
							|  |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							|  |  |  | 			else: # job not found | 
					
						
							|  |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/render": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			self.server.stats("", "Receiving render result") | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-09 20:56:49 +00:00
										 |  |  | 			slave_id = self.headers['slave-id'] | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			slave = self.server.getSeenSlave(slave_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-09 20:56:49 +00:00
										 |  |  | 			if slave: # only if slave id is valid | 
					
						
							|  |  |  | 				job_id = self.headers['job-id'] | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 				job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-09 20:56:49 +00:00
										 |  |  | 				if job: | 
					
						
							|  |  |  | 					job_frame = int(self.headers['job-frame']) | 
					
						
							|  |  |  | 					job_result = int(self.headers['job-result']) | 
					
						
							|  |  |  | 					job_time = float(self.headers['job-time']) | 
					
						
							|  |  |  | 					 | 
					
						
							|  |  |  | 					frame = job[job_frame] | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					if frame: | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 						if job.type == netrender.model.JOB_BLENDER: | 
					
						
							|  |  |  | 							if job_result == DONE: | 
					
						
							|  |  |  | 								length = int(self.headers['content-length']) | 
					
						
							|  |  |  | 								buf = self.rfile.read(length) | 
					
						
							|  |  |  | 								f = open(job.save_path + "%04d" % job_frame + ".exr", 'wb') | 
					
						
							|  |  |  | 								f.write(buf) | 
					
						
							|  |  |  | 								f.close() | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 							 | 
					
						
							| 
									
										
										
										
											2009-10-01 18:57:22 +00:00
										 |  |  | 								del buf | 
					
						
							|  |  |  | 							elif job_result == ERROR: | 
					
						
							|  |  |  | 								# blacklist slave on this job on error | 
					
						
							|  |  |  | 								job.blacklist.append(slave.id) | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 						 | 
					
						
							|  |  |  | 						self.server.stats("", "Receiving result") | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						slave.finishedFrame(job_frame) | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						frame.status = job_result | 
					
						
							|  |  |  | 						frame.time = job_time | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 						job.testFinished() | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 						self.send_head() | 
					
						
							|  |  |  | 					else: # frame not found | 
					
						
							|  |  |  | 						self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-09-09 20:56:49 +00:00
										 |  |  | 				else: # job not found | 
					
						
							|  |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							|  |  |  | 			else: # invalid slave id | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		elif self.path == "/log": | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			self.server.stats("", "Receiving log file") | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			job_id = self.headers['job-id'] | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			job = self.server.getJobID(job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 			if job: | 
					
						
							|  |  |  | 				job_frame = int(self.headers['job-frame']) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 				frame = job[job_frame] | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 				 | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 				if frame and frame.log_path: | 
					
						
							|  |  |  | 					length = int(self.headers['content-length']) | 
					
						
							|  |  |  | 					buf = self.rfile.read(length) | 
					
						
							|  |  |  | 					f = open(frame.log_path, 'ab') | 
					
						
							|  |  |  | 					f.write(buf) | 
					
						
							|  |  |  | 					f.close() | 
					
						
							|  |  |  | 						 | 
					
						
							|  |  |  | 					del buf | 
					
						
							|  |  |  | 					 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 					self.server.getSeenSlave(self.headers['slave-id']) | 
					
						
							| 
									
										
										
										
											2009-09-18 03:29:50 +00:00
										 |  |  | 					 | 
					
						
							|  |  |  | 					self.send_head() | 
					
						
							|  |  |  | 				else: # frame not found | 
					
						
							|  |  |  | 					self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 			else: # job not found | 
					
						
							|  |  |  | 				self.send_head(http.client.NO_CONTENT) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class RenderMasterServer(http.server.HTTPServer): | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 	def __init__(self, address, handler_class, path): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		super().__init__(address, handler_class) | 
					
						
							|  |  |  | 		self.jobs = [] | 
					
						
							|  |  |  | 		self.jobs_map = {} | 
					
						
							|  |  |  | 		self.slaves = [] | 
					
						
							|  |  |  | 		self.slaves_map = {} | 
					
						
							| 
									
										
										
										
											2009-08-30 02:40:42 +00:00
										 |  |  | 		self.job_id = 0 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 		self.path = path + "master_" + str(os.getpid()) + os.sep | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 		self.slave_timeout = 2 | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		self.balancer = netrender.balancing.Balancer() | 
					
						
							| 
									
										
										
										
											2009-09-24 21:05:54 +00:00
										 |  |  | 		self.balancer.addRule(netrender.balancing.RatingUsage()) | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		self.balancer.addException(netrender.balancing.ExcludeQueuedEmptyJob()) | 
					
						
							| 
									
										
										
										
											2009-09-24 21:05:54 +00:00
										 |  |  | 		self.balancer.addException(netrender.balancing.ExcludeSlavesLimit(self.countJobs, self.countSlaves, limit = 0.9)) | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		self.balancer.addPriority(netrender.balancing.NewJobPriority()) | 
					
						
							| 
									
										
										
										
											2009-09-23 21:46:29 +00:00
										 |  |  | 		self.balancer.addPriority(netrender.balancing.MinimumTimeBetweenDispatchPriority(limit = 2)) | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 		if not os.path.exists(self.path): | 
					
						
							|  |  |  | 			os.mkdir(self.path) | 
					
						
							| 
									
										
										
										
											2009-08-30 02:40:42 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def nextJobID(self): | 
					
						
							|  |  |  | 		self.job_id += 1 | 
					
						
							|  |  |  | 		return str(self.job_id) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-01 01:09:05 +00:00
										 |  |  | 	def addSlave(self, name, address, stats): | 
					
						
							|  |  |  | 		slave = MRenderSlave(name, address, stats) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		self.slaves.append(slave) | 
					
						
							|  |  |  | 		self.slaves_map[slave.id] = slave | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		return slave.id | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 	def removeSlave(self, slave): | 
					
						
							|  |  |  | 		self.slaves.remove(slave) | 
					
						
							|  |  |  | 		self.slaves_map.pop(slave.id) | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	def getSlave(self, slave_id): | 
					
						
							|  |  |  | 		return self.slaves_map.get(slave_id, None) | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 	def getSeenSlave(self, slave_id): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		slave = self.getSlave(slave_id) | 
					
						
							|  |  |  | 		if slave: | 
					
						
							|  |  |  | 			slave.seen() | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 		return slave | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 	def timeoutSlaves(self): | 
					
						
							|  |  |  | 		removed = [] | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		t = time.time() | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		for slave in self.slaves: | 
					
						
							|  |  |  | 			if (t - slave.last_seen) / 60 > self.slave_timeout: | 
					
						
							|  |  |  | 				removed.append(slave) | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				if slave.job: | 
					
						
							|  |  |  | 					for f in slave.job_frames: | 
					
						
							|  |  |  | 						slave.job[f].status = ERROR | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 		for slave in removed: | 
					
						
							|  |  |  | 			self.removeSlave(slave) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def updateUsage(self): | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 		blend = 0.5 | 
					
						
							|  |  |  | 		for job in self.jobs: | 
					
						
							|  |  |  | 			job.usage *= (1 - blend) | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 		if self.slaves: | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 			slave_usage = blend / self.countSlaves() | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 			 | 
					
						
							|  |  |  | 			for slave in self.slaves: | 
					
						
							|  |  |  | 				if slave.job: | 
					
						
							|  |  |  | 					slave.job.usage += slave_usage | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	def clear(self): | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 		removed = self.jobs[:] | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		for job in removed: | 
					
						
							|  |  |  | 			self.removeJob(job) | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 	def balance(self): | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 		self.balancer.balance(self.jobs) | 
					
						
							| 
									
										
										
										
											2009-09-21 16:01:31 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def countJobs(self, status = JOB_QUEUED): | 
					
						
							|  |  |  | 		total = 0 | 
					
						
							|  |  |  | 		for j in self.jobs: | 
					
						
							|  |  |  | 			if j.status == status: | 
					
						
							|  |  |  | 				total += 1 | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-09-21 16:01:31 +00:00
										 |  |  | 		return total | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def countSlaves(self): | 
					
						
							|  |  |  | 		return len(self.slaves) | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 	def removeJob(self, job): | 
					
						
							|  |  |  | 		self.jobs.remove(job) | 
					
						
							|  |  |  | 		self.jobs_map.pop(job.id) | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		for slave in self.slaves: | 
					
						
							|  |  |  | 			if slave.job == job: | 
					
						
							|  |  |  | 				slave.job = None | 
					
						
							|  |  |  | 				slave.job_frames = [] | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def addJob(self, job): | 
					
						
							|  |  |  | 		self.jobs.append(job) | 
					
						
							|  |  |  | 		self.jobs_map[job.id] = job | 
					
						
							| 
									
										
										
										
											2009-09-02 00:07:55 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		# create job directory | 
					
						
							|  |  |  | 		job.save_path = self.path + "job_" + job.id + os.sep | 
					
						
							|  |  |  | 		if not os.path.exists(job.save_path): | 
					
						
							|  |  |  | 			os.mkdir(job.save_path) | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 		job.save() | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 	def getJobID(self, id): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		return self.jobs_map.get(id, None) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def __iter__(self): | 
					
						
							|  |  |  | 		for job in self.jobs: | 
					
						
							|  |  |  | 			yield job | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-26 16:22:52 +00:00
										 |  |  | 	def newDispatch(self, slave_id): | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 		if self.jobs: | 
					
						
							| 
									
										
										
										
											2009-09-19 22:11:26 +00:00
										 |  |  | 			for job in self.jobs: | 
					
						
							|  |  |  | 				if not self.balancer.applyExceptions(job) and slave_id not in job.blacklist: | 
					
						
							| 
									
										
										
										
											2009-08-29 17:25:22 +00:00
										 |  |  | 					return job, job.getFrames() | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		return None, None | 
					
						
							| 
									
										
										
										
											2009-09-15 19:53:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def runMaster(address, broadcast, path, update_stats, test_break): | 
					
						
							|  |  |  | 		httpd = RenderMasterServer(address, RenderHandler, path) | 
					
						
							|  |  |  | 		httpd.timeout = 1 | 
					
						
							|  |  |  | 		httpd.stats = update_stats | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		if broadcast: | 
					
						
							|  |  |  | 			s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | 
					
						
							|  |  |  | 			s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			start_time = time.time() | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 		while not test_break(): | 
					
						
							|  |  |  | 			httpd.handle_request() | 
					
						
							|  |  |  | 			 | 
					
						
							| 
									
										
										
										
											2009-09-24 19:52:32 +00:00
										 |  |  | 			if time.time() - start_time >= 10: # need constant here | 
					
						
							|  |  |  | 				httpd.timeoutSlaves() | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				httpd.updateUsage() | 
					
						
							|  |  |  | 				 | 
					
						
							|  |  |  | 				if broadcast: | 
					
						
							|  |  |  | 						print("broadcasting address") | 
					
						
							|  |  |  | 						s.sendto(bytes("%i" % address[1], encoding='utf8'), 0, ('<broadcast>', 8000)) | 
					
						
							|  |  |  | 						start_time = time.time() |