acceldata-sdk-python 26.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- acceldata/__init__.py +7 -0
- acceldata/client/__init__.py +0 -0
- acceldata/client/adoc_client.py +666 -0
- acceldata/client/http_client.py +346 -0
- acceldata/client/transient_retry.py +142 -0
- acceldata/constants/__init__.py +1 -0
- acceldata/constants/constants.py +13 -0
- acceldata/exceptions/__init__.py +52 -0
- acceldata/exceptions/api_errors.py +85 -0
- acceldata/exceptions/exceptions.py +174 -0
- acceldata/exceptions/sdk_exceptions.py +98 -0
- acceldata/mappers/__init__.py +21 -0
- acceldata/mappers/catalog_executions.py +107 -0
- acceldata/models/__init__.py +0 -0
- acceldata/models/api/catalog/above_configs.py +99 -0
- acceldata/models/api/catalog/above_configs_success.py +138 -0
- acceldata/models/api/catalog/absolute_configs.py +197 -0
- acceldata/models/api/catalog/absolute_configs_fallback.py +101 -0
- acceldata/models/api/catalog/absolute_threshold_config.py +105 -0
- acceldata/models/api/catalog/analysis_job_context.py +102 -0
- acceldata/models/api/catalog/analytics_pipeline.py +385 -0
- acceldata/models/api/catalog/analytics_pipeline_endpoint.py +136 -0
- acceldata/models/api/catalog/anomaly_config.py +95 -0
- acceldata/models/api/catalog/anomaly_details.py +119 -0
- acceldata/models/api/catalog/anomaly_threshold_config.py +105 -0
- acceldata/models/api/catalog/artifact.py +92 -0
- acceldata/models/api/catalog/assembly.py +171 -0
- acceldata/models/api/catalog/asset.py +162 -0
- acceldata/models/api/catalog/asset_catalog_listing.py +159 -0
- acceldata/models/api/catalog/asset_catalog_listing_response.py +102 -0
- acceldata/models/api/catalog/asset_label_request.py +96 -0
- acceldata/models/api/catalog/asset_progress.py +96 -0
- acceldata/models/api/catalog/asset_progress_details.py +117 -0
- acceldata/models/api/catalog/asset_tag.py +124 -0
- acceldata/models/api/catalog/asset_tag_info.py +140 -0
- acceldata/models/api/catalog/asset_tag_request.py +95 -0
- acceldata/models/api/catalog/asset_tag_response.py +96 -0
- acceldata/models/api/catalog/asset_tags_response.py +102 -0
- acceldata/models/api/catalog/asset_type.py +96 -0
- acceldata/models/api/catalog/auto_anomaly_feature_analysis.py +160 -0
- acceldata/models/api/catalog/auto_anomaly_item_execution.py +133 -0
- acceldata/models/api/catalog/auto_anomaly_meta_data.py +162 -0
- acceldata/models/api/catalog/auto_anomaly_rule_execution.py +102 -0
- acceldata/models/api/catalog/auto_anomaly_summary.py +124 -0
- acceldata/models/api/catalog/backing_asset.py +126 -0
- acceldata/models/api/catalog/below_configs.py +99 -0
- acceldata/models/api/catalog/big_decimal.py +100 -0
- acceldata/models/api/catalog/big_integer.py +98 -0
- acceldata/models/api/catalog/bounds_date_time_marker_config.py +110 -0
- acceldata/models/api/catalog/bounds_file_event_marker_config.py +108 -0
- acceldata/models/api/catalog/bounds_id_marker_config.py +96 -0
- acceldata/models/api/catalog/catalog_asset_meta_data.py +128 -0
- acceldata/models/api/catalog/changes_by_config.py +105 -0
- acceldata/models/api/catalog/column_mapping.py +139 -0
- acceldata/models/api/catalog/column_metadata.py +90 -0
- acceldata/models/api/catalog/column_metric_with_anomaly_details.py +119 -0
- acceldata/models/api/catalog/column_variable.py +111 -0
- acceldata/models/api/catalog/composite_policy_execution.py +102 -0
- acceldata/models/api/catalog/composite_policy_item_execution.py +104 -0
- acceldata/models/api/catalog/connection.py +118 -0
- acceldata/models/api/catalog/connection_test_result.py +106 -0
- acceldata/models/api/catalog/connection_type.py +90 -0
- acceldata/models/api/catalog/connection_types_response.py +96 -0
- acceldata/models/api/catalog/crawler.py +88 -0
- acceldata/models/api/catalog/crawler_action_response.py +90 -0
- acceldata/models/api/catalog/crawler_execution.py +147 -0
- acceldata/models/api/catalog/crawler_execution_response.py +102 -0
- acceldata/models/api/catalog/crawler_status_response.py +90 -0
- acceldata/models/api/catalog/create_profile.py +194 -0
- acceldata/models/api/catalog/custom_sql_config.py +121 -0
- acceldata/models/api/catalog/data_bricks_spark_resource_config.py +104 -0
- acceldata/models/api/catalog/data_cadence_rule.py +236 -0
- acceldata/models/api/catalog/data_cadence_rule_details.py +125 -0
- acceldata/models/api/catalog/data_cadence_rule_execution.py +102 -0
- acceldata/models/api/catalog/data_cadence_rule_item.py +104 -0
- acceldata/models/api/catalog/data_cadence_rule_item_execution.py +158 -0
- acceldata/models/api/catalog/data_cadence_rule_response.py +98 -0
- acceldata/models/api/catalog/data_drift_execution.py +102 -0
- acceldata/models/api/catalog/data_drift_item_execution.py +121 -0
- acceldata/models/api/catalog/data_quality_engine.py +90 -0
- acceldata/models/api/catalog/data_quality_execution.py +106 -0
- acceldata/models/api/catalog/data_quality_rule.py +323 -0
- acceldata/models/api/catalog/data_quality_rule_details.py +186 -0
- acceldata/models/api/catalog/data_quality_rule_response.py +120 -0
- acceldata/models/api/catalog/data_quality_rules_response.py +102 -0
- acceldata/models/api/catalog/databricks_compute_config.py +113 -0
- acceldata/models/api/catalog/dataplane_engine.py +105 -0
- acceldata/models/api/catalog/dataplane_health_metrics.py +101 -0
- acceldata/models/api/catalog/dataplane_job.py +216 -0
- acceldata/models/api/catalog/dataplane_job_status.py +113 -0
- acceldata/models/api/catalog/dataplane_request.py +96 -0
- acceldata/models/api/catalog/dataproc_compute_config.py +106 -0
- acceldata/models/api/catalog/dataproc_spark_resource_config.py +104 -0
- acceldata/models/api/catalog/date_based_partition_marker_config.py +116 -0
- acceldata/models/api/catalog/date_partitioning_marker_config.py +113 -0
- acceldata/models/api/catalog/date_time_marker_config.py +109 -0
- acceldata/models/api/catalog/day_month_year_based_partition_marker_config.py +124 -0
- acceldata/models/api/catalog/decreased_by_config.py +105 -0
- acceldata/models/api/catalog/delete_artifact_response.py +88 -0
- acceldata/models/api/catalog/dq_rule_execution.py +248 -0
- acceldata/models/api/catalog/drift.py +121 -0
- acceldata/models/api/catalog/enable_rule_request.py +88 -0
- acceldata/models/api/catalog/engine.py +90 -0
- acceldata/models/api/catalog/execution_cancellation_response.py +92 -0
- acceldata/models/api/catalog/execution_response.py +144 -0
- acceldata/models/api/catalog/execution_result.py +126 -0
- acceldata/models/api/catalog/executions_response.py +102 -0
- acceldata/models/api/catalog/failed_asset_detail.py +90 -0
- acceldata/models/api/catalog/failed_summary.py +98 -0
- acceldata/models/api/catalog/file.py +94 -0
- acceldata/models/api/catalog/file_marker_config.py +99 -0
- acceldata/models/api/catalog/generic_config_fallback.py +101 -0
- acceldata/models/api/catalog/generic_execution.py +221 -0
- acceldata/models/api/catalog/generic_rule_execution.py +137 -0
- acceldata/models/api/catalog/global_storage_config_dto.py +172 -0
- acceldata/models/api/catalog/hosted_dp_deployment_response.py +98 -0
- acceldata/models/api/catalog/id_marker_config.py +94 -0
- acceldata/models/api/catalog/increased_by_config.py +105 -0
- acceldata/models/api/catalog/item.py +160 -0
- acceldata/models/api/catalog/item_execution.py +192 -0
- acceldata/models/api/catalog/item_segment.py +131 -0
- acceldata/models/api/catalog/job_schedule.py +118 -0
- acceldata/models/api/catalog/job_spec.py +96 -0
- acceldata/models/api/catalog/kubernetes_metrics.py +91 -0
- acceldata/models/api/catalog/label.py +97 -0
- acceldata/models/api/catalog/livy_compute_config.py +103 -0
- acceldata/models/api/catalog/livy_spark_resource_config.py +106 -0
- acceldata/models/api/catalog/look_back_config.py +90 -0
- acceldata/models/api/catalog/manual_tag_request.py +92 -0
- acceldata/models/api/catalog/mapping.py +97 -0
- acceldata/models/api/catalog/marker.py +88 -0
- acceldata/models/api/catalog/marker_config.py +349 -0
- acceldata/models/api/catalog/marker_config_fallback.py +101 -0
- acceldata/models/api/catalog/meta.py +92 -0
- acceldata/models/api/catalog/meta_data.py +92 -0
- acceldata/models/api/catalog/meta_data_item.py +94 -0
- acceldata/models/api/catalog/mini_profile_request.py +112 -0
- acceldata/models/api/catalog/notification_payload.py +114 -0
- acceldata/models/api/catalog/offset_based_marker_config.py +97 -0
- acceldata/models/api/catalog/operational_config.py +92 -0
- acceldata/models/api/catalog/pattern_configuration.py +90 -0
- acceldata/models/api/catalog/pipe_line_request.py +92 -0
- acceldata/models/api/catalog/pipeline_compute_config.py +110 -0
- acceldata/models/api/catalog/policy_execution_marker_config.py +94 -0
- acceldata/models/api/catalog/policy_execution_request.py +229 -0
- acceldata/models/api/catalog/policy_group.py +114 -0
- acceldata/models/api/catalog/policy_transform_udf.py +113 -0
- acceldata/models/api/catalog/process_metrics.py +91 -0
- acceldata/models/api/catalog/profile_anomaly_details_response.py +109 -0
- acceldata/models/api/catalog/profile_anomaly_item_execution.py +127 -0
- acceldata/models/api/catalog/profile_anomaly_rule_execution.py +102 -0
- acceldata/models/api/catalog/profile_anomaly_rule_item.py +109 -0
- acceldata/models/api/catalog/profile_cancellation_response.py +92 -0
- acceldata/models/api/catalog/profile_request.py +211 -0
- acceldata/models/api/catalog/profile_request_response.py +92 -0
- acceldata/models/api/catalog/property_template.py +178 -0
- acceldata/models/api/catalog/property_templates.py +123 -0
- acceldata/models/api/catalog/pub_sub_lookback_marker_config.py +96 -0
- acceldata/models/api/catalog/pub_sub_timestamp_marker_config.py +108 -0
- acceldata/models/api/catalog/quality_rule.py +381 -0
- acceldata/models/api/catalog/quality_rule_execution_metrics.py +114 -0
- acceldata/models/api/catalog/quality_rule_with_latest_execution.py +115 -0
- acceldata/models/api/catalog/range_configs.py +109 -0
- acceldata/models/api/catalog/reconciliation_item.py +102 -0
- acceldata/models/api/catalog/reconciliation_item_execution.py +157 -0
- acceldata/models/api/catalog/reconciliation_rule.py +339 -0
- acceldata/models/api/catalog/reconciliation_rule_details.py +225 -0
- acceldata/models/api/catalog/reconciliation_rule_execution.py +102 -0
- acceldata/models/api/catalog/reconciliation_rule_response.py +98 -0
- acceldata/models/api/catalog/reconciliation_rules_response.py +102 -0
- acceldata/models/api/catalog/relative_config.py +197 -0
- acceldata/models/api/catalog/relative_config_fallback.py +101 -0
- acceldata/models/api/catalog/relative_threshold_config.py +111 -0
- acceldata/models/api/catalog/root_cause_analysis.py +108 -0
- acceldata/models/api/catalog/rule_execution.py +327 -0
- acceldata/models/api/catalog/rule_execution_result.py +90 -0
- acceldata/models/api/catalog/rule_item_result.py +125 -0
- acceldata/models/api/catalog/rule_meta_data.py +94 -0
- acceldata/models/api/catalog/rule_spark_sql_dynamic_filter_variable_mapping.py +100 -0
- acceldata/models/api/catalog/rule_tag.py +101 -0
- acceldata/models/api/catalog/rule_threshold_configuration.py +236 -0
- acceldata/models/api/catalog/rule_threshold_configuration_fallback.py +101 -0
- acceldata/models/api/catalog/rules_with_latest_execution_response.py +102 -0
- acceldata/models/api/catalog/sample_data_api_response.py +122 -0
- acceldata/models/api/catalog/schema_drift_item_execution.py +131 -0
- acceldata/models/api/catalog/schema_drift_rule_execution.py +102 -0
- acceldata/models/api/catalog/secret_manager_configuration.py +90 -0
- acceldata/models/api/catalog/secret_manager_configuration_with_option.py +98 -0
- acceldata/models/api/catalog/security_config.py +90 -0
- acceldata/models/api/catalog/segment_metric_json.py +142 -0
- acceldata/models/api/catalog/segments_analysis.py +145 -0
- acceldata/models/api/catalog/short_segment.py +97 -0
- acceldata/models/api/catalog/simple_quality_rule_response.py +92 -0
- acceldata/models/api/catalog/snapshot_data.py +117 -0
- acceldata/models/api/catalog/source_model.py +90 -0
- acceldata/models/api/catalog/source_type.py +100 -0
- acceldata/models/api/catalog/source_types_response.py +102 -0
- acceldata/models/api/catalog/spark_job_status.py +113 -0
- acceldata/models/api/catalog/spark_resource_config.py +114 -0
- acceldata/models/api/catalog/standard_response_assembly.py +92 -0
- acceldata/models/api/catalog/standard_response_crawler_action_response.py +92 -0
- acceldata/models/api/catalog/standard_response_crawler_status_response.py +92 -0
- acceldata/models/api/catalog/standard_response_delete_artifact_response.py +92 -0
- acceldata/models/api/catalog/standard_response_list.py +96 -0
- acceldata/models/api/catalog/standard_response_map.py +88 -0
- acceldata/models/api/catalog/standard_response_meta_data.py +92 -0
- acceldata/models/api/catalog/standard_response_mini_profile_request.py +92 -0
- acceldata/models/api/catalog/standard_response_profile_request.py +92 -0
- acceldata/models/api/catalog/start_profiling_request.py +92 -0
- acceldata/models/api/catalog/tag_domain.py +116 -0
- acceldata/models/api/catalog/threshold_breach_details.py +101 -0
- acceldata/models/api/catalog/time_based_config.py +92 -0
- acceldata/models/api/catalog/time_based_threshold_config.py +105 -0
- acceldata/models/api/catalog/timestamp_based_marker_config.py +115 -0
- acceldata/models/api/catalog/udf_variable.py +97 -0
- acceldata/models/api/catalog/yunikorn_compute_config.py +133 -0
- acceldata/models/api/catalog/yunikorn_spark_resource_config.py +154 -0
- acceldata/models/api/pipeline/big_decimal.py +100 -0
- acceldata/models/api/pipeline/big_integer.py +98 -0
- acceldata/models/api/pipeline/child_span_response.py +96 -0
- acceldata/models/api/pipeline/create_span_event.py +109 -0
- acceldata/models/api/pipeline/edge.py +108 -0
- acceldata/models/api/pipeline/event_alert_object.py +95 -0
- acceldata/models/api/pipeline/generic_config_fallback.py +101 -0
- acceldata/models/api/pipeline/identifier.py +146 -0
- acceldata/models/api/pipeline/job_request.py +130 -0
- acceldata/models/api/pipeline/meta.py +107 -0
- acceldata/models/api/pipeline/meta_data.py +92 -0
- acceldata/models/api/pipeline/metric.py +103 -0
- acceldata/models/api/pipeline/node.py +201 -0
- acceldata/models/api/pipeline/node_response.py +92 -0
- acceldata/models/api/pipeline/notification_payload.py +114 -0
- acceldata/models/api/pipeline/pipeline.py +152 -0
- acceldata/models/api/pipeline/pipeline_baseline_metric.py +92 -0
- acceldata/models/api/pipeline/pipeline_details.py +118 -0
- acceldata/models/api/pipeline/pipeline_details_response.py +102 -0
- acceldata/models/api/pipeline/pipeline_input_request.py +92 -0
- acceldata/models/api/pipeline/pipeline_listing_info.py +118 -0
- acceldata/models/api/pipeline/pipeline_response.py +92 -0
- acceldata/models/api/pipeline/pipeline_run.py +136 -0
- acceldata/models/api/pipeline/pipeline_run_request.py +92 -0
- acceldata/models/api/pipeline/pipeline_runs_response.py +102 -0
- acceldata/models/api/pipeline/pipeline_summary.py +98 -0
- acceldata/models/api/pipeline/pipelines_listing_response.py +102 -0
- acceldata/models/api/pipeline/policy_summary.py +102 -0
- acceldata/models/api/pipeline/span.py +115 -0
- acceldata/models/api/pipeline/span_event.py +114 -0
- acceldata/models/api/pipeline/span_event_request.py +92 -0
- acceldata/models/api/pipeline/span_event_response.py +92 -0
- acceldata/models/api/pipeline/span_request.py +94 -0
- acceldata/models/api/pipeline/spans_response.py +96 -0
- acceldata/models/api/pipeline/tag.py +97 -0
- acceldata/models/sdk/__init__.py +0 -0
- acceldata/models/sdk/catalog/__init__.py +105 -0
- acceldata/models/sdk/catalog/asset_resource.py +112 -0
- acceldata/models/sdk/catalog/asset_source_type.py +59 -0
- acceldata/models/sdk/catalog/custom_asset_metadata.py +11 -0
- acceldata/models/sdk/catalog/datasource_resource.py +88 -0
- acceldata/models/sdk/catalog/executor.py +524 -0
- acceldata/models/sdk/catalog/policy_execution_request.py +114 -0
- acceldata/models/sdk/catalog/policy_execution_type.py +16 -0
- acceldata/models/sdk/catalog/policy_filter.py +94 -0
- acceldata/models/sdk/catalog/policy_rule_resources.py +388 -0
- acceldata/models/sdk/catalog/profile_request_resource.py +77 -0
- acceldata/models/sdk/catalog/profiling.py +82 -0
- acceldata/models/sdk/catalog/profiling_configuration_error.py +5 -0
- acceldata/models/sdk/pipeline/__init__.py +62 -0
- acceldata/models/sdk/pipeline/create_job_input.py +108 -0
- acceldata/models/sdk/pipeline/create_pipeline_input_request.py +72 -0
- acceldata/models/sdk/pipeline/events/__init__.py +5 -0
- acceldata/models/sdk/pipeline/events/generic_event.py +31 -0
- acceldata/models/sdk/pipeline/events/log_event.py +34 -0
- acceldata/models/sdk/pipeline/events/span_event.py +8 -0
- acceldata/models/sdk/pipeline/pipeline_resource.py +171 -0
- acceldata/models/sdk/pipeline/pipeline_run_input.py +84 -0
- acceldata/models/sdk/pipeline/pipeline_run_resource.py +208 -0
- acceldata/models/sdk/pipeline/pipeline_source_type.py +20 -0
- acceldata/models/sdk/pipeline/span_resource.py +327 -0
- acceldata/openapi_deserialization_patches.py +161 -0
- acceldata/openapi_repr_patches.py +62 -0
- acceldata/services/__init__.py +0 -0
- acceldata/services/api_timestamp.py +31 -0
- acceldata/services/asset_service.py +651 -0
- acceldata/services/datasource_service.py +120 -0
- acceldata/services/generic_service.py +132 -0
- acceldata/services/marker_config.py +232 -0
- acceldata/services/pipeline_big_decimal_api.py +102 -0
- acceldata/services/pipeline_response_parse.py +209 -0
- acceldata/services/pipeline_service.py +494 -0
- acceldata/services/rule_service.py +620 -0
- acceldata/urls/__init__.py +1 -0
- acceldata/urls/catalog_urls.py +137 -0
- acceldata/urls/pipeline_urls.py +55 -0
- acceldata/utils/__init__.py +6 -0
- acceldata/utils/datetime_utils.py +16 -0
- acceldata/utils/operation_ack.py +22 -0
- acceldata/utils/span_helpers.py +95 -0
- acceldata/utils/time_range_utils.py +90 -0
- acceldata_sdk_python-26.7.0.dist-info/METADATA +26 -0
- acceldata_sdk_python-26.7.0.dist-info/RECORD +303 -0
- acceldata_sdk_python-26.7.0.dist-info/WHEEL +5 -0
- acceldata_sdk_python-26.7.0.dist-info/licenses/LICENSE +22 -0
- acceldata_sdk_python-26.7.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from enum import Enum, auto
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from acceldata.models.api.catalog.asset import Asset
|
|
9
|
+
from acceldata.models.api.catalog.assembly import Assembly
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ExecutionPeriod(Enum):
|
|
13
|
+
"""Time window for filtering rules by last execution time."""
|
|
14
|
+
|
|
15
|
+
Last15minutes = auto()
|
|
16
|
+
Last30minutes = auto()
|
|
17
|
+
Last1hour = auto()
|
|
18
|
+
Last3hours = auto()
|
|
19
|
+
Last6hours = auto()
|
|
20
|
+
Last12hours = auto()
|
|
21
|
+
Last24hours = auto()
|
|
22
|
+
Today = auto()
|
|
23
|
+
Yesterday = auto()
|
|
24
|
+
Last7days = auto()
|
|
25
|
+
Thismonth = auto()
|
|
26
|
+
Last1month = auto()
|
|
27
|
+
Last3month = auto()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class RuleType(Enum):
|
|
31
|
+
"""Catalog rule kind; query params use the enum member name (e.g. ``DATA_QUALITY``)."""
|
|
32
|
+
|
|
33
|
+
DATA_QUALITY = auto()
|
|
34
|
+
RECONCILIATION = auto()
|
|
35
|
+
EQUALITY = auto()
|
|
36
|
+
DATA_DRIFT = auto()
|
|
37
|
+
SCHEMA_DRIFT = auto()
|
|
38
|
+
DATA_CADENCE = auto()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class PolicyType(Enum):
|
|
42
|
+
"""Policy kind for :meth:`~acceldata.client.adoc_client.AdocClient.get_policy` routing."""
|
|
43
|
+
|
|
44
|
+
DATA_QUALITY = "DATA-QUALITY"
|
|
45
|
+
RECONCILIATION = "RECONCILIATION"
|
|
46
|
+
DATA_CADENCE = "DATA_CADENCE"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class RuleResultStatus(Enum):
|
|
50
|
+
"""Filter by last execution outcome."""
|
|
51
|
+
|
|
52
|
+
STARTED = auto()
|
|
53
|
+
RUNNING = auto()
|
|
54
|
+
ERRORED = auto()
|
|
55
|
+
WARNING = auto()
|
|
56
|
+
SUCCESSFUL = auto()
|
|
57
|
+
ABORTED = auto()
|
|
58
|
+
WAITING = auto()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class RuleExecutionStatus(str, Enum):
|
|
62
|
+
"""Status strings on :class:`~acceldata.models.api.catalog.generic_rule_execution.GenericRuleExecution` (API responses)."""
|
|
63
|
+
|
|
64
|
+
STARTED = "STARTED"
|
|
65
|
+
RUNNING = "RUNNING"
|
|
66
|
+
ERRORED = "ERRORED"
|
|
67
|
+
WARNING = "WARNING"
|
|
68
|
+
SUCCESSFUL = "SUCCESSFUL"
|
|
69
|
+
ABORTED = "ABORTED"
|
|
70
|
+
SKIPPED = "SKIPPED"
|
|
71
|
+
WAITING = "WAITING"
|
|
72
|
+
ANOMALY_DETECTION = "ANOMALY_DETECTION"
|
|
73
|
+
EXECUTION_RESULT = "EXECUTION_RESULT"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@dataclass
|
|
77
|
+
class PolicyFilter:
|
|
78
|
+
"""
|
|
79
|
+
Filter for listing catalog rules (``GET /rules``).
|
|
80
|
+
|
|
81
|
+
Uses :class:`~acceldata.models.api.catalog.asset.Asset` and
|
|
82
|
+
:class:`~acceldata.models.api.catalog.assembly.Assembly` for asset / datasource scoping.
|
|
83
|
+
|
|
84
|
+
Constructor arguments use the field names below (snake_case), e.g. ``policy_type``, not ``policyType``.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
period: ExecutionPeriod | None = None
|
|
88
|
+
tags: str | None = None
|
|
89
|
+
last_execution_result: RuleResultStatus | None = None
|
|
90
|
+
assets: list[Asset] | None = None
|
|
91
|
+
policy_type: RuleType | None = None
|
|
92
|
+
enable: bool | None = None
|
|
93
|
+
active: bool | None = None
|
|
94
|
+
data_sources: list[Assembly] | None = None
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
from acceldata.client.transient_retry import RetryConfig
|
|
6
|
+
from acceldata.models.api.catalog.data_cadence_rule_execution import DataCadenceRuleExecution
|
|
7
|
+
from acceldata.models.api.catalog.data_cadence_rule_response import DataCadenceRuleResponse
|
|
8
|
+
from acceldata.models.api.catalog.data_quality_execution import DataQualityExecution
|
|
9
|
+
from acceldata.models.api.catalog.data_quality_rule_response import DataQualityRuleResponse
|
|
10
|
+
from acceldata.models.api.catalog.executions_response import ExecutionsResponse
|
|
11
|
+
from acceldata.models.api.catalog.execution_cancellation_response import ExecutionCancellationResponse
|
|
12
|
+
from acceldata.models.api.catalog.execution_result import ExecutionResult
|
|
13
|
+
from acceldata.models.api.catalog.generic_execution import GenericExecution
|
|
14
|
+
from acceldata.models.api.catalog.reconciliation_rule_execution import ReconciliationRuleExecution
|
|
15
|
+
from acceldata.models.sdk.catalog.policy_execution_request import PolicyExecutionRequestInput
|
|
16
|
+
from acceldata.models.api.catalog.quality_rule import QualityRule
|
|
17
|
+
from acceldata.models.api.catalog.reconciliation_rule_response import ReconciliationRuleResponse
|
|
18
|
+
from acceldata.models.sdk.catalog.executor import (
|
|
19
|
+
POLICY_POLL_UNLIMITED_RETRIES,
|
|
20
|
+
Executor,
|
|
21
|
+
FailureStrategy,
|
|
22
|
+
)
|
|
23
|
+
from acceldata.models.sdk.catalog.policy_filter import RuleExecutionStatus, RuleType
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DataQualityRuleResource:
|
|
27
|
+
"""Typed handle for a data quality (DQ) policy rule: GET, executions, enable/disable, and :class:`~acceldata.models.sdk.catalog.executor.Executor` helpers."""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
client: Any,
|
|
32
|
+
model: DataQualityRuleResponse,
|
|
33
|
+
identifier: str | int | None = None,
|
|
34
|
+
) -> None:
|
|
35
|
+
self._client = client
|
|
36
|
+
self._model = model
|
|
37
|
+
self._identifier = identifier
|
|
38
|
+
|
|
39
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
40
|
+
return self._model.to_dict()
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def rule_response(self) -> DataQualityRuleResponse:
|
|
44
|
+
return self._model
|
|
45
|
+
|
|
46
|
+
def __repr__(self) -> str:
|
|
47
|
+
return f"DataQualityRuleResource(model={self._model!r})"
|
|
48
|
+
|
|
49
|
+
def _rule_id(self) -> str | int:
|
|
50
|
+
rid = self._model.rule.id
|
|
51
|
+
if rid is not None:
|
|
52
|
+
return rid
|
|
53
|
+
if self._identifier is not None:
|
|
54
|
+
return self._identifier
|
|
55
|
+
raise ValueError("Rule id is not available; fetch the rule again.")
|
|
56
|
+
|
|
57
|
+
def refresh(self) -> DataQualityRuleResource:
|
|
58
|
+
self._model = self._client.rule_service.get_dq_rule(self._rule_id())
|
|
59
|
+
return self
|
|
60
|
+
|
|
61
|
+
def execute(
|
|
62
|
+
self,
|
|
63
|
+
policy_execution_request: PolicyExecutionRequestInput,
|
|
64
|
+
) -> GenericExecution:
|
|
65
|
+
return self._client.execute_dq_rule(
|
|
66
|
+
self._rule_id(),
|
|
67
|
+
policy_execution_request,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def policy_executions(
|
|
71
|
+
self,
|
|
72
|
+
page: int = 0,
|
|
73
|
+
size: int = 25,
|
|
74
|
+
sort_by: str = "finishedAt:DESC",
|
|
75
|
+
) -> ExecutionsResponse:
|
|
76
|
+
return self._client.policy_executions(self._rule_id(), RuleType.DATA_QUALITY, page=page, size=size, sort_by=sort_by)
|
|
77
|
+
|
|
78
|
+
def enable(self) -> QualityRule:
|
|
79
|
+
return self._client.enable_rule(self._rule_id())
|
|
80
|
+
|
|
81
|
+
def disable(self) -> QualityRule:
|
|
82
|
+
return self._client.disable_rule(self._rule_id())
|
|
83
|
+
|
|
84
|
+
def get_execution_details(self, execution_id: str | int) -> DataQualityExecution:
|
|
85
|
+
return self._client.get_dq_rule_execution_details(execution_id)
|
|
86
|
+
|
|
87
|
+
def get_result(self, execution_id: str | int) -> ExecutionResult:
|
|
88
|
+
return self._client.get_dq_rule_result(execution_id)
|
|
89
|
+
|
|
90
|
+
def cancel_execution(self, execution_id: str | int) -> ExecutionCancellationResponse:
|
|
91
|
+
return self._client.cancel_rule_execution(execution_id)
|
|
92
|
+
|
|
93
|
+
def execute_policy(
|
|
94
|
+
self,
|
|
95
|
+
policy_execution_request: PolicyExecutionRequestInput,
|
|
96
|
+
*,
|
|
97
|
+
sync: bool = True,
|
|
98
|
+
failure_strategy: FailureStrategy = FailureStrategy.DoNotFail,
|
|
99
|
+
sleep_interval: float = 5.0,
|
|
100
|
+
total_retries: int = POLICY_POLL_UNLIMITED_RETRIES,
|
|
101
|
+
transient_retry: RetryConfig | None = None,
|
|
102
|
+
pipeline_run_id: int | None = None,
|
|
103
|
+
) -> Executor:
|
|
104
|
+
return self._client.execute_policy(
|
|
105
|
+
RuleType.DATA_QUALITY,
|
|
106
|
+
self._rule_id(),
|
|
107
|
+
policy_execution_request,
|
|
108
|
+
sync=sync,
|
|
109
|
+
failure_strategy=failure_strategy,
|
|
110
|
+
sleep_interval=sleep_interval,
|
|
111
|
+
total_retries=total_retries,
|
|
112
|
+
transient_retry=transient_retry,
|
|
113
|
+
pipeline_run_id=pipeline_run_id,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
def get_policy_execution_status(
|
|
117
|
+
self,
|
|
118
|
+
execution_id: str | int,
|
|
119
|
+
*,
|
|
120
|
+
transient_retry: RetryConfig | None = None,
|
|
121
|
+
) -> RuleExecutionStatus:
|
|
122
|
+
return self._client.get_policy_execution_status(
|
|
123
|
+
RuleType.DATA_QUALITY,
|
|
124
|
+
execution_id,
|
|
125
|
+
transient_retry=transient_retry,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
def get_policy_execution_result(
|
|
129
|
+
self,
|
|
130
|
+
execution_id: str | int,
|
|
131
|
+
*,
|
|
132
|
+
failure_strategy: FailureStrategy = FailureStrategy.DoNotFail,
|
|
133
|
+
transient_retry: RetryConfig | None = None,
|
|
134
|
+
) -> ExecutionResult:
|
|
135
|
+
return self._client.get_policy_execution_result(
|
|
136
|
+
RuleType.DATA_QUALITY,
|
|
137
|
+
execution_id,
|
|
138
|
+
failure_strategy=failure_strategy,
|
|
139
|
+
transient_retry=transient_retry,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class ReconciliationRuleResource:
|
|
144
|
+
"""Typed handle for a reconciliation (recon) policy rule (left/right compare); same surface as :class:`DataQualityRuleResource` for executions and results."""
|
|
145
|
+
|
|
146
|
+
def __init__(
|
|
147
|
+
self,
|
|
148
|
+
client: Any,
|
|
149
|
+
model: ReconciliationRuleResponse,
|
|
150
|
+
identifier: str | int | None = None,
|
|
151
|
+
) -> None:
|
|
152
|
+
self._client = client
|
|
153
|
+
self._model = model
|
|
154
|
+
self._identifier = identifier
|
|
155
|
+
|
|
156
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
157
|
+
return self._model.to_dict()
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def rule_response(self) -> ReconciliationRuleResponse:
|
|
161
|
+
return self._model
|
|
162
|
+
|
|
163
|
+
def __repr__(self) -> str:
|
|
164
|
+
return f"ReconciliationRuleResource(model={self._model!r})"
|
|
165
|
+
|
|
166
|
+
def _rule_id(self) -> str | int:
|
|
167
|
+
rid = self._model.rule.id
|
|
168
|
+
if rid is not None:
|
|
169
|
+
return rid
|
|
170
|
+
if self._identifier is not None:
|
|
171
|
+
return self._identifier
|
|
172
|
+
raise ValueError("Rule id is not available; fetch the rule again.")
|
|
173
|
+
|
|
174
|
+
def refresh(self) -> ReconciliationRuleResource:
|
|
175
|
+
self._model = self._client.rule_service.get_reconciliation_rule(self._rule_id())
|
|
176
|
+
return self
|
|
177
|
+
|
|
178
|
+
def execute(
|
|
179
|
+
self,
|
|
180
|
+
policy_execution_request: PolicyExecutionRequestInput,
|
|
181
|
+
) -> GenericExecution:
|
|
182
|
+
return self._client.execute_reconciliation_rule(
|
|
183
|
+
self._rule_id(),
|
|
184
|
+
policy_execution_request,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def policy_executions(
|
|
188
|
+
self,
|
|
189
|
+
page: int = 0,
|
|
190
|
+
size: int = 25,
|
|
191
|
+
sort_by: str = "finishedAt:DESC",
|
|
192
|
+
) -> ExecutionsResponse:
|
|
193
|
+
return self._client.policy_executions(
|
|
194
|
+
self._rule_id(), RuleType.RECONCILIATION, page=page, size=size, sort_by=sort_by
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
def enable(self) -> QualityRule:
|
|
198
|
+
return self._client.enable_rule(self._rule_id())
|
|
199
|
+
|
|
200
|
+
def disable(self) -> QualityRule:
|
|
201
|
+
return self._client.disable_rule(self._rule_id())
|
|
202
|
+
|
|
203
|
+
def get_execution_details(
|
|
204
|
+
self, execution_id: str | int
|
|
205
|
+
) -> ReconciliationRuleExecution:
|
|
206
|
+
return self._client.get_reconciliation_rule_execution_details(execution_id)
|
|
207
|
+
|
|
208
|
+
def get_result(self, execution_id: str | int) -> ExecutionResult:
|
|
209
|
+
return self._client.get_reconciliation_rule_result(execution_id)
|
|
210
|
+
|
|
211
|
+
def cancel_execution(self, execution_id: str | int) -> ExecutionCancellationResponse:
|
|
212
|
+
return self._client.cancel_rule_execution(execution_id)
|
|
213
|
+
|
|
214
|
+
def execute_policy(
|
|
215
|
+
self,
|
|
216
|
+
policy_execution_request: PolicyExecutionRequestInput,
|
|
217
|
+
*,
|
|
218
|
+
sync: bool = True,
|
|
219
|
+
failure_strategy: FailureStrategy = FailureStrategy.DoNotFail,
|
|
220
|
+
sleep_interval: float = 5.0,
|
|
221
|
+
total_retries: int = POLICY_POLL_UNLIMITED_RETRIES,
|
|
222
|
+
transient_retry: RetryConfig | None = None,
|
|
223
|
+
pipeline_run_id: int | None = None,
|
|
224
|
+
) -> Executor:
|
|
225
|
+
return self._client.execute_policy(
|
|
226
|
+
RuleType.RECONCILIATION,
|
|
227
|
+
self._rule_id(),
|
|
228
|
+
policy_execution_request,
|
|
229
|
+
sync=sync,
|
|
230
|
+
failure_strategy=failure_strategy,
|
|
231
|
+
sleep_interval=sleep_interval,
|
|
232
|
+
total_retries=total_retries,
|
|
233
|
+
transient_retry=transient_retry,
|
|
234
|
+
pipeline_run_id=pipeline_run_id,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
def get_policy_execution_status(
|
|
238
|
+
self,
|
|
239
|
+
execution_id: str | int,
|
|
240
|
+
*,
|
|
241
|
+
transient_retry: RetryConfig | None = None,
|
|
242
|
+
) -> RuleExecutionStatus:
|
|
243
|
+
return self._client.get_policy_execution_status(
|
|
244
|
+
RuleType.RECONCILIATION,
|
|
245
|
+
execution_id,
|
|
246
|
+
transient_retry=transient_retry,
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
def get_policy_execution_result(
|
|
250
|
+
self,
|
|
251
|
+
execution_id: str | int,
|
|
252
|
+
*,
|
|
253
|
+
failure_strategy: FailureStrategy = FailureStrategy.DoNotFail,
|
|
254
|
+
transient_retry: RetryConfig | None = None,
|
|
255
|
+
) -> ExecutionResult:
|
|
256
|
+
return self._client.get_policy_execution_result(
|
|
257
|
+
RuleType.RECONCILIATION,
|
|
258
|
+
execution_id,
|
|
259
|
+
failure_strategy=failure_strategy,
|
|
260
|
+
transient_retry=transient_retry,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class DataCadenceRuleResource:
|
|
265
|
+
"""Typed handle for a data cadence (freshness) policy rule; API path kind ``DATA_CADENCE``."""
|
|
266
|
+
|
|
267
|
+
def __init__(
|
|
268
|
+
self,
|
|
269
|
+
client: Any,
|
|
270
|
+
model: DataCadenceRuleResponse,
|
|
271
|
+
identifier: str | int | None = None,
|
|
272
|
+
) -> None:
|
|
273
|
+
self._client = client
|
|
274
|
+
self._model = model
|
|
275
|
+
self._identifier = identifier
|
|
276
|
+
|
|
277
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
278
|
+
return self._model.to_dict()
|
|
279
|
+
|
|
280
|
+
@property
|
|
281
|
+
def rule_response(self) -> DataCadenceRuleResponse:
|
|
282
|
+
return self._model
|
|
283
|
+
|
|
284
|
+
def __repr__(self) -> str:
|
|
285
|
+
return f"DataCadenceRuleResource(model={self._model!r})"
|
|
286
|
+
|
|
287
|
+
def _rule_id(self) -> str | int:
|
|
288
|
+
rid = self._model.rule.id
|
|
289
|
+
if rid is not None:
|
|
290
|
+
return rid
|
|
291
|
+
if self._identifier is not None:
|
|
292
|
+
return self._identifier
|
|
293
|
+
raise ValueError("Rule id is not available; fetch the rule again.")
|
|
294
|
+
|
|
295
|
+
def refresh(self) -> DataCadenceRuleResource:
|
|
296
|
+
self._model = self._client.rule_service.get_freshness_rule(self._rule_id())
|
|
297
|
+
return self
|
|
298
|
+
|
|
299
|
+
def execute(
|
|
300
|
+
self,
|
|
301
|
+
policy_execution_request: PolicyExecutionRequestInput,
|
|
302
|
+
) -> GenericExecution:
|
|
303
|
+
return self._client.execute_freshness_rule(
|
|
304
|
+
self._rule_id(),
|
|
305
|
+
policy_execution_request,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def policy_executions(
|
|
309
|
+
self,
|
|
310
|
+
page: int = 0,
|
|
311
|
+
size: int = 25,
|
|
312
|
+
sort_by: str = "finishedAt:DESC",
|
|
313
|
+
) -> ExecutionsResponse:
|
|
314
|
+
return self._client.policy_executions(
|
|
315
|
+
self._rule_id(), RuleType.DATA_CADENCE, page=page, size=size, sort_by=sort_by
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
def enable(self) -> QualityRule:
|
|
319
|
+
return self._client.enable_rule(self._rule_id())
|
|
320
|
+
|
|
321
|
+
def disable(self) -> QualityRule:
|
|
322
|
+
return self._client.disable_rule(self._rule_id())
|
|
323
|
+
|
|
324
|
+
def get_execution_details(self, execution_id: str | int) -> DataCadenceRuleExecution:
|
|
325
|
+
return self._client.get_data_cadence_rule_execution_details(execution_id)
|
|
326
|
+
|
|
327
|
+
def get_result(self, execution_id: str | int) -> ExecutionResult:
|
|
328
|
+
return self._client.get_freshness_rule_result(execution_id)
|
|
329
|
+
|
|
330
|
+
def cancel_execution(self, execution_id: str | int) -> ExecutionCancellationResponse:
|
|
331
|
+
return self._client.cancel_rule_execution(execution_id)
|
|
332
|
+
|
|
333
|
+
def execute_policy(
|
|
334
|
+
self,
|
|
335
|
+
policy_execution_request: PolicyExecutionRequestInput,
|
|
336
|
+
*,
|
|
337
|
+
sync: bool = True,
|
|
338
|
+
failure_strategy: FailureStrategy = FailureStrategy.DoNotFail,
|
|
339
|
+
sleep_interval: float = 5.0,
|
|
340
|
+
total_retries: int = POLICY_POLL_UNLIMITED_RETRIES,
|
|
341
|
+
transient_retry: RetryConfig | None = None,
|
|
342
|
+
pipeline_run_id: int | None = None,
|
|
343
|
+
) -> Executor:
|
|
344
|
+
return self._client.execute_policy(
|
|
345
|
+
RuleType.DATA_CADENCE,
|
|
346
|
+
self._rule_id(),
|
|
347
|
+
policy_execution_request,
|
|
348
|
+
sync=sync,
|
|
349
|
+
failure_strategy=failure_strategy,
|
|
350
|
+
sleep_interval=sleep_interval,
|
|
351
|
+
total_retries=total_retries,
|
|
352
|
+
transient_retry=transient_retry,
|
|
353
|
+
pipeline_run_id=pipeline_run_id,
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
def get_policy_execution_status(
|
|
357
|
+
self,
|
|
358
|
+
execution_id: str | int,
|
|
359
|
+
*,
|
|
360
|
+
transient_retry: RetryConfig | None = None,
|
|
361
|
+
) -> RuleExecutionStatus:
|
|
362
|
+
return self._client.get_policy_execution_status(
|
|
363
|
+
RuleType.DATA_CADENCE,
|
|
364
|
+
execution_id,
|
|
365
|
+
transient_retry=transient_retry,
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
def get_policy_execution_result(
|
|
369
|
+
self,
|
|
370
|
+
execution_id: str | int,
|
|
371
|
+
*,
|
|
372
|
+
failure_strategy: FailureStrategy = FailureStrategy.DoNotFail,
|
|
373
|
+
transient_retry: RetryConfig | None = None,
|
|
374
|
+
) -> ExecutionResult:
|
|
375
|
+
return self._client.get_policy_execution_result(
|
|
376
|
+
RuleType.DATA_CADENCE,
|
|
377
|
+
execution_id,
|
|
378
|
+
failure_strategy=failure_strategy,
|
|
379
|
+
transient_retry=transient_retry,
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
# Naming aliases (import-friendly).
|
|
384
|
+
DQPolicyResource = DataQualityRuleResource
|
|
385
|
+
ReconPolicyResource = ReconciliationRuleResource
|
|
386
|
+
CadencePolicyResource = DataCadenceRuleResource
|
|
387
|
+
# Backward-compatible alias.
|
|
388
|
+
ReconRuleResource = ReconciliationRuleResource
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
from acceldata.models.api.catalog.profile_cancellation_response import (
|
|
6
|
+
ProfileCancellationResponse,
|
|
7
|
+
)
|
|
8
|
+
from acceldata.models.api.catalog.profile_request import ProfileRequest
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from acceldata.services.asset_service import AssetService
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ProfileRequestResource:
|
|
15
|
+
"""
|
|
16
|
+
SDK wrapper around the generated :class:`~acceldata.models.api.catalog.profile_request.ProfileRequest`
|
|
17
|
+
for cancel and status calls that need an :class:`~acceldata.services.asset_service.AssetService`.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(
|
|
21
|
+
self,
|
|
22
|
+
asset_service: AssetService,
|
|
23
|
+
model: ProfileRequest,
|
|
24
|
+
*,
|
|
25
|
+
operation_message: str | None = None,
|
|
26
|
+
) -> None:
|
|
27
|
+
self._asset_service = asset_service
|
|
28
|
+
self._model = model
|
|
29
|
+
self._operation_message = operation_message
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def asset_service(self) -> AssetService:
|
|
33
|
+
return self._asset_service
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def profile_request(self) -> ProfileRequest:
|
|
37
|
+
return self._model
|
|
38
|
+
|
|
39
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
40
|
+
return self._model.to_dict()
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def id(self) -> int:
|
|
44
|
+
return int(self._model.id)
|
|
45
|
+
|
|
46
|
+
@property
|
|
47
|
+
def asset_id(self) -> int:
|
|
48
|
+
return int(self._model.asset_id)
|
|
49
|
+
|
|
50
|
+
def __repr__(self) -> str:
|
|
51
|
+
return f"ProfileRequestResource(model={self._model!r})"
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def message(self) -> str:
|
|
55
|
+
if self._operation_message:
|
|
56
|
+
return self._operation_message
|
|
57
|
+
status = self._model.status or "UNKNOWN"
|
|
58
|
+
return (
|
|
59
|
+
f"Profile request {self.id} for asset {self.asset_id} is currently {status}."
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def cancel(self) -> Optional[ProfileCancellationResponse]:
|
|
63
|
+
return self._asset_service.cancel_profile(self.id)
|
|
64
|
+
|
|
65
|
+
def get_status(self) -> ProfileRequestResource:
|
|
66
|
+
self._model = self._asset_service.get_profile_request_details(
|
|
67
|
+
asset_id=self._model.asset_id, req_id=self.id
|
|
68
|
+
)
|
|
69
|
+
status = self._model.status or "UNKNOWN"
|
|
70
|
+
self._operation_message = (
|
|
71
|
+
f"Profile request {self.id} for asset {self.asset_id} is currently {status}."
|
|
72
|
+
)
|
|
73
|
+
return self
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# Preferred name aligned with other *Resource wrappers.
|
|
77
|
+
ProfileResource = ProfileRequestResource
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import TYPE_CHECKING, Optional
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from acceldata.models.api.catalog.start_profiling_request import (
|
|
9
|
+
StartProfilingRequest,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
from acceldata.services.marker_config import (
|
|
13
|
+
MarkerConfigInput,
|
|
14
|
+
prepare_marker_config_for_request,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ProfilingType(str, Enum):
|
|
19
|
+
"""Profiling mode for :meth:`~acceldata.models.sdk.catalog.asset_resource.AssetResource.start_profile`."""
|
|
20
|
+
|
|
21
|
+
FULL = "FULL"
|
|
22
|
+
SELECTIVE = "SELECTIVE"
|
|
23
|
+
INCREMENTAL = "INCREMENTAL"
|
|
24
|
+
|
|
25
|
+
def needs_asset_marker(self) -> bool:
|
|
26
|
+
"""True when profiling must include a marker configuration (incremental runs)."""
|
|
27
|
+
return self is ProfilingType.INCREMENTAL
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ExecutionType(str, Enum):
|
|
31
|
+
"""Same string values as catalog ``profilingType`` for execution classification."""
|
|
32
|
+
|
|
33
|
+
SELECTIVE = "SELECTIVE"
|
|
34
|
+
FULL = "FULL"
|
|
35
|
+
INCREMENTAL = "INCREMENTAL"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class AssetProfilingParams:
|
|
40
|
+
"""
|
|
41
|
+
Narrow input for :class:`~acceldata.models.api.catalog.start_profiling_request.StartProfilingRequest`:
|
|
42
|
+
only ``profilingType`` and ``markerConfig`` are set; other fields use catalog defaults.
|
|
43
|
+
|
|
44
|
+
Unrelated to pipeline span events; those use :class:`~acceldata.models.sdk.pipeline.events.log_event.LogEvent`
|
|
45
|
+
or :class:`~acceldata.models.sdk.pipeline.events.generic_event.GenericEvent` with
|
|
46
|
+
:meth:`~acceldata.models.sdk.pipeline.span_resource.SpanResource.send_event` depending on the case.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
profiling_type: ProfilingType
|
|
50
|
+
marker_config: Optional[MarkerConfigInput] = None
|
|
51
|
+
|
|
52
|
+
def validate(self) -> None:
|
|
53
|
+
from acceldata.models.sdk.catalog.profiling_configuration_error import (
|
|
54
|
+
ProfilingConfigurationError,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
if self.profiling_type == ProfilingType.SELECTIVE and not self.marker_config:
|
|
58
|
+
raise ProfilingConfigurationError(
|
|
59
|
+
"markerConfig is a mandatory parameter for execution type "
|
|
60
|
+
f"{ProfilingType.SELECTIVE.value}"
|
|
61
|
+
)
|
|
62
|
+
if self.profiling_type.needs_asset_marker() and not self.marker_config:
|
|
63
|
+
raise ProfilingConfigurationError(
|
|
64
|
+
"markerConfig is a mandatory parameter for execution type "
|
|
65
|
+
f"{self.profiling_type.value}"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def to_start_profiling_request(self) -> "StartProfilingRequest":
|
|
69
|
+
from acceldata.models.api.catalog.create_profile import CreateProfile
|
|
70
|
+
from acceldata.models.api.catalog.start_profiling_request import (
|
|
71
|
+
StartProfilingRequest,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
self.validate()
|
|
75
|
+
# Required by CreateProfile; match generated-model defaults and CreateProfile.from_dict fallbacks.
|
|
76
|
+
create = CreateProfile(
|
|
77
|
+
profiling_type=self.profiling_type.value,
|
|
78
|
+
marker_config=prepare_marker_config_for_request(self.marker_config),
|
|
79
|
+
execution_mode="MANUAL",
|
|
80
|
+
job_type="profile",
|
|
81
|
+
)
|
|
82
|
+
return StartProfilingRequest(data=create)
|