-
Notifications
You must be signed in to change notification settings - Fork 301
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add options to output registered entity summary #3028
base: master
Are you sure you want to change the base?
Changes from 3 commits
f51be71
104783e
9bba92f
f1be205
db9f744
a3734e4
42510ba
8a82a78
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,12 +1,14 @@ | ||||||||||||||||||||||||||||||||
import asyncio | ||||||||||||||||||||||||||||||||
import functools | ||||||||||||||||||||||||||||||||
import json | ||||||||||||||||||||||||||||||||
import os | ||||||||||||||||||||||||||||||||
import tarfile | ||||||||||||||||||||||||||||||||
import tempfile | ||||||||||||||||||||||||||||||||
import typing | ||||||||||||||||||||||||||||||||
from pathlib import Path | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
import click | ||||||||||||||||||||||||||||||||
import yaml | ||||||||||||||||||||||||||||||||
from rich import print as rprint | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
from flytekit.configuration import FastSerializationSettings, ImageConfig, SerializationSettings | ||||||||||||||||||||||||||||||||
|
@@ -251,6 +253,8 @@ def register( | |||||||||||||||||||||||||||||||
remote: FlyteRemote, | ||||||||||||||||||||||||||||||||
copy_style: CopyFileDetection, | ||||||||||||||||||||||||||||||||
env: typing.Optional[typing.Dict[str, str]], | ||||||||||||||||||||||||||||||||
summary_format: typing.Optional[str], | ||||||||||||||||||||||||||||||||
summary_dir: typing.Optional[str], | ||||||||||||||||||||||||||||||||
dry_run: bool = False, | ||||||||||||||||||||||||||||||||
activate_launchplans: bool = False, | ||||||||||||||||||||||||||||||||
skip_errors: bool = False, | ||||||||||||||||||||||||||||||||
|
@@ -333,6 +337,14 @@ def _raw_register(cp_entity: FlyteControlPlaneEntity): | |||||||||||||||||||||||||||||||
is_lp = True | ||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||
og_id = cp_entity.template.id | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
result = { | ||||||||||||||||||||||||||||||||
"id": og_id.name, | ||||||||||||||||||||||||||||||||
"type": og_id.resource_type_name(), | ||||||||||||||||||||||||||||||||
"version": og_id.version, | ||||||||||||||||||||||||||||||||
"status": "skipped", # default status | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider enhancing registration result information
Consider adding more detailed status information in the Code suggestionCheck the AI-generated fix before applying
Suggested change
Code Review Run #9a3edb Is this a valid issue, or was it incorrectly flagged by the Agent?
|
||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||
if not dry_run: | ||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||
|
@@ -350,30 +362,60 @@ def _raw_register(cp_entity: FlyteControlPlaneEntity): | |||||||||||||||||||||||||||||||
print_registration_status( | ||||||||||||||||||||||||||||||||
i, console_url=console_url, verbosity=verbosity, activation=print_activation_message | ||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||
result["status"] = "success" | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
except Exception as e: | ||||||||||||||||||||||||||||||||
if not skip_errors: | ||||||||||||||||||||||||||||||||
raise e | ||||||||||||||||||||||||||||||||
print_registration_status(og_id, success=False) | ||||||||||||||||||||||||||||||||
result["status"] = "failed" | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If it fails, what will the values of other keys be? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The values of the other keys(id, type, version) are pre-computed before registration. Thus, the values will not be empty even if the registration fails. The values are from: result = { |
||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||
print_registration_status(og_id, dry_run=True) | ||||||||||||||||||||||||||||||||
except RegistrationSkipped: | ||||||||||||||||||||||||||||||||
print_registration_status(og_id, success=False) | ||||||||||||||||||||||||||||||||
result["status"] = "skipped" | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
return result | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
async def _register(entities: typing.List[task.TaskSpec]): | ||||||||||||||||||||||||||||||||
loop = asyncio.get_running_loop() | ||||||||||||||||||||||||||||||||
tasks = [] | ||||||||||||||||||||||||||||||||
for entity in entities: | ||||||||||||||||||||||||||||||||
tasks.append(loop.run_in_executor(None, functools.partial(_raw_register, entity))) | ||||||||||||||||||||||||||||||||
await asyncio.gather(*tasks) | ||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||
results = await asyncio.gather(*tasks) | ||||||||||||||||||||||||||||||||
return results | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
# concurrent register | ||||||||||||||||||||||||||||||||
cp_task_entities = list(filter(lambda x: isinstance(x, task.TaskSpec), registrable_entities)) | ||||||||||||||||||||||||||||||||
asyncio.run(_register(cp_task_entities)) | ||||||||||||||||||||||||||||||||
task_results = asyncio.run(_register(cp_task_entities)) | ||||||||||||||||||||||||||||||||
# serial register | ||||||||||||||||||||||||||||||||
cp_other_entities = list(filter(lambda x: not isinstance(x, task.TaskSpec), registrable_entities)) | ||||||||||||||||||||||||||||||||
other_results = [] | ||||||||||||||||||||||||||||||||
for entity in cp_other_entities: | ||||||||||||||||||||||||||||||||
_raw_register(entity) | ||||||||||||||||||||||||||||||||
other_results.append(_raw_register(entity)) | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
all_results = task_results + other_results | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
click.secho(f"Successfully registered {len(registrable_entities)} entities", fg="green") | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
if summary_format is not None: | ||||||||||||||||||||||||||||||||
supported_format = ["json", "yaml"] | ||||||||||||||||||||||||||||||||
if summary_format not in supported_format: | ||||||||||||||||||||||||||||||||
raise ValueError(f"Unsupported file format: {summary_format}") | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider using set for format checking
Consider using a set for Code suggestionCheck the AI-generated fix before applying
Suggested change
Code Review Run #9a3edb Is this a valid issue, or was it incorrectly flagged by the Agent?
|
||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
if summary_dir is not None: | ||||||||||||||||||||||||||||||||
os.makedirs(summary_dir, exist_ok=True) | ||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||
summary_dir = os.getcwd() | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
summary_file = f"registration_summary.{summary_format}" | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does this mean that the other registration may overwrite the summary? I think we could name the file with other unique names (ie. tmp file, py file name, wf name, version number) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes! The summary will be overwritten if the registration is rerun. |
||||||||||||||||||||||||||||||||
summary_path = os.path.join(summary_dir, summary_file) | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
if summary_format == "json": | ||||||||||||||||||||||||||||||||
with open(summary_path, "w") as f: | ||||||||||||||||||||||||||||||||
json.dump(all_results, f) | ||||||||||||||||||||||||||||||||
elif summary_format == "yaml": | ||||||||||||||||||||||||||||||||
with open(summary_path, "w") as f: | ||||||||||||||||||||||||||||||||
yaml.dump(all_results, f) | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
click.secho(f"Registration summary written to: {summary_path}", fg="green") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider adding validation for
summary-format
andsummary-dir
options. Whensummary-format
is specified butsummary-dir
is not, the summary may not be saved correctly. Consider makingsummary-dir
required whensummary-format
is provided.Code suggestion
Code Review Run #9a3edb
Is this a valid issue, or was it incorrectly flagged by the Agent?