Skip to content

Commit f9bb910

Browse files
committedJul 27, 2023
endorser info in multi ledger config + tests
Signed-off-by: Shaanjot Gill <[email protected]>
1 parent f7966e5 commit f9bb910

13 files changed

+273
-38
lines changed
 

Diff for: ‎aries_cloudagent/askar/profile.py

+10
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,16 @@ def bind_providers(self):
162162
ref(self),
163163
),
164164
)
165+
if (
166+
"endorser_alias" in write_ledger_config
167+
and "endorser_did" in write_ledger_config
168+
):
169+
self.settings["endorser.endorser_alias"] = write_ledger_config.get(
170+
"endorser_alias"
171+
)
172+
self.settings["endorser.endorser_public_did"] = write_ledger_config.get(
173+
"endorser_did"
174+
)
165175
elif self.ledger_pool:
166176
injector.bind_provider(
167177
BaseLedger, ClassProvider(IndyVdrLedger, self.ledger_pool, ref(self))

Diff for: ‎aries_cloudagent/askar/tests/test_profile.py

+36
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from ...askar.profile import AskarProfile
88
from ...config.injection_context import InjectionContext
9+
from ...ledger.base import BaseLedger
910

1011
from .. import profile as test_module
1112

@@ -24,6 +25,41 @@ async def test_init_success(open_store):
2425
assert askar_profile.opened == open_store
2526

2627

28+
@pytest.mark.asyncio
29+
async def test_init_multi_ledger(open_store):
30+
context = InjectionContext(
31+
settings={
32+
"ledger.ledger_config_list": [
33+
{
34+
"id": "BCovrinDev",
35+
"is_production": True,
36+
"is_write": True,
37+
"endorser_did": "9QPa6tHvBHttLg6U4xvviv",
38+
"endorser_alias": "endorser_dev",
39+
"genesis_transactions": mock.MagicMock(),
40+
},
41+
{
42+
"id": "SovrinStagingNet",
43+
"is_production": False,
44+
"genesis_transactions": mock.MagicMock(),
45+
},
46+
]
47+
}
48+
)
49+
askar_profile = AskarProfile(
50+
open_store,
51+
context=context,
52+
)
53+
54+
assert askar_profile.opened == open_store
55+
assert askar_profile.settings["endorser.endorser_alias"] == "endorser_dev"
56+
assert (
57+
askar_profile.settings["endorser.endorser_public_did"]
58+
== "9QPa6tHvBHttLg6U4xvviv"
59+
)
60+
assert (askar_profile.inject_or(BaseLedger)).pool_name == "BCovrinDev"
61+
62+
2763
@pytest.mark.asyncio
2864
async def test_remove_success(open_store):
2965
openStore = open_store

Diff for: ‎aries_cloudagent/config/ledger.py

+19-16
Original file line numberDiff line numberDiff line change
@@ -91,22 +91,25 @@ async def load_multiple_genesis_transactions_from_config(settings: Settings):
9191
ledger_id = config.get("id") or str(uuid.uuid4())
9292
if is_write_ledger:
9393
write_ledger_set = True
94-
ledger_txns_list.append(
95-
{
96-
"id": ledger_id,
97-
"is_production": (
98-
True
99-
if config.get("is_production") is None
100-
else config.get("is_production")
101-
),
102-
"is_write": is_write_ledger,
103-
"genesis_transactions": txns,
104-
"keepalive": int(config.get("keepalive", 5)),
105-
"read_only": bool(config.get("read_only", False)),
106-
"socks_proxy": config.get("socks_proxy"),
107-
"pool_name": config.get("pool_name", ledger_id),
108-
}
109-
)
94+
config_item = {
95+
"id": ledger_id,
96+
"is_production": (
97+
True
98+
if config.get("is_production") is None
99+
else config.get("is_production")
100+
),
101+
"is_write": is_write_ledger,
102+
"genesis_transactions": txns,
103+
"keepalive": int(config.get("keepalive", 5)),
104+
"read_only": bool(config.get("read_only", False)),
105+
"socks_proxy": config.get("socks_proxy"),
106+
"pool_name": config.get("pool_name", ledger_id),
107+
}
108+
if "endorser_alias" in config:
109+
config_item["endorser_alias"] = config.get("endorser_alias")
110+
if "endorser_did" in config:
111+
config_item["endorser_did"] = config.get("endorser_did")
112+
ledger_txns_list.append(config_item)
110113
if not write_ledger_set and not (
111114
settings.get("ledger.genesis_transactions")
112115
or settings.get("ledger.genesis_file")

Diff for: ‎aries_cloudagent/config/tests/test_ledger.py

+4
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,8 @@ async def test_load_multiple_genesis_transactions_from_config_a(self):
293293
"read_only": False,
294294
"socks_proxy": None,
295295
"pool_name": "sovrinMain",
296+
"endorser_did": "9QPa6tHvBHttLg6U4xvviv",
297+
"endorser_alias": "endorser_main",
296298
},
297299
{
298300
"id": "sovrinStaging",
@@ -322,6 +324,8 @@ async def test_load_multiple_genesis_transactions_from_config_a(self):
322324
"is_production": True,
323325
"is_write": True,
324326
"genesis_transactions": TEST_GENESIS_TXNS,
327+
"endorser_did": "9QPa6tHvBHttLg6U4xvviv",
328+
"endorser_alias": "endorser_main",
325329
},
326330
{
327331
"id": "sovrinStaging",

Diff for: ‎aries_cloudagent/indy/sdk/profile.py

+10
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,16 @@ def bind_providers(self):
130130
ref(self),
131131
),
132132
)
133+
if (
134+
"endorser_alias" in write_ledger_config
135+
and "endorser_did" in write_ledger_config
136+
):
137+
self.settings["endorser.endorser_alias"] = write_ledger_config.get(
138+
"endorser_alias"
139+
)
140+
self.settings["endorser.endorser_public_did"] = write_ledger_config.get(
141+
"endorser_did"
142+
)
133143
elif self.ledger_pool:
134144
injector.bind_provider(
135145
BaseLedger, ClassProvider(IndySdkLedger, self.ledger_pool, ref(self))

Diff for: ‎aries_cloudagent/indy/sdk/tests/test_profile.py

+37
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
from ....config.injection_context import InjectionContext
88
from ....core.error import ProfileError
9+
from ....ledger.base import BaseLedger
910
from ....ledger.indy import IndySdkLedgerPool
11+
1012
from ..profile import IndySdkProfile
1113
from ..wallet_setup import IndyOpenWallet, IndyWalletConfig
1214

@@ -35,6 +37,41 @@ async def profile(open_wallet):
3537
profile._finalizer()
3638

3739

40+
@pytest.mark.asyncio
41+
async def test_init_multi_ledger(open_wallet):
42+
context = InjectionContext(
43+
settings={
44+
"ledger.ledger_config_list": [
45+
{
46+
"id": "BCovrinDev",
47+
"is_production": True,
48+
"is_write": True,
49+
"endorser_did": "9QPa6tHvBHttLg6U4xvviv",
50+
"endorser_alias": "endorser_dev",
51+
"genesis_transactions": async_mock.MagicMock(),
52+
},
53+
{
54+
"id": "SovrinStagingNet",
55+
"is_production": False,
56+
"genesis_transactions": async_mock.MagicMock(),
57+
},
58+
]
59+
}
60+
)
61+
askar_profile = IndySdkProfile(
62+
open_wallet,
63+
context=context,
64+
)
65+
66+
assert askar_profile.opened == open_wallet
67+
assert askar_profile.settings["endorser.endorser_alias"] == "endorser_dev"
68+
assert (
69+
askar_profile.settings["endorser.endorser_public_did"]
70+
== "9QPa6tHvBHttLg6U4xvviv"
71+
)
72+
assert (askar_profile.inject_or(BaseLedger)).pool_name == "BCovrinDev"
73+
74+
3875
@pytest.mark.asyncio
3976
async def test_properties(profile: IndySdkProfile):
4077
assert profile.name == "test-profile"

Diff for: ‎aries_cloudagent/ledger/multiple_ledger/base_manager.py

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ class BaseMultipleLedgerManager(ABC):
1919
def __init__(self, profile: Profile):
2020
"""Initialize Multiple Ledger Manager."""
2121

22+
@abstractmethod
23+
def get_endorser_info_for_ledger(self, ledger_id: str) -> Optional[Tuple[str, str]]:
24+
"""Return endorser alias, did tuple for provided ledger, if available."""
25+
2226
@abstractmethod
2327
async def get_write_ledgers(self) -> List[str]:
2428
"""Return write ledger."""

Diff for: ‎aries_cloudagent/ledger/multiple_ledger/indy_manager.py

+14
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def __init__(
3434
production_ledgers: OrderedDict = OrderedDict(),
3535
non_production_ledgers: OrderedDict = OrderedDict(),
3636
writable_ledgers: set = set(),
37+
endorser_map: dict = {},
3738
cache_ttl: int = None,
3839
):
3940
"""Initialize MultiIndyLedgerManager.
@@ -49,13 +50,21 @@ def __init__(
4950
self.production_ledgers = production_ledgers
5051
self.non_production_ledgers = non_production_ledgers
5152
self.writable_ledgers = writable_ledgers
53+
self.endorser_map = endorser_map
5254
self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
5355
self.cache_ttl = cache_ttl
5456

5557
async def get_write_ledgers(self) -> List[str]:
5658
"""Return the write IndySdkLedger instance."""
5759
return list(self.writable_ledgers)
5860

61+
def get_endorser_info_for_ledger(self, ledger_id: str) -> Optional[Tuple[str, str]]:
62+
"""Return endorser alias, did tuple for provided ledger, if available."""
63+
endorser_info = self.endorser_map.get(ledger_id)
64+
if not endorser_info:
65+
return None
66+
return (endorser_info["endorser_alias"], endorser_info["endorser_did"])
67+
5968
async def get_ledger_inst_by_id(self, ledger_id: str) -> Optional[BaseLedger]:
6069
"""Return BaseLedger instance."""
6170
return self.production_ledgers.get(
@@ -92,6 +101,11 @@ async def set_profile_write_ledger(self, ledger_id: str, profile: Profile) -> st
92101
profile.context.injector.bind_instance(
93102
BaseLedger, multi_ledgers.get(ledger_id)
94103
)
104+
endorser_info = self.get_endorser_info_for_ledger(ledger_id)
105+
if endorser_info:
106+
endorser_alias, endorser_did = endorser_info
107+
profile.context.settings["endorser.endorser_alias"] = endorser_alias
108+
profile.context.settings["endorser.endorser_public_did"] = endorser_did
95109
return ledger_id
96110
raise MultipleLedgerManagerError(f"No ledger info found for {ledger_id}.")
97111

Diff for: ‎aries_cloudagent/ledger/multiple_ledger/indy_vdr_manager.py

+14
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def __init__(
3434
production_ledgers: OrderedDict = OrderedDict(),
3535
non_production_ledgers: OrderedDict = OrderedDict(),
3636
writable_ledgers: set = set(),
37+
endorser_map: dict = {},
3738
cache_ttl: int = None,
3839
):
3940
"""Initialize MultiIndyLedgerManager.
@@ -49,13 +50,21 @@ def __init__(
4950
self.production_ledgers = production_ledgers
5051
self.non_production_ledgers = non_production_ledgers
5152
self.writable_ledgers = writable_ledgers
53+
self.endorser_map = endorser_map
5254
self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=5)
5355
self.cache_ttl = cache_ttl
5456

5557
async def get_write_ledgers(self) -> List[str]:
5658
"""Return the write IndyVdrLedger instance."""
5759
return list(self.writable_ledgers)
5860

61+
def get_endorser_info_for_ledger(self, ledger_id: str) -> Optional[Tuple[str, str]]:
62+
"""Return endorser alias, did tuple for provided ledger, if available."""
63+
endorser_info = self.endorser_map.get(ledger_id)
64+
if not endorser_info:
65+
return None
66+
return (endorser_info["endorser_alias"], endorser_info["endorser_did"])
67+
5968
async def get_prod_ledgers(self) -> Mapping:
6069
"""Return production ledgers mapping."""
6170
return self.production_ledgers
@@ -75,6 +84,11 @@ async def set_profile_write_ledger(self, ledger_id: str, profile: Profile) -> st
7584
profile.context.injector.bind_instance(
7685
BaseLedger, multi_ledgers.get(ledger_id)
7786
)
87+
endorser_info = self.get_endorser_info_for_ledger(ledger_id)
88+
if endorser_info:
89+
endorser_alias, endorser_did = endorser_info
90+
profile.context.settings["endorser.endorser_alias"] = endorser_alias
91+
profile.context.settings["endorser.endorser_public_did"] = endorser_did
7892
return ledger_id
7993
raise MultipleLedgerManagerError(f"No ledger info found for {ledger_id}.")
8094

Diff for: ‎aries_cloudagent/ledger/multiple_ledger/manager_provider.py

+33-18
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ def provide(self, settings: BaseSettings, injector: BaseInjector):
7272
indy_sdk_production_ledgers = OrderedDict()
7373
indy_sdk_non_production_ledgers = OrderedDict()
7474
ledger_config_list = settings.get_value("ledger.ledger_config_list")
75+
ledger_endorser_map = {}
7576
write_ledgers = set()
7677
for config in ledger_config_list:
7778
keepalive = config.get("keepalive")
@@ -83,37 +84,43 @@ def provide(self, settings: BaseSettings, injector: BaseInjector):
8384
pool_name = config.get("pool_name")
8485
ledger_is_production = config.get("is_production")
8586
ledger_is_write = config.get("is_write")
87+
ledger_endorser_alias = config.get("endorser_alias")
88+
ledger_endorser_did = config.get("endorser_did")
89+
ledger_pool = pool_class(
90+
pool_name,
91+
keepalive=keepalive,
92+
cache=cache,
93+
genesis_transactions=genesis_transactions,
94+
read_only=read_only,
95+
socks_proxy=socks_proxy,
96+
)
97+
ledger_instance = ledger_class(
98+
pool=ledger_pool,
99+
profile=self.root_profile,
100+
)
86101
if ledger_is_write:
87102
write_ledgers.add(ledger_id)
103+
if ledger_is_production:
104+
indy_sdk_production_ledgers[ledger_id] = ledger_instance
88105
else:
89-
ledger_pool = pool_class(
90-
pool_name,
91-
keepalive=keepalive,
92-
cache=cache,
93-
genesis_transactions=genesis_transactions,
94-
read_only=read_only,
95-
socks_proxy=socks_proxy,
96-
)
97-
ledger_instance = ledger_class(
98-
pool=ledger_pool,
99-
profile=self.root_profile,
100-
)
101-
if ledger_is_production:
102-
indy_sdk_production_ledgers[ledger_id] = ledger_instance
103-
else:
104-
indy_sdk_non_production_ledgers[
105-
ledger_id
106-
] = ledger_instance
106+
indy_sdk_non_production_ledgers[ledger_id] = ledger_instance
107+
if ledger_endorser_alias and ledger_endorser_did:
108+
ledger_endorser_map[ledger_id] = {
109+
"endorser_alias": ledger_endorser_alias,
110+
"endorser_did": ledger_endorser_did,
111+
}
107112
self._inst[manager_type] = manager_class(
108113
self.root_profile,
109114
production_ledgers=indy_sdk_production_ledgers,
110115
non_production_ledgers=indy_sdk_non_production_ledgers,
111116
writable_ledgers=write_ledgers,
117+
endorser_map=ledger_endorser_map,
112118
)
113119
else:
114120
indy_vdr_production_ledgers = OrderedDict()
115121
indy_vdr_non_production_ledgers = OrderedDict()
116122
ledger_config_list = settings.get_value("ledger.ledger_config_list")
123+
ledger_endorser_map = {}
117124
write_ledgers = set()
118125
for config in ledger_config_list:
119126
keepalive = config.get("keepalive")
@@ -125,6 +132,8 @@ def provide(self, settings: BaseSettings, injector: BaseInjector):
125132
pool_name = config.get("pool_name")
126133
ledger_is_production = config.get("is_production")
127134
ledger_is_write = config.get("is_write")
135+
ledger_endorser_alias = config.get("endorser_alias")
136+
ledger_endorser_did = config.get("endorser_did")
128137
ledger_pool = pool_class(
129138
pool_name,
130139
keepalive=keepalive,
@@ -143,11 +152,17 @@ def provide(self, settings: BaseSettings, injector: BaseInjector):
143152
indy_vdr_production_ledgers[ledger_id] = ledger_instance
144153
else:
145154
indy_vdr_non_production_ledgers[ledger_id] = ledger_instance
155+
if ledger_endorser_alias and ledger_endorser_did:
156+
ledger_endorser_map[ledger_id] = {
157+
"endorser_alias": ledger_endorser_alias,
158+
"endorser_did": ledger_endorser_did,
159+
}
146160
self._inst[manager_type] = manager_class(
147161
self.root_profile,
148162
production_ledgers=indy_vdr_production_ledgers,
149163
non_production_ledgers=indy_vdr_non_production_ledgers,
150164
writable_ledgers=write_ledgers,
165+
endorser_map=ledger_endorser_map,
151166
)
152167
except ClassNotFoundError as err:
153168
raise InjectionError(

Diff for: ‎aries_cloudagent/ledger/multiple_ledger/tests/test_indy_manager.py

+45-2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,34 @@ async def setUp(self):
5757
writable_ledgers=writable_ledgers,
5858
)
5959

60+
def test_get_endorser_info_for_ledger(self):
61+
writable_ledgers = set()
62+
writable_ledgers.add("test_prod_1")
63+
writable_ledgers.add("test_prod_2")
64+
65+
endorser_info_map = {}
66+
endorser_info_map["test_prod_1"] = {
67+
"endorser_did": "test_public_did_1",
68+
"endorser_alias": "endorser_1",
69+
}
70+
endorser_info_map["test_prod_2"] = {
71+
"endorser_did": "test_public_did_2",
72+
"endorser_alias": "endorser_2",
73+
}
74+
manager = MultiIndyLedgerManager(
75+
self.profile,
76+
production_ledgers=self.production_ledger,
77+
non_production_ledgers=self.non_production_ledger,
78+
writable_ledgers=writable_ledgers,
79+
endorser_map=endorser_info_map,
80+
)
81+
assert (
82+
"endorser_1"
83+
), "test_public_did_1" == manager.get_endorser_info_for_ledger("test_prod_1")
84+
assert (
85+
"endorser_2"
86+
), "test_public_did_2" == manager.get_endorser_info_for_ledger("test_prod_2")
87+
6088
async def test_get_write_ledgers(self):
6189
ledger_ids = await self.manager.get_write_ledgers()
6290
assert "test_prod_1" in ledger_ids
@@ -67,10 +95,25 @@ async def test_get_write_ledger_from_base_ledger(self):
6795
assert ledger_id == "test_prod_1"
6896

6997
async def test_set_profile_write_ledger(self):
98+
writable_ledgers = set()
99+
writable_ledgers.add("test_prod_1")
100+
writable_ledgers.add("test_prod_2")
101+
endorser_info_map = {}
102+
endorser_info_map["test_prod_2"] = {
103+
"endorser_did": "test_public_did_2",
104+
"endorser_alias": "endorser_2",
105+
}
106+
manager = MultiIndyLedgerManager(
107+
self.profile,
108+
production_ledgers=self.production_ledger,
109+
non_production_ledgers=self.non_production_ledger,
110+
writable_ledgers=writable_ledgers,
111+
endorser_map=endorser_info_map,
112+
)
70113
profile = InMemoryProfile.test_profile()
71114
assert not profile.inject_or(BaseLedger)
72-
assert "test_prod_2" in self.manager.writable_ledgers
73-
new_write_ledger_id = await self.manager.set_profile_write_ledger(
115+
assert "test_prod_2" in manager.writable_ledgers
116+
new_write_ledger_id = await manager.set_profile_write_ledger(
74117
profile=profile, ledger_id="test_prod_2"
75118
)
76119
assert new_write_ledger_id == "test_prod_2"

Diff for: ‎aries_cloudagent/ledger/multiple_ledger/tests/test_indy_vdr_manager.py

+45-2
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,34 @@ async def setUp(self):
8686
writable_ledgers=writable_ledgers,
8787
)
8888

89+
def test_get_endorser_info_for_ledger(self):
90+
writable_ledgers = set()
91+
writable_ledgers.add("test_prod_1")
92+
writable_ledgers.add("test_prod_2")
93+
94+
endorser_info_map = {}
95+
endorser_info_map["test_prod_1"] = {
96+
"endorser_did": "test_public_did_1",
97+
"endorser_alias": "endorser_1",
98+
}
99+
endorser_info_map["test_prod_2"] = {
100+
"endorser_did": "test_public_did_2",
101+
"endorser_alias": "endorser_2",
102+
}
103+
manager = MultiIndyVDRLedgerManager(
104+
self.profile,
105+
production_ledgers=self.production_ledger,
106+
non_production_ledgers=self.non_production_ledger,
107+
writable_ledgers=writable_ledgers,
108+
endorser_map=endorser_info_map,
109+
)
110+
assert (
111+
"endorser_1"
112+
), "test_public_did_1" == manager.get_endorser_info_for_ledger("test_prod_1")
113+
assert (
114+
"endorser_2"
115+
), "test_public_did_2" == manager.get_endorser_info_for_ledger("test_prod_2")
116+
89117
async def test_get_write_ledgers(self):
90118
ledger_ids = await self.manager.get_write_ledgers()
91119
assert "test_prod_1" in ledger_ids
@@ -96,10 +124,25 @@ async def test_get_write_ledger_from_base_ledger(self):
96124
assert ledger_id == "test_prod_1"
97125

98126
async def test_set_profile_write_ledger(self):
127+
writable_ledgers = set()
128+
writable_ledgers.add("test_prod_1")
129+
writable_ledgers.add("test_prod_2")
130+
endorser_info_map = {}
131+
endorser_info_map["test_prod_2"] = {
132+
"endorser_did": "test_public_did_2",
133+
"endorser_alias": "endorser_2",
134+
}
135+
manager = MultiIndyVDRLedgerManager(
136+
self.profile,
137+
production_ledgers=self.production_ledger,
138+
non_production_ledgers=self.non_production_ledger,
139+
writable_ledgers=writable_ledgers,
140+
endorser_map=endorser_info_map,
141+
)
99142
profile = InMemoryProfile.test_profile()
100143
assert not profile.inject_or(BaseLedger)
101-
assert "test_prod_2" in self.manager.writable_ledgers
102-
new_write_ledger_id = await self.manager.set_profile_write_ledger(
144+
assert "test_prod_2" in manager.writable_ledgers
145+
new_write_ledger_id = await manager.set_profile_write_ledger(
103146
profile=profile, ledger_id="test_prod_2"
104147
)
105148
assert new_write_ledger_id == "test_prod_2"

Diff for: ‎aries_cloudagent/ledger/multiple_ledger/tests/test_manager_provider.py

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
"is_production": True,
4646
"is_write": True,
4747
"genesis_transactions": TEST_GENESIS_TXN,
48+
"endorser_did": "public_staging_endorser_did",
49+
"endorser_alias": "endorser_staging",
4850
},
4951
{
5052
"id": "sovrinTest",

0 commit comments

Comments
 (0)
Please sign in to comment.