diff options
Diffstat (limited to 'bitbake/lib/bb/tinfoil.py')
-rw-r--r-- | bitbake/lib/bb/tinfoil.py | 115 |
1 files changed, 55 insertions, 60 deletions
diff --git a/bitbake/lib/bb/tinfoil.py b/bitbake/lib/bb/tinfoil.py index 70b381e351..4fbad0774e 100644 --- a/bitbake/lib/bb/tinfoil.py +++ b/bitbake/lib/bb/tinfoil.py | |||
@@ -13,6 +13,7 @@ import sys | |||
13 | import atexit | 13 | import atexit |
14 | import re | 14 | import re |
15 | from collections import OrderedDict, defaultdict | 15 | from collections import OrderedDict, defaultdict |
16 | from functools import partial | ||
16 | 17 | ||
17 | import bb.cache | 18 | import bb.cache |
18 | import bb.cooker | 19 | import bb.cooker |
@@ -44,66 +45,64 @@ class TinfoilUIException(Exception): | |||
44 | class TinfoilCommandFailed(Exception): | 45 | class TinfoilCommandFailed(Exception): |
45 | """Exception raised when run_command fails""" | 46 | """Exception raised when run_command fails""" |
46 | 47 | ||
48 | class TinfoilDataStoreConnectorVarHistory: | ||
49 | def __init__(self, tinfoil, dsindex): | ||
50 | self.tinfoil = tinfoil | ||
51 | self.dsindex = dsindex | ||
52 | |||
53 | def remoteCommand(self, cmd, *args, **kwargs): | ||
54 | return self.tinfoil.run_command('dataStoreConnectorVarHistCmd', self.dsindex, cmd, args, kwargs) | ||
55 | |||
56 | def __getattr__(self, name): | ||
57 | if not hasattr(bb.data_smart.VariableHistory, name): | ||
58 | raise AttributeError("VariableHistory has no such method %s" % name) | ||
59 | |||
60 | newfunc = partial(self.remoteCommand, name) | ||
61 | setattr(self, name, newfunc) | ||
62 | return newfunc | ||
63 | |||
64 | class TinfoilDataStoreConnectorIncHistory: | ||
65 | def __init__(self, tinfoil, dsindex): | ||
66 | self.tinfoil = tinfoil | ||
67 | self.dsindex = dsindex | ||
68 | |||
69 | def remoteCommand(self, cmd, *args, **kwargs): | ||
70 | return self.tinfoil.run_command('dataStoreConnectorIncHistCmd', self.dsindex, cmd, args, kwargs) | ||
71 | |||
72 | def __getattr__(self, name): | ||
73 | if not hasattr(bb.data_smart.IncludeHistory, name): | ||
74 | raise AttributeError("IncludeHistory has no such method %s" % name) | ||
75 | |||
76 | newfunc = partial(self.remoteCommand, name) | ||
77 | setattr(self, name, newfunc) | ||
78 | return newfunc | ||
79 | |||
47 | class TinfoilDataStoreConnector: | 80 | class TinfoilDataStoreConnector: |
48 | """Connector object used to enable access to datastore objects via tinfoil""" | 81 | """ |
82 | Connector object used to enable access to datastore objects via tinfoil | ||
83 | Method calls are transmitted to the remote datastore for processing, if a datastore is | ||
84 | returned we return a connector object for the new store | ||
85 | """ | ||
49 | 86 | ||
50 | def __init__(self, tinfoil, dsindex): | 87 | def __init__(self, tinfoil, dsindex): |
51 | self.tinfoil = tinfoil | 88 | self.tinfoil = tinfoil |
52 | self.dsindex = dsindex | 89 | self.dsindex = dsindex |
53 | def getVar(self, name): | 90 | self.varhistory = TinfoilDataStoreConnectorVarHistory(tinfoil, dsindex) |
54 | value = self.tinfoil.run_command('dataStoreConnectorFindVar', self.dsindex, name) | 91 | self.inchistory = TinfoilDataStoreConnectorIncHistory(tinfoil, dsindex) |
55 | overrides = None | 92 | |
56 | if isinstance(value, dict): | 93 | def remoteCommand(self, cmd, *args, **kwargs): |
57 | if '_connector_origtype' in value: | 94 | ret = self.tinfoil.run_command('dataStoreConnectorCmd', self.dsindex, cmd, args, kwargs) |
58 | value['_content'] = self.tinfoil._reconvert_type(value['_content'], value['_connector_origtype']) | 95 | if isinstance(ret, bb.command.DataStoreConnectionHandle): |
59 | del value['_connector_origtype'] | 96 | return TinfoilDataStoreConnector(self.tinfoil, ret.dsindex) |
60 | if '_connector_overrides' in value: | ||
61 | overrides = value['_connector_overrides'] | ||
62 | del value['_connector_overrides'] | ||
63 | return value, overrides | ||
64 | def getKeys(self): | ||
65 | return set(self.tinfoil.run_command('dataStoreConnectorGetKeys', self.dsindex)) | ||
66 | def getVarHistory(self, name): | ||
67 | return self.tinfoil.run_command('dataStoreConnectorGetVarHistory', self.dsindex, name) | ||
68 | def expandPythonRef(self, varname, expr, d): | ||
69 | ds = bb.remotedata.RemoteDatastores.transmit_datastore(d) | ||
70 | ret = self.tinfoil.run_command('dataStoreConnectorExpandPythonRef', ds, varname, expr) | ||
71 | return ret | 97 | return ret |
72 | def setVar(self, varname, value): | 98 | |
73 | if self.dsindex is None: | 99 | def __getattr__(self, name): |
74 | self.tinfoil.run_command('setVariable', varname, value) | 100 | if not hasattr(bb.data._dict_type, name): |
75 | else: | 101 | raise AttributeError("Data store has no such method %s" % name) |
76 | # Not currently implemented - indicate that setting should | 102 | |
77 | # be redirected to local side | 103 | newfunc = partial(self.remoteCommand, name) |
78 | return True | 104 | setattr(self, name, newfunc) |
79 | def setVarFlag(self, varname, flagname, value): | 105 | return newfunc |
80 | if self.dsindex is None: | ||
81 | self.tinfoil.run_command('dataStoreConnectorSetVarFlag', self.dsindex, varname, flagname, value) | ||
82 | else: | ||
83 | # Not currently implemented - indicate that setting should | ||
84 | # be redirected to local side | ||
85 | return True | ||
86 | def delVar(self, varname): | ||
87 | if self.dsindex is None: | ||
88 | self.tinfoil.run_command('dataStoreConnectorDelVar', self.dsindex, varname) | ||
89 | else: | ||
90 | # Not currently implemented - indicate that setting should | ||
91 | # be redirected to local side | ||
92 | return True | ||
93 | def delVarFlag(self, varname, flagname): | ||
94 | if self.dsindex is None: | ||
95 | self.tinfoil.run_command('dataStoreConnectorDelVar', self.dsindex, varname, flagname) | ||
96 | else: | ||
97 | # Not currently implemented - indicate that setting should | ||
98 | # be redirected to local side | ||
99 | return True | ||
100 | def renameVar(self, name, newname): | ||
101 | if self.dsindex is None: | ||
102 | self.tinfoil.run_command('dataStoreConnectorRenameVar', self.dsindex, name, newname) | ||
103 | else: | ||
104 | # Not currently implemented - indicate that setting should | ||
105 | # be redirected to local side | ||
106 | return True | ||
107 | 106 | ||
108 | class TinfoilCookerAdapter: | 107 | class TinfoilCookerAdapter: |
109 | """ | 108 | """ |
@@ -412,9 +411,7 @@ class Tinfoil: | |||
412 | self.run_actions(config_params) | 411 | self.run_actions(config_params) |
413 | self.recipes_parsed = True | 412 | self.recipes_parsed = True |
414 | 413 | ||
415 | self.config_data = bb.data.init() | 414 | self.config_data = TinfoilDataStoreConnector(self, 0) |
416 | connector = TinfoilDataStoreConnector(self, None) | ||
417 | self.config_data.setVar('_remote_data', connector) | ||
418 | self.cooker = TinfoilCookerAdapter(self) | 415 | self.cooker = TinfoilCookerAdapter(self) |
419 | self.cooker_data = self.cooker.recipecaches[''] | 416 | self.cooker_data = self.cooker.recipecaches[''] |
420 | else: | 417 | else: |
@@ -842,9 +839,7 @@ class Tinfoil: | |||
842 | newobj = origtype(obj) | 839 | newobj = origtype(obj) |
843 | 840 | ||
844 | if isinstance(newobj, bb.command.DataStoreConnectionHandle): | 841 | if isinstance(newobj, bb.command.DataStoreConnectionHandle): |
845 | connector = TinfoilDataStoreConnector(self, newobj.dsindex) | 842 | newobj = TinfoilDataStoreConnector(self, newobj.dsindex) |
846 | newobj = bb.data.init() | ||
847 | newobj.setVar('_remote_data', connector) | ||
848 | 843 | ||
849 | return newobj | 844 | return newobj |
850 | 845 | ||