Modify RepositorySimulator.add_delegation

Reduce the number of function arguments and use
DelegatedRole instead.

When adding a list of delegations to the repository,
move the Targets creation inside the loop to create
a separate Targets object for each delegation.

Create a new Metadata obgect only for delegated roles
which do not exist yet in the repository.

Signed-off-by: Teodora Sechkova <tsechkova@vmware.com>
This commit is contained in:
Teodora Sechkova 2021-11-22 16:28:43 +02:00
parent 568580701c
commit c77b47ee82
No known key found for this signature in database
GPG key ID: 65F78F613EA1914E
3 changed files with 14 additions and 18 deletions

View file

@ -345,13 +345,7 @@ def add_target(self, role: str, data: bytes, path: str) -> None:
self.target_files[path] = RepositoryTarget(data, target)
def add_delegation(
self,
delegator_name: str,
name: str,
targets: Targets,
terminating: bool,
paths: Optional[List[str]],
hash_prefixes: Optional[List[str]],
self, delegator_name: str, role: DelegatedRole, targets: Targets
) -> None:
"""Add delegated target role to the repository."""
if delegator_name == Targets.type:
@ -360,7 +354,6 @@ def add_delegation(
delegator = self.md_delegates[delegator_name].signed
# Create delegation
role = DelegatedRole(name, [], 1, terminating, paths, hash_prefixes)
if delegator.delegations is None:
delegator.delegations = Delegations({}, OrderedDict())
# put delegation last by default
@ -372,7 +365,8 @@ def add_delegation(
self.add_signer(role.name, signer)
# Add metadata for the role
self.md_delegates[role.name] = Metadata(targets, OrderedDict())
if role.name not in self.md_delegates:
self.md_delegates[role.name] = Metadata(targets, OrderedDict())
def write(self) -> None:
"""Dump current repository metadata to self.dump_dir

View file

@ -16,6 +16,7 @@
from tuf.api.metadata import (
SPECIFICATION_VERSION,
TOP_LEVEL_ROLE_NAMES,
DelegatedRole,
TargetFile,
Targets,
)
@ -145,9 +146,10 @@ def test_delegated_roles_update(
sim = self._init_repo(consistent_snapshot)
# Add new delegated targets
spec_version = ".".join(SPECIFICATION_VERSION)
targets = Targets(1, spec_version, sim.safe_expiry, {}, None)
for role in rolenames:
sim.add_delegation("targets", role, targets, False, ["*"], None)
delegated_role = DelegatedRole(role, [], 1, False, ["*"], None)
targets = Targets(1, spec_version, sim.safe_expiry, {}, None)
sim.add_delegation("targets", delegated_role, targets)
sim.update_snapshot()
updater = self._init_updater(sim)
updater.refresh()

View file

@ -16,7 +16,7 @@
from tests import utils
from tests.repository_simulator import RepositorySimulator
from tuf.api.metadata import SPECIFICATION_VERSION, Targets
from tuf.api.metadata import SPECIFICATION_VERSION, DelegatedRole, Targets
from tuf.exceptions import BadVersionNumberError, UnsignedMetadataError
from tuf.ngclient import Updater
@ -143,11 +143,10 @@ def test_fishy_rolenames(self) -> None:
# Add new delegated targets, update the snapshot
spec_version = ".".join(SPECIFICATION_VERSION)
targets = Targets(1, spec_version, self.sim.safe_expiry, {}, None)
for role in roles_to_filenames:
self.sim.add_delegation(
"targets", role, targets, False, ["*"], None
)
for rolename in roles_to_filenames:
role = DelegatedRole(rolename, [], 1, False, ["*"], None)
targets = Targets(1, spec_version, self.sim.safe_expiry, {}, None)
self.sim.add_delegation("targets", role, targets)
self.sim.update_snapshot()
updater = self._run_refresh()
@ -236,7 +235,8 @@ def test_not_loading_targets_twice(self, wrapped_open: MagicMock) -> None:
# Add new delegated targets, update the snapshot
spec_version = ".".join(SPECIFICATION_VERSION)
targets = Targets(1, spec_version, self.sim.safe_expiry, {}, None)
self.sim.add_delegation("targets", "role1", targets, False, ["*"], None)
role = DelegatedRole("role1", [], 1, False, ["*"], None)
self.sim.add_delegation("targets", role, targets)
self.sim.update_snapshot()
# Run refresh, top-level roles are loaded