Skip to content
This repository was archived by the owner on Sep 30, 2020. It is now read-only.

Commit 2cf24d7

Browse files
author
Marcin Kościelnicki
committed
Add triggers to the protocol.
1 parent 508a093 commit 2cf24d7

6 files changed

Lines changed: 65 additions & 2 deletions

File tree

python/veles/async_conn/tracer.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,19 @@ def get_bindata_size(self, id, key):
121121
return self._get_from_node(
122122
id, lambda node: self._get_bindata_size(node, key))
123123

124+
def _get_trigger(self, node, key):
125+
res = node.triggers.get(key)
126+
self.checks.append(check.CheckTrigger(
127+
node=node.id,
128+
key=key,
129+
state=res,
130+
))
131+
return res
132+
133+
def get_trigger(self, id, key):
134+
return self._get_from_node(
135+
id, lambda node: self._get_trigger(node, key))
136+
124137
async def _get_data(self, node, key, adata):
125138
try:
126139
res = await adata

python/veles/db/tracker.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ def _check_ok_bindata(self, el):
144144
data = self.get_bindata(el.node, el.key, el.start, el.end)
145145
return data == el.data
146146

147+
def _check_ok_trigger(self, el):
148+
node = self.get(el.node)
149+
return node.triggers.get(el.key) == el.state
150+
147151
def _check_ok_list(self, el):
148152
nodes = self.get_list_raw(el.parent, el.tags, el.pos_filter)
149153
return el.nodes == nodes
@@ -159,6 +163,7 @@ def checks_ok(self, checks):
159163
check.CheckData: self._check_ok_data,
160164
check.CheckBinDataSize: self._check_ok_bindata_size,
161165
check.CheckBinData: self._check_ok_bindata,
166+
check.CheckTrigger: self._check_ok_trigger,
162167
check.CheckList: self._check_ok_list,
163168
}
164169
try:
@@ -290,6 +295,18 @@ def _op_set_bindata(self, xact, op, dbnode):
290295
else:
291296
del dbnode.node.bindata[op.key]
292297

298+
def _op_add_trigger(self, xact, op, dbnode):
299+
if dbnode.node is None:
300+
raise ObjectGoneError()
301+
# XXX
302+
raise NotImplementedError
303+
304+
def _op_del_trigger(self, xact, op, dbnode):
305+
if dbnode.node is None:
306+
raise ObjectGoneError()
307+
# XXX
308+
raise NotImplementedError
309+
293310
def transaction(self, checks, ops):
294311
if not self.checks_ok(checks):
295312
raise PreconditionFailedError()
@@ -304,6 +321,8 @@ def transaction(self, checks, ops):
304321
operation.OperationSetAttr: self._op_set_attr,
305322
operation.OperationSetData: self._op_set_data,
306323
operation.OperationSetBinData: self._op_set_bindata,
324+
operation.OperationAddTrigger: self._op_add_trigger,
325+
operation.OperationDelTrigger: self._op_del_trigger,
307326
}
308327
for op in ops:
309328
dbnode = self.get_cached_node(op.node)

python/veles/proto/check.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from __future__ import unicode_literals
1616

1717
from veles.schema import model, fields
18-
from veles.proto.node import PosFilter
18+
from veles.proto.node import TriggerState, PosFilter
1919

2020

2121
class Check(model.PolymorphicModel):
@@ -92,6 +92,14 @@ class CheckBinData(Check):
9292
data = fields.Binary()
9393

9494

95+
class CheckTrigger(Check):
96+
object_type = 'trigger'
97+
98+
node = fields.NodeID()
99+
key = fields.String()
100+
state = fields.Enum(TriggerState, optional=True)
101+
102+
95103
class CheckList(Check):
96104
object_type = 'list'
97105

python/veles/proto/messages.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ class MsgCreate(MsgpackMsg):
303303
attr = fields.Map(fields.String(), fields.Any())
304304
data = fields.Map(fields.String(), fields.Any())
305305
bindata = fields.Map(fields.String(), fields.Binary())
306+
triggers = fields.Set(fields.String())
306307

307308

308309
class MsgDelete(MsgpackMsg):

python/veles/proto/node.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,16 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
from veles.schema import model, fields
15+
from veles.schema import model, fields, enumeration
1616
from veles.schema.nodeid import NodeID
1717

1818

19+
class TriggerState(enumeration.EnumModel):
20+
pending = 'pending'
21+
done = 'done'
22+
error = 'error'
23+
24+
1925
class Node(model.Model):
2026
"""
2127
Stores the lightweight data associated with a node, and an index of heavy
@@ -34,6 +40,9 @@ class Node(model.Model):
3440
this dict correspond to bindata keys, and the values are size of the
3541
corresponding binary data in bytes. The actual bindata has to
3642
be downloaded separately.
43+
- ``triggers``: a dict containing active triggers for the given node.
44+
The keys are trigger names, and they are mapped to the state of
45+
the given trigger.
3746
"""
3847

3948
id = fields.NodeID()
@@ -44,6 +53,7 @@ class Node(model.Model):
4453
attr = fields.Map(fields.String(), fields.Any())
4554
data = fields.Set(fields.String())
4655
bindata = fields.Map(fields.String(), fields.SmallUnsignedInteger())
56+
triggers = fields.Map(fields.String(), fields.Enum(TriggerState))
4757

4858

4959
class PosFilter(model.Model):

python/veles/proto/operation.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,15 @@ class OperationSetBinData(Operation):
8484
start = fields.SmallUnsignedInteger(default=0)
8585
data = fields.Binary()
8686
truncate = fields.Boolean(default=False)
87+
88+
89+
class OperationAddTrigger(Operation):
90+
object_type = 'add_trigger'
91+
92+
trigger = fields.String()
93+
94+
95+
class OperationDelTrigger(Operation):
96+
object_type = 'del_trigger'
97+
98+
trigger = fields.String()

0 commit comments

Comments
 (0)