Skip to content

Commit fbce413

Browse files
authored
Merge pull request #5737 from opsmill/lgu-migrate-req-art-def-check
Migrate RequestArtifactDefinitionCheck to prefect
2 parents 0ccecd1 + ac9a238 commit fbce413

File tree

18 files changed

+244
-349
lines changed

18 files changed

+244
-349
lines changed

backend/infrahub/artifacts/__init__.py

Whitespace-only changes.
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
from typing import Optional
22

3-
from pydantic import Field
3+
from pydantic import BaseModel, Field
44

5-
from infrahub.message_bus import InfrahubMessage
65

7-
8-
class CheckArtifactCreate(InfrahubMessage):
6+
class CheckArtifactCreate(BaseModel):
97
"""Runs a check to verify the creation of an artifact."""
108

119
artifact_name: str = Field(..., description="Name of the artifact")

backend/infrahub/message_bus/operations/check/artifact.py renamed to backend/infrahub/artifacts/tasks.py

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,38 @@
22

33
from prefect import flow
44

5+
from infrahub.artifacts.models import CheckArtifactCreate
56
from infrahub.core.constants import InfrahubKind, ValidatorConclusion
67
from infrahub.core.timestamp import Timestamp
7-
from infrahub.git.repository import InfrahubReadOnlyRepository, InfrahubRepository
8-
from infrahub.log import get_logger
9-
from infrahub.message_bus import messages
8+
from infrahub.git import InfrahubReadOnlyRepository, InfrahubRepository
109
from infrahub.services import InfrahubServices
1110
from infrahub.tasks.artifact import define_artifact
12-
from infrahub.tasks.check import set_check_status
1311
from infrahub.workflows.utils import add_tags
1412

15-
log = get_logger()
16-
1713

1814
@flow(name="git-repository-check-artifact-create", flow_run_name="Check artifact creation")
19-
async def create(message: messages.CheckArtifactCreate, service: InfrahubServices) -> None:
20-
await add_tags(branches=[message.branch_name], nodes=[message.target_id])
21-
validator = await service.client.get(
22-
kind=InfrahubKind.ARTIFACTVALIDATOR, id=message.validator_id, include=["checks"]
23-
)
15+
async def create(model: CheckArtifactCreate, service: InfrahubServices) -> ValidatorConclusion:
16+
await add_tags(branches=[model.branch_name], nodes=[model.target_id])
17+
validator = await service.client.get(kind=InfrahubKind.ARTIFACTVALIDATOR, id=model.validator_id, include=["checks"])
2418

19+
repo: InfrahubReadOnlyRepository | InfrahubRepository
2520
if InfrahubKind.READONLYREPOSITORY:
2621
repo = await InfrahubReadOnlyRepository.init(
27-
id=message.repository_id,
28-
name=message.repository_name,
22+
id=model.repository_id,
23+
name=model.repository_name,
2924
client=service.client,
3025
service=service,
3126
)
3227
else:
3328
repo = await InfrahubRepository.init(
34-
id=message.repository_id,
35-
name=message.repository_name,
29+
id=model.repository_id,
30+
name=model.repository_name,
3631
client=service.client,
3732
service=service,
3833
)
3934

40-
artifact = await define_artifact(message=message, service=service)
35+
artifact = await define_artifact(model=model, service=service)
4136

