summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-07-18 22:15:17 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-07-21 08:41:11 +0100
commit577b75086eaf4ae2201933f7b9ac32f6239867c6 (patch)
tree66486353161365955936a20338642c8f50dc15e8
parentdd71707d5a5a420a4406ce88164ac2a32cc04956 (diff)
downloadpoky-577b75086eaf4ae2201933f7b9ac32f6239867c6.tar.gz
bitbake: server: Remove base classes and inline code
In preparation for rewriting this code, expand the relatively useless base classes into the code itself. (Bitbake rev: a1c6151420d86bac658c08ae714647062edd6ef2) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--bitbake/lib/bb/server/__init__.py72
-rw-r--r--bitbake/lib/bb/server/process.py34
-rw-r--r--bitbake/lib/bb/server/xmlrpc.py60
3 files changed, 80 insertions, 86 deletions
diff --git a/bitbake/lib/bb/server/__init__.py b/bitbake/lib/bb/server/__init__.py
index 538a633fe5..345691e40f 100644
--- a/bitbake/lib/bb/server/__init__.py
+++ b/bitbake/lib/bb/server/__init__.py
@@ -25,75 +25,3 @@ approach to the interface, and minimize risks associated with code duplication.
25 25
26""" 26"""
27 27
28""" BaseImplServer() the base class for all XXServer() implementations.
29
30 These classes contain the actual code that runs the server side, i.e.
31 listens for the commands and executes them. Although these implementations
32 contain all the data of the original bitbake command, i.e the cooker instance,
33 they may well run on a different process or even machine.
34
35"""
36
37class BaseImplServer():
38 def __init__(self):
39 self._idlefuns = {}
40
41 def addcooker(self, cooker):
42 self.cooker = cooker
43
44 def register_idle_function(self, function, data):
45 """Register a function to be called while the server is idle"""
46 assert hasattr(function, '__call__')
47 self._idlefuns[function] = data
48
49
50
51""" BitBakeBaseServerConnection class is the common ancestor to all
52 BitBakeServerConnection classes.
53
54 These classes control the remote server. The only command currently
55 implemented is the terminate() command.
56
57"""
58
59class BitBakeBaseServerConnection():
60 def __init__(self, serverImpl):
61 pass
62
63 def terminate(self):
64 pass
65
66 def setupEventQueue(self):
67 pass
68
69
70""" BitBakeBaseServer class is the common ancestor to all Bitbake servers
71
72 Derive this class in order to implement a BitBakeServer which is the
73 controlling stub for the actual server implementation
74
75"""
76class BitBakeBaseServer(object):
77 def initServer(self):
78 self.serverImpl = None # we ensure a runtime crash if not overloaded
79 self.connection = None
80 return
81
82 def addcooker(self, cooker):
83 self.cooker = cooker
84 self.serverImpl.addcooker(cooker)
85
86 def getServerIdleCB(self):
87 return self.serverImpl.register_idle_function
88
89 def saveConnectionDetails(self):
90 return
91
92 def detach(self):
93 return
94
95 def establishConnection(self, featureset):
96 raise "Must redefine the %s.establishConnection()" % self.__class__.__name__
97
98 def endSession(self):
99 self.connection.terminate()
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index cfcd76495c..48da7fe46c 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -33,8 +33,6 @@ import select
33from queue import Empty 33from queue import Empty
34from multiprocessing import Event, Process, util, Queue, Pipe, queues, Manager 34from multiprocessing import Event, Process, util, Queue, Pipe, queues, Manager
35 35
36from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer
37
38logger = logging.getLogger('BitBake') 36logger = logging.getLogger('BitBake')
39 37
40class ServerCommunicator(): 38class ServerCommunicator():
@@ -85,12 +83,12 @@ class EventAdapter():
85 print("EventAdapter puked: %s" % str(err)) 83 print("EventAdapter puked: %s" % str(err))
86 84
87 85
88class ProcessServer(Process, BaseImplServer): 86class ProcessServer(Process):
89 profile_filename = "profile.log" 87 profile_filename = "profile.log"
90 profile_processed_filename = "profile.log.processed" 88 profile_processed_filename = "profile.log.processed"
91 89
92 def __init__(self, command_channel, event_queue, featurelist): 90 def __init__(self, command_channel, event_queue, featurelist):
93 BaseImplServer.__init__(self) 91 self._idlefuns = {}
94 Process.__init__(self) 92 Process.__init__(self)
95 self.command_channel = command_channel 93 self.command_channel = command_channel
96 self.event_queue = event_queue 94 self.event_queue = event_queue
@@ -208,7 +206,15 @@ class ProcessServer(Process, BaseImplServer):
208 self.quitin.send("quit") 206 self.quitin.send("quit")
209 self.quitin.close() 207 self.quitin.close()
210 208
211class BitBakeProcessServerConnection(BitBakeBaseServerConnection): 209 def addcooker(self, cooker):
210 self.cooker = cooker
211
212 def register_idle_function(self, function, data):
213 """Register a function to be called while the server is idle"""
214 assert hasattr(function, '__call__')
215 self._idlefuns[function] = data
216
217class BitBakeProcessServerConnection(object):
212 def __init__(self, serverImpl, ui_channel, event_queue): 218 def __init__(self, serverImpl, ui_channel, event_queue):
213 self.procserver = serverImpl 219 self.procserver = serverImpl
214 self.ui_channel = ui_channel 220 self.ui_channel = ui_channel
@@ -247,6 +253,9 @@ class BitBakeProcessServerConnection(BitBakeBaseServerConnection):
247 # fd leakage because isn't called on Queue.close() 253 # fd leakage because isn't called on Queue.close()
248 self.event_queue._writer.close() 254 self.event_queue._writer.close()
249 255
256 def setupEventQueue(self):
257 pass
258
250# Wrap Queue to provide API which isn't server implementation specific 259# Wrap Queue to provide API which isn't server implementation specific
251class ProcessEventQueue(multiprocessing.queues.Queue): 260class ProcessEventQueue(multiprocessing.queues.Queue):
252 def __init__(self, maxsize): 261 def __init__(self, maxsize):
@@ -279,7 +288,7 @@ class ProcessEventQueue(multiprocessing.queues.Queue):
279 sys.exit(1) 288 sys.exit(1)
280 return None 289 return None
281 290
282class BitBakeServer(BitBakeBaseServer): 291class BitBakeServer(object):
283 def initServer(self, single_use=True): 292 def initServer(self, single_use=True):
284 # establish communication channels. We use bidirectional pipes for 293 # establish communication channels. We use bidirectional pipes for
285 # ui <--> server command/response pairs 294 # ui <--> server command/response pairs
@@ -304,3 +313,16 @@ class BitBakeServer(BitBakeBaseServer):
304 raise BaseException(error) 313 raise BaseException(error)
305 signal.signal(signal.SIGTERM, lambda i, s: self.connection.sigterm_terminate()) 314 signal.signal(signal.SIGTERM, lambda i, s: self.connection.sigterm_terminate())
306 return self.connection 315 return self.connection
316
317 def addcooker(self, cooker):
318 self.cooker = cooker
319 self.serverImpl.addcooker(cooker)
320
321 def getServerIdleCB(self):
322 return self.serverImpl.register_idle_function
323
324 def saveConnectionDetails(self):
325 return
326
327 def endSession(self):
328 self.connection.terminate()
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py
index 1a475e04ba..6874765136 100644
--- a/bitbake/lib/bb/server/xmlrpc.py
+++ b/bitbake/lib/bb/server/xmlrpc.py
@@ -49,7 +49,6 @@ from xmlrpc.server import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
49import bb 49import bb
50from bb import daemonize 50from bb import daemonize
51from bb.ui import uievent 51from bb.ui import uievent
52from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer
53 52
54DEBUG = False 53DEBUG = False
55 54
@@ -193,15 +192,25 @@ class BitBakeXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
193 self.wfile.write(bytes(response, 'utf-8')) 192 self.wfile.write(bytes(response, 'utf-8'))
194 193
195 194
196class XMLRPCProxyServer(BaseImplServer): 195class XMLRPCProxyServer(object):
197 """ not a real working server, but a stub for a proxy server connection 196 """ not a real working server, but a stub for a proxy server connection
198 197
199 """ 198 """
200 def __init__(self, host, port, use_builtin_types=True): 199 def __init__(self, host, port, use_builtin_types=True):
201 self.host = host 200 self.host = host
202 self.port = port 201 self.port = port
202 self._idlefuns = {}
203 203
204class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): 204 def addcooker(self, cooker):
205 self.cooker = cooker
206
207 def register_idle_function(self, function, data):
208 """Register a function to be called while the server is idle"""
209 assert hasattr(function, '__call__')
210 self._idlefuns[function] = data
211
212
213class XMLRPCServer(SimpleXMLRPCServer):
205 # remove this when you're done with debugging 214 # remove this when you're done with debugging
206 # allow_reuse_address = True 215 # allow_reuse_address = True
207 216
@@ -209,7 +218,7 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
209 """ 218 """
210 Constructor 219 Constructor
211 """ 220 """
212 BaseImplServer.__init__(self) 221 self._idlefuns = {}
213 self.single_use = single_use 222 self.single_use = single_use
214 # Use auto port configuration 223 # Use auto port configuration
215 if (interface[1] == -1): 224 if (interface[1] == -1):
@@ -231,7 +240,7 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
231 self.next_heartbeat = time.time() 240 self.next_heartbeat = time.time()
232 241
233 def addcooker(self, cooker): 242 def addcooker(self, cooker):
234 BaseImplServer.addcooker(self, cooker) 243 self.cooker = cooker
235 self.commands.cooker = cooker 244 self.commands.cooker = cooker
236 245
237 def autoregister_all_functions(self, context, prefix): 246 def autoregister_all_functions(self, context, prefix):
@@ -335,7 +344,13 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer):
335 def set_connection_token(self, token): 344 def set_connection_token(self, token):
336 self.connection_token = token 345 self.connection_token = token
337 346
338class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): 347 def register_idle_function(self, function, data):
348 """Register a function to be called while the server is idle"""
349 assert hasattr(function, '__call__')
350 self._idlefuns[function] = data
351
352
353class BitBakeXMLRPCServerConnection(object):
339 def __init__(self, serverImpl, clientinfo=("localhost", 0), observer_only = False, featureset = None): 354 def __init__(self, serverImpl, clientinfo=("localhost", 0), observer_only = False, featureset = None):
340 self.connection, self.transport = _create_server(serverImpl.host, serverImpl.port) 355 self.connection, self.transport = _create_server(serverImpl.host, serverImpl.port)
341 self.clientinfo = clientinfo 356 self.clientinfo = clientinfo
@@ -388,7 +403,7 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection):
388 except: 403 except:
389 pass 404 pass
390 405
391class BitBakeServer(BitBakeBaseServer): 406class BitBakeServer(object):
392 def initServer(self, interface = ("localhost", 0), 407 def initServer(self, interface = ("localhost", 0),
393 single_use = False, idle_timeout=0): 408 single_use = False, idle_timeout=0):
394 self.interface = interface 409 self.interface = interface
@@ -405,7 +420,20 @@ class BitBakeServer(BitBakeBaseServer):
405 def set_connection_token(self, token): 420 def set_connection_token(self, token):
406 self.connection.transport.set_connection_token(token) 421 self.connection.transport.set_connection_token(token)
407 422
408class BitBakeXMLRPCClient(BitBakeBaseServer): 423 def addcooker(self, cooker):
424 self.cooker = cooker
425 self.serverImpl.addcooker(cooker)
426
427 def getServerIdleCB(self):
428 return self.serverImpl.register_idle_function
429
430 def saveConnectionDetails(self):
431 return
432
433 def endSession(self):
434 self.connection.terminate()
435
436class BitBakeXMLRPCClient(object):
409 437
410 def __init__(self, observer_only = False, token = None): 438 def __init__(self, observer_only = False, token = None):
411 self.token = token 439 self.token = token
@@ -446,3 +474,19 @@ class BitBakeXMLRPCClient(BitBakeBaseServer):
446 474
447 def endSession(self): 475 def endSession(self):
448 self.connection.removeClient() 476 self.connection.removeClient()
477
478 def initServer(self):
479 self.serverImpl = None
480 self.connection = None
481 return
482
483 def addcooker(self, cooker):
484 self.cooker = cooker
485 self.serverImpl.addcooker(cooker)
486
487 def getServerIdleCB(self):
488 return self.serverImpl.register_idle_function
489
490 def detach(self):
491 return
492