Skip to content

Commit c83904d

Browse files
rubelhassanRubel Hassan Mollikpfeairheller
authored
Make agent doers' tocks configurable from habitat config file (#265)
* Make agent doers' tocks configurable from habitat config file * Fix typo of naming in test_load_tocks_config --------- Co-authored-by: Rubel Hassan Mollik <[email protected]> Co-authored-by: Philip Feairheller <[email protected]>
1 parent 1232405 commit c83904d

File tree

4 files changed

+114
-41
lines changed

4 files changed

+114
-41
lines changed

src/keria/app/agenting.py

+56-40
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import os
99
from dataclasses import asdict
1010
from urllib.parse import urlparse, urljoin
11+
from types import MappingProxyType
1112

1213
import falcon
1314
from falcon import media
@@ -289,6 +290,8 @@ def __init__(self, hby, rgy, agentHab, agency, caid, **opts):
289290
self.agentHab = agentHab
290291
self.agency = agency
291292
self.caid = caid
293+
self.cfd = MappingProxyType(dict(self.hby.cf.get()) if self.hby.cf is not None else dict())
294+
self.tocks = MappingProxyType(self.cfd.get("tocks", {}))
292295

293296
self.swain = delegating.Anchorer(hby=hby, proxy=agentHab)
294297
self.counselor = Counselor(hby=hby, swain=self.swain, proxy=agentHab)
@@ -364,19 +367,25 @@ def __init__(self, hby, rgy, agentHab, agency, caid, **opts):
364367
local=True) # disable misfit escrow until we can add another parser for remote.
365368

366369
doers.extend([
367-
Initer(agentHab=agentHab, caid=caid),
368-
Querier(hby=hby, agentHab=agentHab, kvy=self.kvy, queries=self.queries),
370+
Initer(agentHab=agentHab, caid=caid, tock=self.tocks.get("initer", 0.0)),
371+
Querier(hby=hby, agentHab=agentHab, kvy=self.kvy, queries=self.queries,
372+
tock=self.tocks.get("querier", 0.0)),
369373
Escrower(kvy=self.kvy, rgy=self.rgy, rvy=self.rvy, tvy=self.tvy, exc=self.exc, vry=self.verifier,
370-
registrar=self.registrar, credentialer=self.credentialer),
371-
ParserDoer(kvy=self.kvy, parser=self.parser),
372-
Witnesser(receiptor=receiptor, witners=self.witners),
373-
Delegator(agentHab=agentHab, swain=self.swain, anchors=self.anchors),
374-
ExchangeSender(hby=hby, agentHab=agentHab, exc=self.exc, exchanges=self.exchanges),
375-
Granter(hby=hby, rgy=rgy, agentHab=agentHab, exc=self.exc, grants=self.grants),
376-
Admitter(hby=hby, witq=self.witq, psr=self.parser, agentHab=agentHab, exc=self.exc, admits=self.admits),
377-
GroupRequester(hby=hby, agentHab=agentHab, counselor=self.counselor, groups=self.groups),
378-
SeekerDoer(seeker=self.seeker, cues=self.verifier.cues),
379-
ExchangeCueDoer(seeker=self.exnseeker, cues=self.exc.cues, queries=self.queries)
374+
registrar=self.registrar, credentialer=self.credentialer, tock=self.tocks.get("escrower", 0.0)),
375+
ParserDoer(kvy=self.kvy, parser=self.parser, tock=self.tocks.get("parser", 0.0)),
376+
Witnesser(receiptor=receiptor, witners=self.witners, tock=self.tocks.get("witnesser", 0.0)),
377+
Delegator(agentHab=agentHab, swain=self.swain, anchors=self.anchors, tock=self.tocks.get("delegator", 0.0)),
378+
ExchangeSender(hby=hby, agentHab=agentHab, exc=self.exc, exchanges=self.exchanges,
379+
tock=self.tocks.get("exchangeSender", 0.0)),
380+
Granter(hby=hby, rgy=rgy, agentHab=agentHab, exc=self.exc, grants=self.grants,
381+
tock=self.tocks.get("granter", 0.0)),
382+
Admitter(hby=hby, witq=self.witq, psr=self.parser, agentHab=agentHab, exc=self.exc, admits=self.admits,
383+
tock=self.tocks.get("admitter", 0.0)),
384+
GroupRequester(hby=hby, agentHab=agentHab, counselor=self.counselor, groups=self.groups,
385+
tock=self.tocks.get("groupRequester", 0.0)),
386+
SeekerDoer(seeker=self.seeker, cues=self.verifier.cues, tock=self.tocks.get("seeker", 0.0)),
387+
ExchangeCueDoer(seeker=self.exnseeker, cues=self.exc.cues, queries=self.queries,
388+
tock=self.tocks.get("exchangecue", 0.0)),
380389
])
381390