42-
conclusion = ValidatorConclusion.SUCCESS.value
4337
severity = "info"
4438
artifact_result: dict[str, Union[str, bool, None]] = {
4539
"changed": None,
@@ -50,22 +44,23 @@ async def create(message: messages.CheckArtifactCreate, service: InfrahubService
5044
check_message = "Failed to render artifact"
5145

5246
try:
53-
result = await repo.render_artifact(artifact=artifact, message=message)
47+
result = await repo.render_artifact(artifact=artifact, message=model)
5448
artifact_result["changed"] = result.changed
5549
artifact_result["checksum"] = result.checksum
5650
artifact_result["artifact_id"] = result.artifact_id
5751
artifact_result["storage_id"] = result.storage_id
5852
check_message = "Artifact rendered successfully"
53+
conclusion = ValidatorConclusion.SUCCESS
5954

6055
except Exception as exc:
61-
conclusion = ValidatorConclusion.FAILURE.value
6256
artifact.status.value = "Error"
57+
await artifact.save()
6358
severity = "critical"
59+
conclusion = ValidatorConclusion.FAILURE
6460
check_message += f": {str(exc)}"
65-
await artifact.save()
6661

6762
check = None
68-
check_name = f"{message.artifact_name}: {message.target_name}"
63+
check_name = f"{model.artifact_name}: {model.target_name}"
6964
existing_check = await service.client.filters(
7065
kind=InfrahubKind.ARTIFACTCHECK, validator__ids=validator.id, name__value=check_name
7166
)
@@ -74,7 +69,7 @@ async def create(message: messages.CheckArtifactCreate, service: InfrahubService
7469

7570
if check:
7671
check.created_at.value = Timestamp().to_string()
77-
check.conclusion.value = conclusion
72+
check.conclusion.value = conclusion.value
7873
check.severity.value = severity
7974
check.changed.value = artifact_result["changed"]
8075
check.checksum.value = artifact_result["checksum"]
@@ -86,12 +81,12 @@ async def create(message: messages.CheckArtifactCreate, service: InfrahubService
8681
kind=InfrahubKind.ARTIFACTCHECK,
8782
data={
8883
"name": check_name,
89-
"origin": message.repository_id,
84+
"origin": model.repository_id,
9085
"kind": "ArtifactDefinition",
91-
"validator": message.validator_id,
86+
"validator": model.validator_id,
9287
"created_at": Timestamp().to_string(),
9388
"message": check_message,
94-
"conclusion": conclusion,
89+
"conclusion": conclusion.value,
9590
"severity": severity,
9691
"changed": artifact_result["changed"],
9792
"checksum": artifact_result["checksum"],
@@ -101,4 +96,4 @@ async def create(message: messages.CheckArtifactCreate, service: InfrahubService
10196
)
10297
await check.save()
10398

104-
await set_check_status(message=message, conclusion=conclusion, service=service)
99+
return conclusion
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import asyncio
2+
from typing import Any, Coroutine
3+
4+
from infrahub_sdk.node import InfrahubNode
5+
6+
from infrahub.core.constants import ValidatorConclusion, ValidatorState
7+
from infrahub.core.timestamp import Timestamp
8+
9+
10+
async def run_checks_and_update_validator(
11+
checks: list[Coroutine[Any, None, ValidatorConclusion]], validator: InfrahubNode
12+
) -> None:
13+
"""
14+
Execute a list of checks coroutines, and set validator fields accordingly.
15+
Tasks are retrieved by completion order so as soon as we detect a failing check,
16+
we set validator conclusion to failure.
17+
"""
18+
19+
# First set validator to in progress, then wait for results
20+
validator.state.value = ValidatorState.IN_PROGRESS.value
21+
validator.started_at.value = Timestamp().to_string()
22+
validator.completed_at.value = ""
23+
await validator.save()
24+
25+
for earliest_task in asyncio.as_completed(checks):
26+
result = await earliest_task
27+
if validator.conclusion.value != ValidatorConclusion.FAILURE.value and result == ValidatorConclusion.FAILURE:
28+
validator.conclusion.value = ValidatorConclusion.FAILURE.value
29+
await validator.save()
30+
# Continue to iterate to wait for the end of all checks
31+
32+
validator.state.value = ValidatorState.COMPLETED.value
33+
validator.completed_at.value = Timestamp().to_string()
34+
if validator.conclusion.value != ValidatorConclusion.FAILURE.value:
35+
validator.conclusion.value = ValidatorConclusion.SUCCESS.value
36+
37+
await validator.save()

backend/infrahub/git/integrator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454
from infrahub_sdk.schema.repository import InfrahubRepositoryArtifactDefinitionConfig
5555
from infrahub_sdk.transforms import InfrahubTransform
5656

57+
from infrahub.core.checks.models import CheckArtifactCreate
5758
from infrahub.git.models import RequestArtifactGenerate
58-
from infrahub.message_bus import messages
5959
from infrahub.services import InfrahubServices
6060

6161

@@ -1266,7 +1266,7 @@ async def artifact_generate(
12661266
return ArtifactGenerateResult(changed=True, checksum=checksum, storage_id=storage_id, artifact_id=artifact.id)
12671267

12681268
async def render_artifact(
1269-
self, artifact: CoreArtifact, message: Union[messages.CheckArtifactCreate, RequestArtifactGenerate]
1269+
self, artifact: CoreArtifact, message: Union[CheckArtifactCreate, RequestArtifactGenerate]
12701270
) -> ArtifactGenerateResult:
12711271
response = await self.sdk.query_gql_query(
12721272
name=message.query,

backend/infrahub/git/tasks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ async def generate_artifact(model: RequestArtifactGenerate, service: InfrahubSer
257257
commit=model.commit,
258258
)
259259

260-
artifact = await define_artifact(message=model, service=service)
260+
artifact = await define_artifact(model=model, service=service)
261261

262262
try:
263263
result = await repo.render_artifact(artifact=artifact, message=model)

backend/infrahub/message_bus/messages/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from infrahub.message_bus import InfrahubMessage, InfrahubResponse
22

3-
from .check_artifact_create import CheckArtifactCreate
43
from .check_generator_run import CheckGeneratorRun
54
from .check_repository_checkdefinition import CheckRepositoryCheckDefinition
65
from .check_repository_mergeconflicts import CheckRepositoryMergeConflicts
@@ -19,15 +18,13 @@
1918
from .refresh_git_fetch import RefreshGitFetch
2019
from .refresh_registry_branches import RefreshRegistryBranches
2120
from .refresh_registry_rebasedbranch import RefreshRegistryRebasedBranch
22-
from .request_artifactdefinition_check import RequestArtifactDefinitionCheck
2321
from .request_generatordefinition_check import RequestGeneratorDefinitionCheck
2422
from .request_proposedchange_pipeline import RequestProposedChangePipeline
2523
from .request_repository_checks import RequestRepositoryChecks
2624
from .request_repository_userchecks import RequestRepositoryUserChecks
2725
from .send_echo_request import SendEchoRequest, SendEchoRequestResponse
2826

2927
MESSAGE_MAP: dict[str, type[InfrahubMessage]] = {
30-
"check.artifact.create": CheckArtifactCreate,
3128
"check.generator.run": CheckGeneratorRun,
3229
"check.repository.check_definition": CheckRepositoryCheckDefinition,
3330
"check.repository.merge_conflicts": CheckRepositoryMergeConflicts,
@@ -45,7 +42,6 @@
4542
"refresh.git.fetch": RefreshGitFetch,
4643
"refresh.registry.branches": RefreshRegistryBranches,
4744
"refresh.registry.rebased_branch": RefreshRegistryRebasedBranch,
48-
"request.artifact_definition.check": RequestArtifactDefinitionCheck,
4945
"request.generator_definition.check": RequestGeneratorDefinitionCheck,
5046
"request.proposed_change.pipeline": RequestProposedChangePipeline,
5147
"request.proposed_change.refresh_artifacts": RequestProposedChangeRefreshArtifacts,

backend/infrahub/message_bus/messages/request_artifactdefinition_check.py

Lines changed: 0 additions & 17 deletions
This file was deleted.

backend/infrahub/message_bus/operations/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from infrahub.tasks.check import set_check_status
1919

2020
COMMAND_MAP = {
21-
"check.artifact.create": check.artifact.create,
2221
"check.generator.run": check.generator.run,
2322
"check.repository.check_definition": check.repository.check_definition,
2423
"check.repository.merge_conflicts": check.repository.merge_conflicts,
@@ -34,7 +33,6 @@
3433
"refresh.registry.branches": refresh.registry.branches,
3534
"refresh.registry.rebased_branch": refresh.registry.rebased_branch,
3635
"request.generator_definition.check": requests.generator_definition.check,
37-
"request.artifact_definition.check": requests.artifact_definition.check,
3836
"request.proposed_change.pipeline": requests.proposed_change.pipeline,
3937
"request.proposed_change.refresh_artifacts": requests.proposed_change.refresh_artifacts,
4038
"request.repository.checks": requests.repository.checks,
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
from . import artifact, generator, repository
1+
from . import generator, repository
22

3-
__all__ = ["artifact", "generator", "repository"]
3+
__all__ = ["generator", "repository"]

0 commit comments

Comments
 (0)