This is an automated email from the ASF dual-hosted git repository.
sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-release.git
The following commit(s) were added to refs/heads/main by this push:
new 4db54ec Use the storage interface in the KEYS import task
4db54ec is described below
commit 4db54ecf276ad32ac6ea618e69ebb10bcc527dbb
Author: Sean B. Palmer <[email protected]>
AuthorDate: Tue Jul 22 19:21:20 2025 +0100
Use the storage interface in the KEYS import task
---
atr/storage/types.py | 12 ++++++++++--
atr/storage/writers/keys.py | 4 ++--
atr/tasks/__init__.py | 7 ++++---
atr/tasks/keys.py | 39 +++++++++++----------------------------
4 files changed, 27 insertions(+), 35 deletions(-)
diff --git a/atr/storage/types.py b/atr/storage/types.py
index 096d48e..83f78d3 100644
--- a/atr/storage/types.py
+++ b/atr/storage/types.py
@@ -132,11 +132,19 @@ class Outcomes[T, E: Exception = Exception]:
self.__outcomes = list(outcomes)
@property
- def any_ok(self) -> bool:
+ def any_exception(self) -> bool:
+ return any((not outcome.ok) for outcome in self.__outcomes)
+
+ @property
+ def any_result(self) -> bool:
return any(outcome.ok for outcome in self.__outcomes)
@property
- def all_ok(self) -> bool:
+ def all_exceptions(self) -> bool:
+ return all((not outcome.ok) for outcome in self.__outcomes)
+
+ @property
+ def all_results(self) -> bool:
return all(outcome.ok for outcome in self.__outcomes)
def append(self, outcome: Outcome[T, E]) -> None:
diff --git a/atr/storage/writers/keys.py b/atr/storage/writers/keys.py
index 7cd088e..a8ae3df 100644
--- a/atr/storage/writers/keys.py
+++ b/atr/storage/writers/keys.py
@@ -445,14 +445,14 @@ class CommitteeMember(CommitteeParticipant):
@performance_async
async def ensure_associated(self, keys_file_text: str) ->
types.Outcomes[types.Key]:
outcomes: types.Outcomes[types.Key] = await
self.__ensure(keys_file_text, associate=True)
- if outcomes.any_ok:
+ if outcomes.any_result:
await self.autogenerate_keys_file()
return outcomes
@performance_async
async def ensure_stored(self, keys_file_text: str) ->
types.Outcomes[types.Key]:
outcomes: types.Outcomes[types.Key] = await
self.__ensure(keys_file_text, associate=False)
- if outcomes.any_ok:
+ if outcomes.any_result:
await self.autogenerate_keys_file()
return outcomes
diff --git a/atr/tasks/__init__.py b/atr/tasks/__init__.py
index 4efaa3c..bf4fe38 100644
--- a/atr/tasks/__init__.py
+++ b/atr/tasks/__init__.py
@@ -94,7 +94,7 @@ async def draft_checks(
async def keys_import_file(
- release_name: str, revision_number: str, abs_keys_path: str, caller_data:
db.Session | None = None
+ asf_uid: str, project_name: str, version_name: str, revision_number: str,
caller_data: db.Session | None = None
) -> None:
"""Import a KEYS file from a draft release candidate revision."""
async with db.ensure_session(caller_data) as data:
@@ -103,8 +103,9 @@ async def keys_import_file(
status=sql.TaskStatus.QUEUED,
task_type=sql.TaskType.KEYS_IMPORT_FILE,
task_args=keys.ImportFile(
- release_name=release_name,
- abs_keys_path=abs_keys_path,
+ asf_uid=asf_uid,
+ project_name=project_name,
+ version_name=version_name,
).model_dump(),
revision_number=revision_number,
primary_rel_path=None,
diff --git a/atr/tasks/keys.py b/atr/tasks/keys.py
index 3bd8c55..6fe5671 100644
--- a/atr/tasks/keys.py
+++ b/atr/tasks/keys.py
@@ -15,45 +15,28 @@
# specific language governing permissions and limitations
# under the License.
-import logging
-from typing import Final
-
-import aiofiles
-
-import atr.db as db
-import atr.db.interaction as interaction
import atr.models.results as results
import atr.models.schema as schema
-import atr.models.sql as sql
+import atr.storage as storage
import atr.tasks.checks as checks
-import atr.util as util
-
-_LOGGER: Final = logging.getLogger(__name__)
class ImportFile(schema.Strict):
"""Import a KEYS file from a draft release candidate revision."""
- release_name: str
- abs_keys_path: str
+ asf_uid: str
+ project_name: str
+ version_name: str
@checks.with_model(ImportFile)
async def import_file(args: ImportFile) -> results.Results | None:
"""Import a KEYS file from a draft release candidate revision."""
- async with db.session() as data:
- release = await data.release(name=args.release_name).demand(
- RuntimeError(f"Release {args.release_name} not found")
- )
- if release.phase != sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT:
- raise RuntimeError(f"Release {args.release_name} is not in the
DRAFT phase")
-
- async with aiofiles.open(args.abs_keys_path, "rb") as keys_file:
- keys_text = await keys_file.read()
- key_blocks = util.parse_key_blocks(keys_text.decode("utf-8"))
- if release.committee is None:
- raise RuntimeError(f"Release {args.release_name} has no committee")
- for key_block in key_blocks:
- added_keys = await interaction.key_user_add(None, key_block,
[release.committee.name])
- _LOGGER.info(f"Added key block to user: {added_keys}")
+ async with storage.write(args.asf_uid) as write:
+ access_outcome = await
write.as_project_committee_member(args.project_name)
+ wacm = access_outcome.result_or_raise()
+ outcomes = await wacm.keys.import_keys_file(args.project_name,
args.version_name)
+ if outcomes.any_exception:
+ # TODO: Log this? This code is unused anyway
+ pass
return None
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]