382391
super(Agent, self).__init__(doers=doers, always=True, **opts)
@@ -412,10 +421,11 @@ def inceptExtern(self, pre, verfers, digers, **kwargs):
412421

413422
class ParserDoer(doing.Doer):
414423

415-
def __init__(self, kvy, parser):
424+
def __init__(self, kvy, parser, tock=0.0):
416425
self.kvy = kvy
417426
self.parser = parser
418-
super(ParserDoer, self).__init__()
427+
self.tock = tock
428+
super(ParserDoer, self).__init__(tock=self.tock)
419429

420430
def recur(self, tyme=None):
421431
if self.parser.ims:
@@ -426,10 +436,11 @@ def recur(self, tyme=None):
426436

427437
class Witnesser(doing.Doer):
428438

429-
def __init__(self, receiptor, witners):
439+
def __init__(self, receiptor, witners, tock=0.0):
430440
self.receiptor = receiptor
431441
self.witners = witners
432-
super(Witnesser, self).__init__()
442+
self.tock = tock
443+
super(Witnesser, self).__init__(tock=self.tock)
433444

434445
def recur(self, tyme=None):
435446
while True:
@@ -450,11 +461,12 @@ def recur(self, tyme=None):
450461

451462
class Delegator(doing.Doer):
452463

453-
def __init__(self, agentHab, swain, anchors):
464+
def __init__(self, agentHab, swain, anchors, tock=0.0):
454465
self.agentHab = agentHab
455466
self.swain = swain
456467
self.anchors = anchors
457-
super(Delegator, self).__init__()
468+
self.tock = tock
469+
super(Delegator, self).__init__(tock=self.tock)
458470

459471
def recur(self, tyme=None):
460472
if self.anchors:
@@ -467,12 +479,13 @@ def recur(self, tyme=None):
467479

468480
class ExchangeSender(doing.DoDoer):
469481

470-
def __init__(self, hby, agentHab, exc, exchanges):
482+
def __init__(self, hby, agentHab, exc, exchanges, tock=0.0):
471483
self.hby = hby
472484
self.agentHab = agentHab
473485
self.exc = exc
474486
self.exchanges = exchanges
475-
super(ExchangeSender, self).__init__(always=True)
487+
self.tock = tock
488+
super(ExchangeSender, self).__init__(always=True, tock=self.tock)
476489

477490
def recur(self, tyme, deeds=None):
478491
if self.exchanges:
@@ -507,13 +520,14 @@ def recur(self, tyme, deeds=None):
507520

508521
class Granter(doing.DoDoer):
509522

510-
def __init__(self, hby, rgy, agentHab, exc, grants):
523+
def __init__(self, hby, rgy, agentHab, exc, grants, tock=0.0):
511524
self.hby = hby
512525
self.rgy = rgy
513526
self.agentHab = agentHab
514527
self.exc = exc
515528
self.grants = grants
516-
super(Granter, self).__init__(always=True)
529+
self.tock = tock
530+
super(Granter, self).__init__(always=True, tock=self.tock)
517531

518532
def recur(self, tyme, deeds=None):
519533
if self.grants:
@@ -553,14 +567,15 @@ def recur(self, tyme, deeds=None):
553567

554568
class Admitter(doing.Doer):
555569

