diff options
author | Alexandru DAMIAN <alexandru.damian@intel.com> | 2013-09-18 13:15:47 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-09-22 12:19:43 +0100 |
commit | ba83eb315d1462e096e2d6682d246cbbe260b4c0 (patch) | |
tree | 7b0bf6ac84989275df250d76e1d1097fdd9bd0aa /bitbake/lib/bb/server | |
parent | 87e86d4fd3a22627bf5a7eff20d8551cb1e67452 (diff) | |
download | poky-ba83eb315d1462e096e2d6682d246cbbe260b4c0.tar.gz |
bitbake: bitbake: cooker,xmlrpc,servers: implement CookerFeatures
Implementing feature set selection that allows a client
to enable specific features in the server at connection time.
Only enabling of features is supported, as there is
no way to safely remove data loaded into the cooker.
Once enabled, a feature will remain enabled for the
life of the cooker.
Client-server connection now supports specifying the feature
set required by the client. This is implemented in the Process
server using a managed proxy list, so the server cooker
will now load dynamically needed features based on what client
connects to it.
In the XMLRPC server the feature set is requested by
using a parameter for registerUIHandler function.
This allows observer-only clients to also specify features
for the server.
The server code configuration now is completly separated
from the client code. All hardcoding of client knowledge is
removed from the server.
The extra_caches is removed as the client can now specify
the caches it needs using the feature. The UI modules
now need to specify the desired featureSet. HOB is modified
to conform to the featureSet specification.
The only feature available is CookerFeatures.HOB_EXTRA_CACHES
which forces loading the bb.cache_extra:HobRecipeInfo class.
(Bitbake rev: 98e594837aab89ea042cfa9f3740d20a661b14e2)
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/server')
-rw-r--r-- | bitbake/lib/bb/server/__init__.py | 2 | ||||
-rw-r--r-- | bitbake/lib/bb/server/process.py | 23 | ||||
-rw-r--r-- | bitbake/lib/bb/server/xmlrpc.py | 29 |
3 files changed, 41 insertions, 13 deletions
diff --git a/bitbake/lib/bb/server/__init__.py b/bitbake/lib/bb/server/__init__.py index 2e1c619b54..da5e480740 100644 --- a/bitbake/lib/bb/server/__init__.py +++ b/bitbake/lib/bb/server/__init__.py | |||
@@ -89,7 +89,7 @@ class BitBakeBaseServer(object): | |||
89 | def detach(self): | 89 | def detach(self): |
90 | return | 90 | return |
91 | 91 | ||
92 | def establishConnection(self): | 92 | def establishConnection(self, featureset): |
93 | raise "Must redefine the %s.establishConnection()" % self.__class__.__name__ | 93 | raise "Must redefine the %s.establishConnection()" % self.__class__.__name__ |
94 | 94 | ||
95 | def endSession(self): | 95 | def endSession(self): |
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index e45e0c2f6d..aa072020af 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
@@ -31,7 +31,7 @@ import sys | |||
31 | import time | 31 | import time |
32 | import select | 32 | import select |
33 | from Queue import Empty | 33 | from Queue import Empty |
34 | from multiprocessing import Event, Process, util, Queue, Pipe, queues | 34 | from multiprocessing import Event, Process, util, Queue, Pipe, queues, Manager |
35 | 35 | ||
36 | from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer | 36 | from . import BitBakeBaseServer, BitBakeBaseServerConnection, BaseImplServer |
37 | 37 | ||
@@ -78,12 +78,13 @@ class ProcessServer(Process, BaseImplServer): | |||
78 | profile_filename = "profile.log" | 78 | profile_filename = "profile.log" |
79 | profile_processed_filename = "profile.log.processed" | 79 | profile_processed_filename = "profile.log.processed" |
80 | 80 | ||
81 | def __init__(self, command_channel, event_queue): | 81 | def __init__(self, command_channel, event_queue, featurelist): |
82 | BaseImplServer.__init__(self) | 82 | BaseImplServer.__init__(self) |
83 | Process.__init__(self) | 83 | Process.__init__(self, args=(featurelist)) |
84 | self.command_channel = command_channel | 84 | self.command_channel = command_channel |
85 | self.event_queue = event_queue | 85 | self.event_queue = event_queue |
86 | self.event = EventAdapter(event_queue) | 86 | self.event = EventAdapter(event_queue) |
87 | self.featurelist = featurelist | ||
87 | self.quit = False | 88 | self.quit = False |
88 | 89 | ||
89 | self.keep_running = Event() | 90 | self.keep_running = Event() |
@@ -94,6 +95,14 @@ class ProcessServer(Process, BaseImplServer): | |||
94 | for event in bb.event.ui_queue: | 95 | for event in bb.event.ui_queue: |
95 | self.event_queue.put(event) | 96 | self.event_queue.put(event) |
96 | self.event_handle.value = bb.event.register_UIHhandler(self) | 97 | self.event_handle.value = bb.event.register_UIHhandler(self) |
98 | |||
99 | # process any feature changes based on what UI requested | ||
100 | original_featureset = list(self.cooker.featureset) | ||
101 | while len(self.featurelist)> 0: | ||
102 | self.cooker.featureset.setFeature(self.featurelist.pop()) | ||
103 | if (original_featureset != list(self.cooker.featureset)): | ||
104 | self.cooker.reset() | ||
105 | |||
97 | bb.cooker.server_main(self.cooker, self.main) | 106 | bb.cooker.server_main(self.cooker, self.main) |
98 | 107 | ||
99 | def main(self): | 108 | def main(self): |
@@ -198,13 +207,17 @@ class BitBakeServer(BitBakeBaseServer): | |||
198 | # | 207 | # |
199 | self.ui_channel, self.server_channel = Pipe() | 208 | self.ui_channel, self.server_channel = Pipe() |
200 | self.event_queue = ProcessEventQueue(0) | 209 | self.event_queue = ProcessEventQueue(0) |
201 | self.serverImpl = ProcessServer(self.server_channel, self.event_queue) | 210 | manager = Manager() |
211 | self.featurelist = manager.list() | ||
212 | self.serverImpl = ProcessServer(self.server_channel, self.event_queue, self.featurelist) | ||
202 | 213 | ||
203 | def detach(self): | 214 | def detach(self): |
204 | self.serverImpl.start() | 215 | self.serverImpl.start() |
205 | return | 216 | return |
206 | 217 | ||
207 | def establishConnection(self): | 218 | def establishConnection(self, featureset): |
219 | for f in featureset: | ||
220 | self.featurelist.append(f) | ||
208 | self.connection = BitBakeProcessServerConnection(self.serverImpl, self.ui_channel, self.event_queue) | 221 | self.connection = BitBakeProcessServerConnection(self.serverImpl, self.ui_channel, self.event_queue) |
209 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate()) | 222 | signal.signal(signal.SIGTERM, lambda i, s: self.connection.terminate()) |
210 | return self.connection | 223 | return self.connection |
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py index 8326623520..389327a60f 100644 --- a/bitbake/lib/bb/server/xmlrpc.py +++ b/bitbake/lib/bb/server/xmlrpc.py | |||
@@ -89,12 +89,23 @@ class BitBakeServerCommands(): | |||
89 | self.server = server | 89 | self.server = server |
90 | self.has_client = False | 90 | self.has_client = False |
91 | 91 | ||
92 | def registerEventHandler(self, host, port): | 92 | def registerEventHandler(self, host, port, featureset = []): |
93 | """ | 93 | """ |
94 | Register a remote UI Event Handler | 94 | Register a remote UI Event Handler |
95 | """ | 95 | """ |
96 | s, t = _create_server(host, port) | 96 | s, t = _create_server(host, port) |
97 | 97 | ||
98 | # we don't allow connections if the cooker is running | ||
99 | if (self.cooker.state in [bb.cooker.state.parsing, bb.cooker.state.running]): | ||
100 | return None | ||
101 | |||
102 | original_featureset = list(self.cooker.featureset) | ||
103 | for f in featureset: | ||
104 | self.cooker.featureset.setFeature(f) | ||
105 | |||
106 | if (original_featureset != list(self.cooker.featureset)): | ||
107 | self.cooker.reset() | ||
108 | |||
98 | self.event_handle = bb.event.register_UIHhandler(s) | 109 | self.event_handle = bb.event.register_UIHhandler(s) |
99 | return self.event_handle | 110 | return self.event_handle |
100 | 111 | ||
@@ -263,11 +274,12 @@ class XMLRPCServer(SimpleXMLRPCServer, BaseImplServer): | |||
263 | self.connection_token = token | 274 | self.connection_token = token |
264 | 275 | ||
265 | class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): | 276 | class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): |
266 | def __init__(self, serverImpl, clientinfo=("localhost", 0), observer_only = False): | 277 | def __init__(self, serverImpl, clientinfo=("localhost", 0), observer_only = False, featureset = []): |
267 | self.connection, self.transport = _create_server(serverImpl.host, serverImpl.port) | 278 | self.connection, self.transport = _create_server(serverImpl.host, serverImpl.port) |
268 | self.clientinfo = clientinfo | 279 | self.clientinfo = clientinfo |
269 | self.serverImpl = serverImpl | 280 | self.serverImpl = serverImpl |
270 | self.observer_only = observer_only | 281 | self.observer_only = observer_only |
282 | self.featureset = featureset | ||
271 | 283 | ||
272 | def connect(self): | 284 | def connect(self): |
273 | if not self.observer_only: | 285 | if not self.observer_only: |
@@ -277,7 +289,8 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): | |||
277 | if token is None: | 289 | if token is None: |
278 | return None | 290 | return None |
279 | self.transport.set_connection_token(token) | 291 | self.transport.set_connection_token(token) |
280 | self.events = uievent.BBUIEventQueue(self.connection, self.clientinfo) | 292 | |
293 | self.events = uievent.BBUIEventQueue(self.connection, self.clientinfo, self.featureset) | ||
281 | for event in bb.event.ui_queue: | 294 | for event in bb.event.ui_queue: |
282 | self.events.queue_event(event) | 295 | self.events.queue_event(event) |
283 | return self | 296 | return self |
@@ -301,14 +314,15 @@ class BitBakeXMLRPCServerConnection(BitBakeBaseServerConnection): | |||
301 | 314 | ||
302 | class BitBakeServer(BitBakeBaseServer): | 315 | class BitBakeServer(BitBakeBaseServer): |
303 | def initServer(self, interface = ("localhost", 0)): | 316 | def initServer(self, interface = ("localhost", 0)): |
317 | self.interface = interface | ||
304 | self.serverImpl = XMLRPCServer(interface) | 318 | self.serverImpl = XMLRPCServer(interface) |
305 | 319 | ||
306 | def detach(self): | 320 | def detach(self): |
307 | daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log") | 321 | daemonize.createDaemon(self.serverImpl.serve_forever, "bitbake-cookerdaemon.log") |
308 | del self.cooker | 322 | del self.cooker |
309 | 323 | ||
310 | def establishConnection(self): | 324 | def establishConnection(self, featureset): |
311 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl) | 325 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, self.interface, False, featureset) |
312 | return self.connection.connect() | 326 | return self.connection.connect() |
313 | 327 | ||
314 | def set_connection_token(self, token): | 328 | def set_connection_token(self, token): |
@@ -318,12 +332,13 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): | |||
318 | 332 | ||
319 | def __init__(self, observer_only = False): | 333 | def __init__(self, observer_only = False): |
320 | self.observer_only = observer_only | 334 | self.observer_only = observer_only |
335 | # if we need extra caches, just tell the server to load them all | ||
321 | pass | 336 | pass |
322 | 337 | ||
323 | def saveConnectionDetails(self, remote): | 338 | def saveConnectionDetails(self, remote): |
324 | self.remote = remote | 339 | self.remote = remote |
325 | 340 | ||
326 | def establishConnection(self): | 341 | def establishConnection(self, featureset): |
327 | # The format of "remote" must be "server:port" | 342 | # The format of "remote" must be "server:port" |
328 | try: | 343 | try: |
329 | [host, port] = self.remote.split(":") | 344 | [host, port] = self.remote.split(":") |
@@ -340,7 +355,7 @@ class BitBakeXMLRPCClient(BitBakeBaseServer): | |||
340 | except: | 355 | except: |
341 | return None | 356 | return None |
342 | self.serverImpl = XMLRPCProxyServer(host, port) | 357 | self.serverImpl = XMLRPCProxyServer(host, port) |
343 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only) | 358 | self.connection = BitBakeXMLRPCServerConnection(self.serverImpl, (ip, 0), self.observer_only, featureset) |
344 | return self.connection.connect() | 359 | return self.connection.connect() |
345 | 360 | ||
346 | def endSession(self): | 361 | def endSession(self): |