Skip to content

Commit 4abb826

Browse files
author
Martin Vrachev
committed
RepositorySimulator: support succinct_roles
Add support for Targets using delegation with succinct_roles. For that purpose, we needed a method that can add succinct_roles information with its all corresponding bins to the target metadata and self.md_delegates attribute in RepositorySimulator. Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
1 parent 28b6917 commit 4abb826

1 file changed

Lines changed: 42 additions & 8 deletions

File tree

tests/repository_simulator.py

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
MetaFile,
6868
Root,
6969
Snapshot,
70+
SuccinctRoles,
7071
TargetFile,
7172
Targets,
7273
Timestamp,
@@ -334,12 +335,16 @@ def update_snapshot(self) -> None:
334335
self.snapshot.version += 1
335336
self.update_timestamp()
336337

338+
def _get_delegator(self, delegator_name: str) -> Targets:
339+
"""Given a delegator name return, its corresponding Targets object."""
340+
if delegator_name == Targets.type:
341+
return self.targets
342+
343+
return self.md_delegates[delegator_name].signed
344+
337345
def add_target(self, role: str, data: bytes, path: str) -> None:
338346
"""Create a target from data and add it to the target_files."""
339-
if role == Targets.type:
340-
targets = self.targets
341-
else:
342-
targets = self.md_delegates[role].signed
347+
targets = self._get_delegator(role)
343348

344349
target = TargetFile.from_data(path, data, ["sha256"])
345350
targets.targets[path] = target
@@ -349,10 +354,7 @@ def add_delegation(
349354
self, delegator_name: str, role: DelegatedRole, targets: Targets
350355
) -> None:
351356
"""Add delegated target role to the repository."""
352-
if delegator_name == Targets.type:
353-
delegator = self.targets
354-
else:
355-
delegator = self.md_delegates[delegator_name].signed
357+
delegator = self._get_delegator(delegator_name)
356358

357359
if (
358360
delegator.delegations is not None
@@ -377,6 +379,38 @@ def add_delegation(
377379
if role.name not in self.md_delegates:
378380
self.md_delegates[role.name] = Metadata(targets, {})
379381

382+
def add_succinct_roles(
383+
self, delegator_name: str, bit_length: int, name_prefix: str
384+
) -> None:
385+
"""Add succinct roles info to a delegator with name "delegator_name".
386+
387+
Note that for each delegated role represented by succinct roles an empty
388+
Targets instance is created.
389+
"""
390+
delegator = self._get_delegator(delegator_name)
391+
392+
if (
393+
delegator.delegations is not None
394+
and delegator.delegations.roles is not None
395+
):
396+
raise ValueError(
397+
"Can't add a succinct_roles when delegated roles are used"
398+
)
399+
400+
key, signer = self.create_key()
401+
succinct_roles = SuccinctRoles([], 1, bit_length, name_prefix)
402+
delegator.delegations = Delegations({}, None, succinct_roles)
403+
404+
# Add targets metadata for all bins.
405+
for delegated_name in succinct_roles.get_roles():
406+
self.md_delegates[delegated_name] = Metadata(
407+
Targets(expires=self.safe_expiry)
408+
)
409+
410+
self.add_signer(delegated_name, signer)
411+
412+
delegator.add_key(key)
413+
380414
def write(self) -> None:
381415
"""Dump current repository metadata to self.dump_dir
382416

0 commit comments

Comments
 (0)