556-
def __init__(self, hby, witq, psr, agentHab, exc, admits):
570+
def __init__(self, hby, witq, psr, agentHab, exc, admits, tock=0.0):
557571
self.hby = hby
558572
self.agentHab = agentHab
559573
self.witq = witq
560574
self.psr = psr
561575
self.exc = exc
562576
self.admits = admits
563-
super(Admitter, self).__init__()
577+
self.tock = tock
578+
super(Admitter, self).__init__(tock=self.tock)
564579

565580
def recur(self, tyme):
566581
if self.admits:
@@ -600,11 +615,11 @@ def recur(self, tyme):
600615

601616
class SeekerDoer(doing.Doer):
602617

603-
def __init__(self, seeker, cues):
618+
def __init__(self, seeker, cues, tock=0.0):
604619
self.seeker = seeker
605620
self.cues = cues
606-
607-
super(SeekerDoer, self).__init__()
621+
self.tock = tock
622+
super(SeekerDoer, self).__init__(tock=self.tock)
608623

609624
def recur(self, tyme=None):
610625
if self.cues:
@@ -623,12 +638,12 @@ def recur(self, tyme=None):
623638

624639
class ExchangeCueDoer(doing.Doer):
625640

626-
def __init__(self, seeker, cues, queries):
641+
def __init__(self, seeker, cues, queries, tock=0.0):
627642
self.seeker = seeker
628643
self.cues = cues
629644
self.queries = queries
630-
631-
super(ExchangeCueDoer, self).__init__()
645+
self.tock = tock
646+
super(ExchangeCueDoer, self).__init__(tock=self.tock)
632647

633648
def recur(self, tyme=None):
634649
if self.cues:
@@ -649,10 +664,11 @@ def recur(self, tyme=None):
649664

650665

651666
class Initer(doing.Doer):
652-
def __init__(self, agentHab, caid):
667+
def __init__(self, agentHab, caid, tock=0.0):
653668
self.agentHab = agentHab
654669
self.caid = caid
655-
super(Initer, self).__init__()
670+
self.tock = tock
671+
super(Initer, self).__init__(tock=self.tock)
656672

657673
def recur(self, tyme):
658674
""" Prints Agent name and prefix """
@@ -665,13 +681,13 @@ def recur(self, tyme):
665681

666682
class GroupRequester(doing.Doer):
667683

668-
def __init__(self, hby, agentHab, counselor, groups):
684+
def __init__(self, hby, agentHab, counselor, groups, tock=0.0):
669685
self.hby = hby
670686
self.agentHab = agentHab
671687
self.counselor = counselor
672688
self.groups = groups
673-
674-
super(GroupRequester, self).__init__()
689+
self.tock = tock
690+
super(GroupRequester, self).__init__(tock=self.tock)
675691

676692
def recur(self, tyme):
677693
""" Checks cue for group proceccing requests and processes any with Counselor """
@@ -691,13 +707,13 @@ def recur(self, tyme):
691707

692708
class Querier(doing.DoDoer):
693709

694-
def __init__(self, hby, agentHab, queries, kvy):
710+
def __init__(self, hby, agentHab, queries, kvy, tock=0.0):
695711
self.hby = hby
696712
self.agentHab = agentHab
697713
self.queries = queries
698714
self.kvy = kvy
699-
700-
super(Querier, self).__init__(always=True)
715+
self.tock = tock
716+
super(Querier, self).__init__(always=True, tock=self.tock)
701717

702718
def recur(self, tyme, deeds=None):
703719
""" Processes query reqests submitting any on the cue"""
@@ -724,7 +740,7 @@ def recur(self, tyme, deeds=None):
724740

725741

