save hash/snapshot of in/output schema
This commit is contained in:
@@ -3,7 +3,7 @@ from __future__ import annotations
|
||||
from collections.abc import Mapping
|
||||
|
||||
from wf_core import ReducerRef, Workflow
|
||||
from wf_platform import CapabilityRef
|
||||
from wf_platform import CapabilityRef, NodeSpecInventory
|
||||
|
||||
from .models import ArtifactKind, JsonObject, RequiredCapability, WorkflowArtifact
|
||||
from .references import normalize_plan_node_refs
|
||||
@@ -20,12 +20,14 @@ def create_workflow_artifact_from_plan(
|
||||
description: str | None = None,
|
||||
required_capabilities: Mapping[str, RequiredCapability] | None = None,
|
||||
source_bindings: Mapping[str, str] | None = None,
|
||||
observed_node_specs: Mapping[str, NodeSpecInventory] | None = None,
|
||||
created_from_catalog_version: str | None = None,
|
||||
) -> WorkflowArtifact:
|
||||
"""Create an immutable artifact from a declarative workflow plan."""
|
||||
normalized_plan, node_requirements = normalize_plan_node_refs(
|
||||
plan,
|
||||
source_bindings or {},
|
||||
observed_node_specs,
|
||||
)
|
||||
_validate_workflow_plan(normalized_plan)
|
||||
return WorkflowArtifact(
|
||||
|
||||
@@ -3,7 +3,7 @@ from __future__ import annotations
|
||||
from collections.abc import Mapping
|
||||
from copy import deepcopy
|
||||
|
||||
from wf_platform import CapabilityRef, SourceRef
|
||||
from wf_platform import CapabilityRef, NodeSpecInventory, SourceRef, hash_json_schema
|
||||
|
||||
from .models import JsonObject, RequiredCapability
|
||||
|
||||
@@ -11,6 +11,7 @@ from .models import JsonObject, RequiredCapability
|
||||
def normalize_plan_node_refs(
|
||||
plan: JsonObject,
|
||||
source_bindings: Mapping[str, str],
|
||||
observed_node_specs: Mapping[str, NodeSpecInventory] | None = None,
|
||||
) -> tuple[JsonObject, dict[str, RequiredCapability]]:
|
||||
"""Rewrite concrete node refs in a plan to deployment-bound logical refs.
|
||||
|
||||
@@ -39,10 +40,31 @@ def normalize_plan_node_refs(
|
||||
continue
|
||||
logical_ref, logical_source, capability_name, concrete_source = replacement
|
||||
node["node"] = logical_ref
|
||||
observed = (
|
||||
observed_node_specs.get(raw_node_ref)
|
||||
if observed_node_specs is not None
|
||||
else None
|
||||
)
|
||||
requirements[logical_ref] = RequiredCapability(
|
||||
logical_source=logical_source,
|
||||
capability_name=capability_name,
|
||||
kind="node_spec",
|
||||
input_schema_hash=(
|
||||
hash_json_schema(observed.input_schema)
|
||||
if observed is not None
|
||||
else None
|
||||
),
|
||||
input_schema_snapshot=(
|
||||
observed.input_schema if observed is not None else None
|
||||
),
|
||||
output_schema_hash=(
|
||||
hash_json_schema(observed.output_schema)
|
||||
if observed is not None
|
||||
else None
|
||||
),
|
||||
output_schema_snapshot=(
|
||||
observed.output_schema if observed is not None else None
|
||||
),
|
||||
observed_concrete_source=concrete_source,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user