726742
class Escrower(doing.Doer):
727-
def __init__(self, kvy, rgy, rvy, tvy, exc, vry, registrar, credentialer):
743+
def __init__(self, kvy, rgy, rvy, tvy, exc, vry, registrar, credentialer, tock=0.0):
728744
""" Recuring process or escrows for all components in an Agent
729745
730746
Parameters:
@@ -745,7 +761,7 @@ def __init__(self, kvy, rgy, rvy, tvy, exc, vry, registrar, credentialer):
745761
self.vry = vry
746762
self.registrar = registrar
747763
self.credentialer = credentialer
748-
self.tock = 1.0
764+
self.tock = tock
749765

750766
super(Escrower, self).__init__(tock=self.tock)
751767

tests/app/test_agenting.py

+48
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import os
1010
import shutil
1111

12+
import pytest
13+
1214
import falcon
1315
import hio
1416
from falcon import testing
@@ -62,6 +64,52 @@ def test_load_ends(helpers):
6264
assert isinstance(end, agenting.QueryCollectionEnd)
6365

6466

67+
def test_load_tocks_config(helpers):
68+
with helpers.openKeria() as (agency, agent, app, client):
69+
agenting.loadEnds(app=app)
70+
assert app._router is not None
71+
72+
assert agent.cfd == {
73+
"dt": "2022-01-20T12:57:59.823350+00:00",
74+
"keria": {
75+
"dt": "2022-01-20T12:57:59.823350+00:00",
76+
"curls": ["http://127.0.0.1:3902/"]
77+
},
78+
"EK35JRNdfVkO4JwhXaSTdV4qzB_ibk_tGJmSVcY4pZqx": {
79+
"dt": "2022-01-20T12:57:59.823350+00:00",
80+
"curls": ["http://127.0.0.1:3902/"]
81+
},
82+
"EI7AkI40M11MS7lkTCb10JC9-nDt-tXwQh44OHAFlv_9": {
83+
"dt": "2022-01-20T12:57:59.823350+00:00",
84+
"curls": ["http://127.0.0.1:3902/"]
85+
},
86+
"tocks": {
87+
"initer": 0.0,
88+
"escrower": 1.0
89+
}
90+
}
91+
92+
assert agent.tocks == {
93+
"initer": 0.0,
94+
"escrower": 1.0
95+
}
96+
97+
escrower_doer = next((doer for doer in agent.doers if isinstance(doer, agenting.Escrower)), None)
98+
assert escrower_doer is not None
99+
assert escrower_doer.tock == 1.0
100+
101+
initer_doer = next((doer for doer in agent.doers if isinstance(doer, agenting.Initer)), None)
102+
assert initer_doer is not None
103+
assert initer_doer.tock == 0.0
104+
105+
querier_doer = next((doer for doer in agent.doers if isinstance(doer, agenting.Querier)), None)
106+
assert querier_doer is not None
107+
assert querier_doer.tock == 0.0
108+
109+
with pytest.raises(TypeError):
110+
agent.tocks["initer"] = 1.0 # agent.tocks is read-only
111+
112+
65113
def test_agency():
66114
salt = b'0123456789abcdef'
67115
salter = core.Salter(raw=salt)

tests/app/test_delegating.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from keria.app import aiding, delegating
1818
from keria.core import longrunning
1919
from keria.end import ending
20+
from keria.app import agenting
2021

2122
def test_sealer():
2223
with habbing.openHby(name="p1", temp=True) as hby:
@@ -69,6 +70,10 @@ def test_delegator_end(helpers):
6970

7071
# Create Anchorer to test
7172
anchorer = delegating.Anchorer(hby=hby)
73+
74+
escrower = next((doer for doer in toragent.doers if isinstance(doer, agenting.Escrower)), None)
75+
assert escrower is not None
76+
dipEvtProcDelay = escrower.tock * 60 + 10 # 60 seconds * escrower.tock + 10 seconds
7277

7378
#setup agency endpoints
7479
ending.loadEnds(app=torapp, agency=toragency)
@@ -151,7 +156,7 @@ def test_delegator_end(helpers):
151156
assert res.status_code == 200
152157
op = res.json
153158
count += 1
154-
if count > 60:
159+
if count > dipEvtProcDelay:
155160
raise Exception("Delegator never processed the delegatee dip event")
156161

157162
# Delegator escrows completed and now aknowledges the delegatee dip event

tests/scripts/keri/cf/main/keria.json

+4
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,9 @@
1111
"EI7AkI40M11MS7lkTCb10JC9-nDt-tXwQh44OHAFlv_9": {
1212
"dt": "2022-01-20T12:57:59.823350+00:00",
1313
"curls": ["http://127.0.0.1:3902/"]
14+
},
15+
"tocks": {
16+
"initer": 0.0,
17+
"escrower": 1.0
1418
}
1519
}

0 commit comments

Comments
 (0)