From 4fa5a836e65520669e8e4353c81b7f55f8d222a3 Mon Sep 17 00:00:00 2001 From: Ofek Lev Date: Wed, 30 Aug 2023 12:55:18 -0400 Subject: [PATCH] Synchronize config models --- .../cfssl/config_models/defaults.py | 24 +- .../cfssl/config_models/instance.py | 64 ++--- .../cfssl/config_models/shared.py | 43 ++- .../cloudnatix/config_models/defaults.py | 210 +++------------ .../cloudnatix/config_models/instance.py | 250 ++++++++--------- .../config_models/instance.py | 50 ++-- .../config_models/shared.py | 43 ++- .../exim/config_models/defaults.py | 24 +- .../exim/config_models/instance.py | 66 ++--- .../exim/config_models/shared.py | 43 ++- .../filemage/config_models/defaults.py | 24 +- .../filemage/config_models/instance.py | 79 +++--- .../filemage/config_models/shared.py | 43 ++- .../fluentbit/config_models/defaults.py | 224 +++------------- .../fluentbit/config_models/instance.py | 250 ++++++++--------- .../fluentbit/config_models/shared.py | 64 ++--- .../fluxcd/config_models/defaults.py | 24 +- .../fluxcd/config_models/instance.py | 66 ++--- .../fluxcd/config_models/shared.py | 43 ++- .../gatekeeper/config_models/defaults.py | 212 ++------------- .../gatekeeper/config_models/instance.py | 236 ++++++++-------- .../gatekeeper/config_models/shared.py | 64 ++--- .../gitea/config_models/defaults.py | 218 +++------------ .../gitea/config_models/instance.py | 247 ++++++++--------- .../gitea/config_models/shared.py | 64 ++--- .../config_models/defaults.py | 50 +--- .../config_models/instance.py | 84 +++--- .../go_pprof_scraper/config_models/shared.py | 43 ++- .../grpc_check/config_models/defaults.py | 40 +-- .../grpc_check/config_models/instance.py | 78 +++--- .../grpc_check/config_models/shared.py | 43 ++- .../hikaricp/config_models/defaults.py | 220 +++------------ .../hikaricp/config_models/instance.py | 248 ++++++++--------- .../hikaricp/config_models/shared.py | 64 ++--- .../mergify/config_models/defaults.py | 26 +- .../mergify/config_models/instance.py | 69 ++--- .../mergify/config_models/shared.py | 43 ++- .../neo4j/config_models/defaults.py | 214 +++------------ .../neo4j/config_models/instance.py | 252 +++++++++--------- .../nn_sdwan/config_models/defaults.py | 24 +- .../nn_sdwan/config_models/instance.py | 64 ++--- .../nn_sdwan/config_models/shared.py | 43 ++- .../purefa/config_models/defaults.py | 216 +++------------ .../purefa/config_models/instance.py | 247 ++++++++--------- .../purefa/config_models/shared.py | 64 ++--- .../purefb/config_models/defaults.py | 216 +++------------ .../purefb/config_models/instance.py | 247 ++++++++--------- .../purefb/config_models/shared.py | 64 ++--- .../scalr/config_models/defaults.py | 24 +- .../scalr/config_models/instance.py | 64 ++--- .../scalr/config_models/shared.py | 43 ++- .../sonarr/config_models/defaults.py | 24 +- .../sonarr/config_models/instance.py | 64 ++--- .../sonarr/config_models/shared.py | 43 ++- .../syncthing/config_models/defaults.py | 24 +- .../syncthing/config_models/instance.py | 64 ++--- .../syncthing/config_models/shared.py | 43 ++- .../trino/config_models/defaults.py | 88 +----- .../trino/config_models/instance.py | 83 +++--- .../trino/config_models/shared.py | 52 ++-- .../unifi_console/config_models/defaults.py | 142 ++-------- .../unifi_console/config_models/instance.py | 159 +++++------ .../unifi_console/config_models/shared.py | 64 ++--- 63 files changed, 2353 insertions(+), 3962 deletions(-) diff --git a/cfssl/datadog_checks/cfssl/config_models/defaults.py b/cfssl/datadog_checks/cfssl/config_models/defaults.py index 951e1cd7a1..4285d397c5 100644 --- a/cfssl/datadog_checks/cfssl/config_models/defaults.py +++ b/cfssl/datadog_checks/cfssl/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/cfssl/datadog_checks/cfssl/config_models/instance.py b/cfssl/datadog_checks/cfssl/config_models/instance.py index 5c429ab7d9..3e6cdf3534 100644 --- a/cfssl/datadog_checks/cfssl/config_models/instance.py +++ b/cfssl/datadog_checks/cfssl/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,43 +16,43 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None url: str - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/cfssl/datadog_checks/cfssl/config_models/shared.py b/cfssl/datadog_checks/cfssl/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/cfssl/datadog_checks/cfssl/config_models/shared.py +++ b/cfssl/datadog_checks/cfssl/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/cloudnatix/datadog_checks/cloudnatix/config_models/defaults.py b/cloudnatix/datadog_checks/cloudnatix/config_models/defaults.py index a89e585e3b..c714587e6d 100644 --- a/cloudnatix/datadog_checks/cloudnatix/config_models/defaults.py +++ b/cloudnatix/datadog_checks/cloudnatix/config_models/defaults.py @@ -3,272 +3,122 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_cache_metric_wildcards(field, value): +def instance_cache_metric_wildcards(): return True -def instance_cache_shared_labels(field, value): +def instance_cache_shared_labels(): return True -def instance_collect_counters_with_distributions(field, value): +def instance_collect_counters_with_distributions(): return False -def instance_collect_histogram_buckets(field, value): +def instance_collect_histogram_buckets(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_histogram_buckets_as_distributions(field, value): +def instance_histogram_buckets_as_distributions(): return False -def instance_hostname_format(field, value): - return get_default_field_value(field, value) - - -def instance_hostname_label(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_connection_errors(field, value): +def instance_ignore_connection_errors(): return False -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_non_cumulative_histogram_buckets(field, value): +def instance_non_cumulative_histogram_buckets(): return False -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_openmetrics_endpoint(field, value): +def instance_openmetrics_endpoint(): return 'http://clusteragent.cloudnatix.svc.cluster.local:8082/metrics' -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_raw_line_filters(field, value): - return get_default_field_value(field, value) - - -def instance_raw_metric_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_rename_labels(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_share_labels(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_telemetry(field, value): +def instance_telemetry(): return False -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_latest_spec(field, value): +def instance_use_latest_spec(): return False -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/cloudnatix/datadog_checks/cloudnatix/config_models/instance.py b/cloudnatix/datadog_checks/cloudnatix/config_models/instance.py index af541373a9..de7053b7e7 100644 --- a/cloudnatix/datadog_checks/cloudnatix/config_models/instance.py +++ b/cloudnatix/datadog_checks/cloudnatix/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,146 +17,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exclude_labels: Optional[Sequence[str]] - exclude_metrics: Optional[Sequence[str]] - exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - headers: Optional[Mapping[str, Any]] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: Optional[bool] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] - openmetrics_endpoint: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - rename_labels: Optional[Mapping[str, Any]] - request_size: Optional[float] - service: Optional[str] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - tag_by_endpoint: Optional[bool] - tags: Optional[Sequence[str]] - telemetry: Optional[bool] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None + openmetrics_endpoint: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/instance.py b/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/instance.py index 36885c97a6..c7bfee3bb0 100644 --- a/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/instance.py +++ b/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/instance.py @@ -5,25 +5,28 @@ from __future__ import annotations -from typing import Literal, Optional +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator +from typing_extensions import Literal from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - alerts_limit: Optional[int] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + alerts_limit: Optional[int] = None cl_id: str cl_secret: str - organization_id: Optional[str] - threat_level: Optional[str] + organization_id: Optional[str] = None + threat_level: Optional[str] = None threat_type: Optional[ Literal[ 'Brand Protection', @@ -39,26 +42,21 @@ class Config: 'Web Attack', 'Trend Anomaly', ] - ] + ] = None - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/shared.py b/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/shared.py +++ b/cybersixgill_actionable_alerts/datadog_checks/cybersixgill_actionable_alerts/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/exim/datadog_checks/exim/config_models/defaults.py b/exim/datadog_checks/exim/config_models/defaults.py index 951e1cd7a1..4285d397c5 100644 --- a/exim/datadog_checks/exim/config_models/defaults.py +++ b/exim/datadog_checks/exim/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/exim/datadog_checks/exim/config_models/instance.py b/exim/datadog_checks/exim/config_models/instance.py index 116d8de9ba..8564055409 100644 --- a/exim/datadog_checks/exim/config_models/instance.py +++ b/exim/datadog_checks/exim/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,42 +16,42 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/exim/datadog_checks/exim/config_models/shared.py b/exim/datadog_checks/exim/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/exim/datadog_checks/exim/config_models/shared.py +++ b/exim/datadog_checks/exim/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/filemage/datadog_checks/filemage/config_models/defaults.py b/filemage/datadog_checks/filemage/config_models/defaults.py index 951e1cd7a1..4285d397c5 100644 --- a/filemage/datadog_checks/filemage/config_models/defaults.py +++ b/filemage/datadog_checks/filemage/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/filemage/datadog_checks/filemage/config_models/instance.py b/filemage/datadog_checks/filemage/config_models/instance.py index 533dd78d60..5569715ad1 100644 --- a/filemage/datadog_checks/filemage/config_models/instance.py +++ b/filemage/datadog_checks/filemage/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,53 +16,54 @@ class FilemageApiConfig(BaseModel): - class Config: - allow_mutation = False - - apitoken: Optional[str] - rooturl: Optional[str] - verifyssl: Optional[bool] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + apitoken: Optional[str] = None + rooturl: Optional[str] = None + verifyssl: Optional[bool] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None filemage_api_config: FilemageApiConfig - filemage_service_checks: Sequence[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] + filemage_service_checks: tuple[str, ...] + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/filemage/datadog_checks/filemage/config_models/shared.py b/filemage/datadog_checks/filemage/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/filemage/datadog_checks/filemage/config_models/shared.py +++ b/filemage/datadog_checks/filemage/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/fluentbit/datadog_checks/fluentbit/config_models/defaults.py b/fluentbit/datadog_checks/fluentbit/config_models/defaults.py index cddaf2e995..bce990b0e2 100644 --- a/fluentbit/datadog_checks/fluentbit/config_models/defaults.py +++ b/fluentbit/datadog_checks/fluentbit/config_models/defaults.py @@ -3,288 +3,126 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_proxy(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_skip_proxy(field, value): +def shared_skip_proxy(): return False -def shared_timeout(field, value): +def shared_timeout(): return 10 -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_cache_metric_wildcards(field, value): +def instance_cache_metric_wildcards(): return True -def instance_cache_shared_labels(field, value): +def instance_cache_shared_labels(): return True -def instance_collect_counters_with_distributions(field, value): +def instance_collect_counters_with_distributions(): return False -def instance_collect_histogram_buckets(field, value): +def instance_collect_histogram_buckets(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_histogram_buckets_as_distributions(field, value): +def instance_histogram_buckets_as_distributions(): return False -def instance_hostname_format(field, value): - return get_default_field_value(field, value) - - -def instance_hostname_label(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_connection_errors(field, value): +def instance_ignore_connection_errors(): return False -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_non_cumulative_histogram_buckets(field, value): +def instance_non_cumulative_histogram_buckets(): return False -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_openmetrics_endpoint(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_raw_line_filters(field, value): - return get_default_field_value(field, value) - - -def instance_raw_metric_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_rename_labels(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_share_labels(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_telemetry(field, value): +def instance_telemetry(): return False -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_latest_spec(field, value): +def instance_use_latest_spec(): return False -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/fluentbit/datadog_checks/fluentbit/config_models/instance.py b/fluentbit/datadog_checks/fluentbit/config_models/instance.py index e47ad8057e..3a106bde68 100644 --- a/fluentbit/datadog_checks/fluentbit/config_models/instance.py +++ b/fluentbit/datadog_checks/fluentbit/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,147 +17,152 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exclude_labels: Optional[Sequence[str]] - exclude_metrics: Optional[Sequence[str]] - exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - headers: Optional[Mapping[str, Any]] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: Optional[bool] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None metrics_endpoint: str - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] - openmetrics_endpoint: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - rename_labels: Optional[Mapping[str, Any]] - request_size: Optional[float] - service: Optional[str] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - tag_by_endpoint: Optional[bool] - tags: Optional[Sequence[str]] - telemetry: Optional[bool] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None + openmetrics_endpoint: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/fluentbit/datadog_checks/fluentbit/config_models/shared.py b/fluentbit/datadog_checks/fluentbit/config_models/shared.py index 610c4e57ca..da933d6d8a 100644 --- a/fluentbit/datadog_checks/fluentbit/config_models/shared.py +++ b/fluentbit/datadog_checks/fluentbit/config_models/shared.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,41 +16,41 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/fluxcd/datadog_checks/fluxcd/config_models/defaults.py b/fluxcd/datadog_checks/fluxcd/config_models/defaults.py index 951e1cd7a1..4285d397c5 100644 --- a/fluxcd/datadog_checks/fluxcd/config_models/defaults.py +++ b/fluxcd/datadog_checks/fluxcd/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/fluxcd/datadog_checks/fluxcd/config_models/instance.py b/fluxcd/datadog_checks/fluxcd/config_models/instance.py index 116d8de9ba..8564055409 100644 --- a/fluxcd/datadog_checks/fluxcd/config_models/instance.py +++ b/fluxcd/datadog_checks/fluxcd/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,42 +16,42 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/fluxcd/datadog_checks/fluxcd/config_models/shared.py b/fluxcd/datadog_checks/fluxcd/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/fluxcd/datadog_checks/fluxcd/config_models/shared.py +++ b/fluxcd/datadog_checks/fluxcd/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/gatekeeper/datadog_checks/gatekeeper/config_models/defaults.py b/gatekeeper/datadog_checks/gatekeeper/config_models/defaults.py index baa05ba747..70097ecc00 100644 --- a/gatekeeper/datadog_checks/gatekeeper/config_models/defaults.py +++ b/gatekeeper/datadog_checks/gatekeeper/config_models/defaults.py @@ -3,272 +3,118 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_proxy(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_skip_proxy(field, value): +def shared_skip_proxy(): return False -def shared_timeout(field, value): +def shared_timeout(): return 10 -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_bearer_token_auth(field, value): - return get_default_field_value(field, value) - - -def instance_bearer_token_path(field, value): - return get_default_field_value(field, value) - - -def instance_bearer_token_refresh_interval(field, value): +def instance_bearer_token_refresh_interval(): return 60 -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_health_service_check(field, value): +def instance_health_service_check(): return True -def instance_ignore_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_label_joins(field, value): - return get_default_field_value(field, value) - - -def instance_label_to_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_labels_mapper(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_namespace(field, value): +def instance_namespace(): return 'service' -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_prometheus_metrics_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 10 -def instance_send_distribution_buckets(field, value): +def instance_send_distribution_buckets(): return False -def instance_send_distribution_counts_as_monotonic(field, value): +def instance_send_distribution_counts_as_monotonic(): return False -def instance_send_distribution_sums_as_monotonic(field, value): +def instance_send_distribution_sums_as_monotonic(): return False -def instance_send_histograms_buckets(field, value): +def instance_send_histograms_buckets(): return True -def instance_send_monotonic_counter(field, value): +def instance_send_monotonic_counter(): return True -def instance_send_monotonic_with_gauge(field, value): +def instance_send_monotonic_with_gauge(): return False -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_type_overrides(field, value): - return get_default_field_value(field, value) - - -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/gatekeeper/datadog_checks/gatekeeper/config_models/instance.py b/gatekeeper/datadog_checks/gatekeeper/config_models/instance.py index 5e8af33094..b9a390eabe 100644 --- a/gatekeeper/datadog_checks/gatekeeper/config_models/instance.py +++ b/gatekeeper/datadog_checks/gatekeeper/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,141 +17,146 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class IgnoreMetricsByLabels(BaseModel): - class Config: - allow_mutation = False - - target_label_key: Optional[str] - target_label_value_list: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + target_label_key: Optional[str] = None + target_label_value_list: Optional[tuple[str, ...]] = None class TargetMetric(BaseModel): - class Config: - allow_mutation = False - - label_to_match: Optional[str] - labels_to_get: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + label_to_match: Optional[str] = None + labels_to_get: Optional[tuple[str, ...]] = None class LabelJoins(BaseModel): - class Config: - allow_mutation = False - - target_metric: Optional[TargetMetric] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + target_metric: Optional[TargetMetric] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - bearer_token_auth: Optional[Union[bool, str]] - bearer_token_path: Optional[str] - bearer_token_refresh_interval: Optional[int] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - exclude_labels: Optional[Sequence[str]] - extra_headers: Optional[Mapping[str, Any]] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + bearer_token_auth: Optional[Union[bool, str]] = None + bearer_token_path: Optional[str] = None + bearer_token_refresh_interval: Optional[int] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None gatekeeper_health_endpoint: str - headers: Optional[Mapping[str, Any]] - health_service_check: Optional[bool] - ignore_metrics: Optional[Sequence[str]] - ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - label_joins: Optional[LabelJoins] - label_to_hostname: Optional[str] - labels_mapper: Optional[Mapping[str, Any]] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, str]]]] - min_collection_interval: Optional[float] - namespace: Optional[str] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - prometheus_metrics_prefix: Optional[str] + headers: Optional[MappingProxyType[str, Any]] = None + health_service_check: Optional[bool] = None + ignore_metrics: Optional[tuple[str, ...]] = None + ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + label_joins: Optional[LabelJoins] = None + label_to_hostname: Optional[str] = None + labels_mapper: Optional[MappingProxyType[str, Any]] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, str]], ...]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + prometheus_metrics_prefix: Optional[str] = None prometheus_url: str - proxy: Optional[Proxy] - read_timeout: Optional[float] - request_size: Optional[float] - send_distribution_buckets: Optional[bool] - send_distribution_counts_as_monotonic: Optional[bool] - send_distribution_sums_as_monotonic: Optional[bool] - send_histograms_buckets: Optional[bool] - send_monotonic_counter: Optional[bool] - send_monotonic_with_gauge: Optional[bool] - service: Optional[str] - skip_proxy: Optional[bool] - tags: Optional[Sequence[str]] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - type_overrides: Optional[Mapping[str, Any]] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + proxy: Optional[Proxy] = None + read_timeout: Optional[float] = None + request_size: Optional[float] = None + send_distribution_buckets: Optional[bool] = None + send_distribution_counts_as_monotonic: Optional[bool] = None + send_distribution_sums_as_monotonic: Optional[bool] = None + send_histograms_buckets: Optional[bool] = None + send_monotonic_counter: Optional[bool] = None + send_monotonic_with_gauge: Optional[bool] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + type_overrides: Optional[MappingProxyType[str, Any]] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/gatekeeper/datadog_checks/gatekeeper/config_models/shared.py b/gatekeeper/datadog_checks/gatekeeper/config_models/shared.py index 610c4e57ca..da933d6d8a 100644 --- a/gatekeeper/datadog_checks/gatekeeper/config_models/shared.py +++ b/gatekeeper/datadog_checks/gatekeeper/config_models/shared.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,41 +16,41 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/gitea/datadog_checks/gitea/config_models/defaults.py b/gitea/datadog_checks/gitea/config_models/defaults.py index 3b7a863d40..bce990b0e2 100644 --- a/gitea/datadog_checks/gitea/config_models/defaults.py +++ b/gitea/datadog_checks/gitea/config_models/defaults.py @@ -3,280 +3,126 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_proxy(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_skip_proxy(field, value): +def shared_skip_proxy(): return False -def shared_timeout(field, value): +def shared_timeout(): return 10 -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_cache_metric_wildcards(field, value): +def instance_cache_metric_wildcards(): return True -def instance_cache_shared_labels(field, value): +def instance_cache_shared_labels(): return True -def instance_collect_counters_with_distributions(field, value): +def instance_collect_counters_with_distributions(): return False -def instance_collect_histogram_buckets(field, value): +def instance_collect_histogram_buckets(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_histogram_buckets_as_distributions(field, value): +def instance_histogram_buckets_as_distributions(): return False -def instance_hostname_format(field, value): - return get_default_field_value(field, value) - - -def instance_hostname_label(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) +def instance_ignore_connection_errors(): + return False -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_non_cumulative_histogram_buckets(field, value): +def instance_non_cumulative_histogram_buckets(): return False -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_raw_line_filters(field, value): - return get_default_field_value(field, value) - - -def instance_raw_metric_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_rename_labels(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_share_labels(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_telemetry(field, value): +def instance_telemetry(): return False -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_latest_spec(field, value): +def instance_use_latest_spec(): return False -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/gitea/datadog_checks/gitea/config_models/instance.py b/gitea/datadog_checks/gitea/config_models/instance.py index ba24db937a..4ef50718ad 100644 --- a/gitea/datadog_checks/gitea/config_models/instance.py +++ b/gitea/datadog_checks/gitea/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,145 +17,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exclude_labels: Optional[Sequence[str]] - exclude_metrics: Optional[Sequence[str]] - exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - headers: Optional[Mapping[str, Any]] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None openmetrics_endpoint: str - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - rename_labels: Optional[Mapping[str, Any]] - request_size: Optional[float] - service: Optional[str] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - tag_by_endpoint: Optional[bool] - tags: Optional[Sequence[str]] - telemetry: Optional[bool] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/gitea/datadog_checks/gitea/config_models/shared.py b/gitea/datadog_checks/gitea/config_models/shared.py index 610c4e57ca..da933d6d8a 100644 --- a/gitea/datadog_checks/gitea/config_models/shared.py +++ b/gitea/datadog_checks/gitea/config_models/shared.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,41 +16,41 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/defaults.py b/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/defaults.py index c247a516d4..6280cc8b56 100644 --- a/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/defaults.py +++ b/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/defaults.py @@ -3,68 +3,34 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_cumulative(field, value): +def instance_cumulative(): return True -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_duration(field, value): +def instance_duration(): return 60 -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_env(field, value): +def instance_env(): return 'prod' -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 1 -def instance_profiles(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_private_key_password(field, value): - return get_default_field_value(field, value) - - -def instance_tls_validate_hostname(field, value): +def instance_tls_validate_hostname(): return True -def instance_tls_verify(field, value): +def instance_tls_verify(): return True diff --git a/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/instance.py b/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/instance.py index 48dcd2c75a..d39a6dcb38 100644 --- a/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/instance.py +++ b/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,53 +16,53 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - cumulative: Optional[bool] - disable_generic_tags: Optional[bool] - duration: Optional[int] - empty_default_hostname: Optional[bool] - env: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + cumulative: Optional[bool] = None + disable_generic_tags: Optional[bool] = None + duration: Optional[int] = None + empty_default_hostname: Optional[bool] = None + env: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None pprof_url: str - profiles: Optional[Sequence[str]] + profiles: Optional[tuple[str, ...]] = None service: str - tags: Optional[Sequence[str]] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_private_key: Optional[str] - tls_private_key_password: Optional[str] - tls_validate_hostname: Optional[bool] - tls_verify: Optional[bool] - - @root_validator(pre=True) + tags: Optional[tuple[str, ...]] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_private_key: Optional[str] = None + tls_private_key_password: Optional[str] = None + tls_validate_hostname: Optional[bool] = None + tls_verify: Optional[bool] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/shared.py b/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/shared.py +++ b/go_pprof_scraper/datadog_checks/go_pprof_scraper/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/grpc_check/datadog_checks/grpc_check/config_models/defaults.py b/grpc_check/datadog_checks/grpc_check/config_models/defaults.py index fe5ba0317c..7270550308 100644 --- a/grpc_check/datadog_checks/grpc_check/config_models/defaults.py +++ b/grpc_check/datadog_checks/grpc_check/config_models/defaults.py @@ -3,56 +3,30 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_ca_cert(field, value): +def instance_ca_cert(): return '/path/to/ca.pem' -def instance_client_cert(field, value): +def instance_client_cert(): return '/path/to/client.pem' -def instance_client_key(field, value): +def instance_client_key(): return '/path/to/client-key.pem' -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_grpc_server_service(field, value): - return get_default_field_value(field, value) - - -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_rpc_header(field, value): - return get_default_field_value(field, value) - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_timeout(field, value): +def instance_timeout(): return 1000 diff --git a/grpc_check/datadog_checks/grpc_check/config_models/instance.py b/grpc_check/datadog_checks/grpc_check/config_models/instance.py index 94e7ae4da0..22b4073d6f 100644 --- a/grpc_check/datadog_checks/grpc_check/config_models/instance.py +++ b/grpc_check/datadog_checks/grpc_check/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,49 +16,49 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - ca_cert: Optional[str] - client_cert: Optional[str] - client_key: Optional[str] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + ca_cert: Optional[str] = None + client_cert: Optional[str] = None + client_key: Optional[str] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None grpc_server_address: str - grpc_server_service: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - rpc_header: Optional[Sequence[str]] - service: Optional[str] - tags: Optional[Sequence[str]] - timeout: Optional[int] - - @root_validator(pre=True) + grpc_server_service: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + rpc_header: Optional[tuple[str, ...]] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None + timeout: Optional[int] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/grpc_check/datadog_checks/grpc_check/config_models/shared.py b/grpc_check/datadog_checks/grpc_check/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/grpc_check/datadog_checks/grpc_check/config_models/shared.py +++ b/grpc_check/datadog_checks/grpc_check/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/hikaricp/datadog_checks/hikaricp/config_models/defaults.py b/hikaricp/datadog_checks/hikaricp/config_models/defaults.py index fe05663580..bce990b0e2 100644 --- a/hikaricp/datadog_checks/hikaricp/config_models/defaults.py +++ b/hikaricp/datadog_checks/hikaricp/config_models/defaults.py @@ -3,284 +3,126 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_proxy(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_skip_proxy(field, value): +def shared_skip_proxy(): return False -def shared_timeout(field, value): +def shared_timeout(): return 10 -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_cache_metric_wildcards(field, value): +def instance_cache_metric_wildcards(): return True -def instance_cache_shared_labels(field, value): +def instance_cache_shared_labels(): return True -def instance_collect_counters_with_distributions(field, value): +def instance_collect_counters_with_distributions(): return False -def instance_collect_histogram_buckets(field, value): +def instance_collect_histogram_buckets(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_histogram_buckets_as_distributions(field, value): +def instance_histogram_buckets_as_distributions(): return False -def instance_hostname_format(field, value): - return get_default_field_value(field, value) - - -def instance_hostname_label(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_connection_errors(field, value): +def instance_ignore_connection_errors(): return False -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_non_cumulative_histogram_buckets(field, value): +def instance_non_cumulative_histogram_buckets(): return False -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_raw_line_filters(field, value): - return get_default_field_value(field, value) - - -def instance_raw_metric_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_rename_labels(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_share_labels(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_telemetry(field, value): +def instance_telemetry(): return False -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_latest_spec(field, value): +def instance_use_latest_spec(): return False -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/hikaricp/datadog_checks/hikaricp/config_models/instance.py b/hikaricp/datadog_checks/hikaricp/config_models/instance.py index 3c7e4a4d35..4ef50718ad 100644 --- a/hikaricp/datadog_checks/hikaricp/config_models/instance.py +++ b/hikaricp/datadog_checks/hikaricp/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,146 +17,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exclude_labels: Optional[Sequence[str]] - exclude_metrics: Optional[Sequence[str]] - exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - headers: Optional[Mapping[str, Any]] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: Optional[bool] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None openmetrics_endpoint: str - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - rename_labels: Optional[Mapping[str, Any]] - request_size: Optional[float] - service: Optional[str] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - tag_by_endpoint: Optional[bool] - tags: Optional[Sequence[str]] - telemetry: Optional[bool] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/hikaricp/datadog_checks/hikaricp/config_models/shared.py b/hikaricp/datadog_checks/hikaricp/config_models/shared.py index 610c4e57ca..da933d6d8a 100644 --- a/hikaricp/datadog_checks/hikaricp/config_models/shared.py +++ b/hikaricp/datadog_checks/hikaricp/config_models/shared.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,41 +16,41 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/mergify/datadog_checks/mergify/config_models/defaults.py b/mergify/datadog_checks/mergify/config_models/defaults.py index 8dbf2f265f..1f66414f2a 100644 --- a/mergify/datadog_checks/mergify/config_models/defaults.py +++ b/mergify/datadog_checks/mergify/config_models/defaults.py @@ -3,36 +3,18 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_mergify_api_url(field, value): +def instance_mergify_api_url(): return 'https://api.mergify.com' -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 120 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/mergify/datadog_checks/mergify/config_models/instance.py b/mergify/datadog_checks/mergify/config_models/instance.py index e448e5b8be..7ddc6684b1 100644 --- a/mergify/datadog_checks/mergify/config_models/instance.py +++ b/mergify/datadog_checks/mergify/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence +from types import MappingProxyType +from typing import Any, Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,45 +17,45 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - mergify_api_url: Optional[str] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - repositories: Mapping[str, Any] - service: Optional[str] - tags: Optional[Sequence[str]] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + mergify_api_url: Optional[str] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + repositories: MappingProxyType[str, Any] + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None token: str - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/mergify/datadog_checks/mergify/config_models/shared.py b/mergify/datadog_checks/mergify/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/mergify/datadog_checks/mergify/config_models/shared.py +++ b/mergify/datadog_checks/mergify/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/neo4j/datadog_checks/neo4j/config_models/defaults.py b/neo4j/datadog_checks/neo4j/config_models/defaults.py index 0765821641..1989f7044c 100644 --- a/neo4j/datadog_checks/neo4j/config_models/defaults.py +++ b/neo4j/datadog_checks/neo4j/config_models/defaults.py @@ -3,276 +3,122 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_cache_metric_wildcards(field, value): +def instance_cache_metric_wildcards(): return True -def instance_cache_shared_labels(field, value): +def instance_cache_shared_labels(): return True -def instance_collect_counters_with_distributions(field, value): +def instance_collect_counters_with_distributions(): return False -def instance_collect_histogram_buckets(field, value): +def instance_collect_histogram_buckets(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_histogram_buckets_as_distributions(field, value): +def instance_histogram_buckets_as_distributions(): return False -def instance_hostname_format(field, value): - return get_default_field_value(field, value) - - -def instance_hostname_label(field, value): - return get_default_field_value(field, value) - - -def instance_ignore_connection_errors(field, value): +def instance_ignore_connection_errors(): return False -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_neo4j_dbs(field, value): - return get_default_field_value(field, value) - - -def instance_neo4j_version(field, value): +def instance_neo4j_version(): return '4.3' -def instance_non_cumulative_histogram_buckets(field, value): +def instance_non_cumulative_histogram_buckets(): return False -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_raw_line_filters(field, value): - return get_default_field_value(field, value) - - -def instance_raw_metric_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_rename_labels(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_share_labels(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_telemetry(field, value): +def instance_telemetry(): return False -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_latest_spec(field, value): +def instance_use_latest_spec(): return False -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/neo4j/datadog_checks/neo4j/config_models/instance.py b/neo4j/datadog_checks/neo4j/config_models/instance.py index 33c130ae83..860402a2a2 100644 --- a/neo4j/datadog_checks/neo4j/config_models/instance.py +++ b/neo4j/datadog_checks/neo4j/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,148 +17,153 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exclude_labels: Optional[Sequence[str]] - exclude_metrics: Optional[Sequence[str]] - exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - headers: Optional[Mapping[str, Any]] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_connection_errors: Optional[bool] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - neo4j_dbs: Optional[Sequence[str]] - neo4j_version: Optional[str] - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + neo4j_dbs: Optional[tuple[str, ...]] = None + neo4j_version: Optional[str] = None + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None openmetrics_endpoint: str - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - rename_labels: Optional[Mapping[str, Any]] - request_size: Optional[float] - service: Optional[str] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - tag_by_endpoint: Optional[bool] - tags: Optional[Sequence[str]] - telemetry: Optional[bool] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/nn_sdwan/datadog_checks/nn_sdwan/config_models/defaults.py b/nn_sdwan/datadog_checks/nn_sdwan/config_models/defaults.py index 951e1cd7a1..4285d397c5 100644 --- a/nn_sdwan/datadog_checks/nn_sdwan/config_models/defaults.py +++ b/nn_sdwan/datadog_checks/nn_sdwan/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/nn_sdwan/datadog_checks/nn_sdwan/config_models/instance.py b/nn_sdwan/datadog_checks/nn_sdwan/config_models/instance.py index 24607fdb8c..af3a092c9b 100644 --- a/nn_sdwan/datadog_checks/nn_sdwan/config_models/instance.py +++ b/nn_sdwan/datadog_checks/nn_sdwan/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,46 +16,46 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None hostname: str - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None password: str protocol: str - service: Optional[str] - tags: Optional[Sequence[str]] + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None username: str - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/nn_sdwan/datadog_checks/nn_sdwan/config_models/shared.py b/nn_sdwan/datadog_checks/nn_sdwan/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/nn_sdwan/datadog_checks/nn_sdwan/config_models/shared.py +++ b/nn_sdwan/datadog_checks/nn_sdwan/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/purefa/datadog_checks/purefa/config_models/defaults.py b/purefa/datadog_checks/purefa/config_models/defaults.py index 7040f7c447..e4428fe6f2 100644 --- a/purefa/datadog_checks/purefa/config_models/defaults.py +++ b/purefa/datadog_checks/purefa/config_models/defaults.py @@ -3,280 +3,130 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_proxy(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_skip_proxy(field, value): +def shared_skip_proxy(): return False -def shared_timeout(field, value): +def shared_timeout(): return 10 -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_cache_metric_wildcards(field, value): +def instance_cache_metric_wildcards(): return True -def instance_cache_shared_labels(field, value): +def instance_cache_shared_labels(): return False -def instance_collect_counters_with_distributions(field, value): +def instance_collect_counters_with_distributions(): return False -def instance_collect_histogram_buckets(field, value): +def instance_collect_histogram_buckets(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return True -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_histogram_buckets_as_distributions(field, value): +def instance_histogram_buckets_as_distributions(): return False -def instance_hostname_format(field, value): - return get_default_field_value(field, value) - - -def instance_hostname_label(field, value): +def instance_hostname_label(): return 'host' -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) +def instance_ignore_connection_errors(): + return False -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 120 -def instance_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_non_cumulative_histogram_buckets(field, value): +def instance_non_cumulative_histogram_buckets(): return False -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_raw_line_filters(field, value): - return get_default_field_value(field, value) - - -def instance_raw_metric_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_rename_labels(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_share_labels(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_telemetry(field, value): +def instance_telemetry(): return False -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_latest_spec(field, value): +def instance_use_latest_spec(): return False -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/purefa/datadog_checks/purefa/config_models/instance.py b/purefa/datadog_checks/purefa/config_models/instance.py index ba24db937a..4ef50718ad 100644 --- a/purefa/datadog_checks/purefa/config_models/instance.py +++ b/purefa/datadog_checks/purefa/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,145 +17,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exclude_labels: Optional[Sequence[str]] - exclude_metrics: Optional[Sequence[str]] - exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - headers: Optional[Mapping[str, Any]] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None openmetrics_endpoint: str - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - rename_labels: Optional[Mapping[str, Any]] - request_size: Optional[float] - service: Optional[str] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - tag_by_endpoint: Optional[bool] - tags: Optional[Sequence[str]] - telemetry: Optional[bool] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/purefa/datadog_checks/purefa/config_models/shared.py b/purefa/datadog_checks/purefa/config_models/shared.py index 610c4e57ca..da933d6d8a 100644 --- a/purefa/datadog_checks/purefa/config_models/shared.py +++ b/purefa/datadog_checks/purefa/config_models/shared.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,41 +16,41 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/purefb/datadog_checks/purefb/config_models/defaults.py b/purefb/datadog_checks/purefb/config_models/defaults.py index 332005973c..ae7d2e6e6b 100644 --- a/purefb/datadog_checks/purefb/config_models/defaults.py +++ b/purefb/datadog_checks/purefb/config_models/defaults.py @@ -3,280 +3,130 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_proxy(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_skip_proxy(field, value): +def shared_skip_proxy(): return False -def shared_timeout(field, value): +def shared_timeout(): return 10 -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_cache_metric_wildcards(field, value): +def instance_cache_metric_wildcards(): return True -def instance_cache_shared_labels(field, value): +def instance_cache_shared_labels(): return True -def instance_collect_counters_with_distributions(field, value): +def instance_collect_counters_with_distributions(): return False -def instance_collect_histogram_buckets(field, value): +def instance_collect_histogram_buckets(): return True -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return True -def instance_enable_health_service_check(field, value): +def instance_enable_health_service_check(): return True -def instance_exclude_labels(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_exclude_metrics_by_labels(field, value): - return get_default_field_value(field, value) - - -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_extra_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_histogram_buckets_as_distributions(field, value): +def instance_histogram_buckets_as_distributions(): return False -def instance_hostname_format(field, value): - return get_default_field_value(field, value) - - -def instance_hostname_label(field, value): +def instance_hostname_label(): return 'host' -def instance_ignore_tags(field, value): - return get_default_field_value(field, value) - - -def instance_include_labels(field, value): - return get_default_field_value(field, value) +def instance_ignore_connection_errors(): + return False -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_metrics(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 120 -def instance_namespace(field, value): - return get_default_field_value(field, value) - - -def instance_non_cumulative_histogram_buckets(field, value): +def instance_non_cumulative_histogram_buckets(): return False -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return False -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_raw_line_filters(field, value): - return get_default_field_value(field, value) - - -def instance_raw_metric_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_rename_labels(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_share_labels(field, value): - return get_default_field_value(field, value) - - -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tag_by_endpoint(field, value): +def instance_tag_by_endpoint(): return True -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_telemetry(field, value): +def instance_telemetry(): return False -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_latest_spec(field, value): +def instance_use_latest_spec(): return False -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True -def instance_use_process_start_time(field, value): +def instance_use_process_start_time(): return False - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/purefb/datadog_checks/purefb/config_models/instance.py b/purefb/datadog_checks/purefb/config_models/instance.py index ba24db937a..4ef50718ad 100644 --- a/purefb/datadog_checks/purefb/config_models/instance.py +++ b/purefb/datadog_checks/purefb/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence, Union +from types import MappingProxyType +from typing import Any, Optional, Union -from pydantic import BaseModel, Extra, Field, root_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,145 +17,151 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class ExtraMetric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Metric(BaseModel): - class Config: - extra = Extra.allow - allow_mutation = False - - name: Optional[str] - type: Optional[str] + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra='allow', + frozen=True, + ) + name: Optional[str] = None + type: Optional[str] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class ShareLabel(BaseModel): - class Config: - allow_mutation = False - - labels: Optional[Sequence[str]] - match: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + labels: Optional[tuple[str, ...]] = None + match: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - cache_metric_wildcards: Optional[bool] - cache_shared_labels: Optional[bool] - collect_counters_with_distributions: Optional[bool] - collect_histogram_buckets: Optional[bool] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - enable_health_service_check: Optional[bool] - exclude_labels: Optional[Sequence[str]] - exclude_metrics: Optional[Sequence[str]] - exclude_metrics_by_labels: Optional[Mapping[str, Union[bool, Sequence[str]]]] - extra_headers: Optional[Mapping[str, Any]] - extra_metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, ExtraMetric]]]]] - headers: Optional[Mapping[str, Any]] - histogram_buckets_as_distributions: Optional[bool] - hostname_format: Optional[str] - hostname_label: Optional[str] - ignore_tags: Optional[Sequence[str]] - include_labels: Optional[Sequence[str]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - metrics: Optional[Sequence[Union[str, Mapping[str, Union[str, Metric]]]]] - min_collection_interval: Optional[float] - namespace: Optional[str] = Field(None, regex='\\w*') - non_cumulative_histogram_buckets: Optional[bool] - ntlm_domain: Optional[str] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + cache_metric_wildcards: Optional[bool] = None + cache_shared_labels: Optional[bool] = None + collect_counters_with_distributions: Optional[bool] = None + collect_histogram_buckets: Optional[bool] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + enable_health_service_check: Optional[bool] = None + exclude_labels: Optional[tuple[str, ...]] = None + exclude_metrics: Optional[tuple[str, ...]] = None + exclude_metrics_by_labels: Optional[MappingProxyType[str, Union[bool, tuple[str, ...]]]] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + extra_metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, ExtraMetric]]], ...]] = None + headers: Optional[MappingProxyType[str, Any]] = None + histogram_buckets_as_distributions: Optional[bool] = None + hostname_format: Optional[str] = None + hostname_label: Optional[str] = None + ignore_connection_errors: Optional[bool] = None + ignore_tags: Optional[tuple[str, ...]] = None + include_labels: Optional[tuple[str, ...]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + metrics: Optional[tuple[Union[str, MappingProxyType[str, Union[str, Metric]]], ...]] = None + min_collection_interval: Optional[float] = None + namespace: Optional[str] = Field(None, pattern='\\w*') + non_cumulative_histogram_buckets: Optional[bool] = None + ntlm_domain: Optional[str] = None openmetrics_endpoint: str - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] - raw_line_filters: Optional[Sequence[str]] - raw_metric_prefix: Optional[str] - read_timeout: Optional[float] - rename_labels: Optional[Mapping[str, Any]] - request_size: Optional[float] - service: Optional[str] - share_labels: Optional[Mapping[str, Union[bool, ShareLabel]]] - skip_proxy: Optional[bool] - tag_by_endpoint: Optional[bool] - tags: Optional[Sequence[str]] - telemetry: Optional[bool] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] - use_latest_spec: Optional[bool] - use_legacy_auth_encoding: Optional[bool] - use_process_start_time: Optional[bool] - username: Optional[str] - - @root_validator(pre=True) + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None + raw_line_filters: Optional[tuple[str, ...]] = None + raw_metric_prefix: Optional[str] = None + read_timeout: Optional[float] = None + rename_labels: Optional[MappingProxyType[str, Any]] = None + request_size: Optional[float] = None + service: Optional[str] = None + share_labels: Optional[MappingProxyType[str, Union[bool, ShareLabel]]] = None + skip_proxy: Optional[bool] = None + tag_by_endpoint: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + telemetry: Optional[bool] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None + use_latest_spec: Optional[bool] = None + use_legacy_auth_encoding: Optional[bool] = None + use_process_start_time: Optional[bool] = None + username: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/purefb/datadog_checks/purefb/config_models/shared.py b/purefb/datadog_checks/purefb/config_models/shared.py index 610c4e57ca..da933d6d8a 100644 --- a/purefb/datadog_checks/purefb/config_models/shared.py +++ b/purefb/datadog_checks/purefb/config_models/shared.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,41 +16,41 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/scalr/datadog_checks/scalr/config_models/defaults.py b/scalr/datadog_checks/scalr/config_models/defaults.py index 9023f5631d..85c49d028f 100644 --- a/scalr/datadog_checks/scalr/config_models/defaults.py +++ b/scalr/datadog_checks/scalr/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 60 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/scalr/datadog_checks/scalr/config_models/instance.py b/scalr/datadog_checks/scalr/config_models/instance.py index 89a7f26436..f17d7b1222 100644 --- a/scalr/datadog_checks/scalr/config_models/instance.py +++ b/scalr/datadog_checks/scalr/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,44 +16,44 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) access_token: str - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None url: str - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/scalr/datadog_checks/scalr/config_models/shared.py b/scalr/datadog_checks/scalr/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/scalr/datadog_checks/scalr/config_models/shared.py +++ b/scalr/datadog_checks/scalr/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/sonarr/datadog_checks/sonarr/config_models/defaults.py b/sonarr/datadog_checks/sonarr/config_models/defaults.py index 951e1cd7a1..4285d397c5 100644 --- a/sonarr/datadog_checks/sonarr/config_models/defaults.py +++ b/sonarr/datadog_checks/sonarr/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/sonarr/datadog_checks/sonarr/config_models/instance.py b/sonarr/datadog_checks/sonarr/config_models/instance.py index 287f5ac683..289255430a 100644 --- a/sonarr/datadog_checks/sonarr/config_models/instance.py +++ b/sonarr/datadog_checks/sonarr/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,44 +16,44 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) api_key: str - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None url: str - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/sonarr/datadog_checks/sonarr/config_models/shared.py b/sonarr/datadog_checks/sonarr/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/sonarr/datadog_checks/sonarr/config_models/shared.py +++ b/sonarr/datadog_checks/sonarr/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/syncthing/datadog_checks/syncthing/config_models/defaults.py b/syncthing/datadog_checks/syncthing/config_models/defaults.py index 951e1cd7a1..4285d397c5 100644 --- a/syncthing/datadog_checks/syncthing/config_models/defaults.py +++ b/syncthing/datadog_checks/syncthing/config_models/defaults.py @@ -3,32 +3,14 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) diff --git a/syncthing/datadog_checks/syncthing/config_models/instance.py b/syncthing/datadog_checks/syncthing/config_models/instance.py index 287f5ac683..289255430a 100644 --- a/syncthing/datadog_checks/syncthing/config_models/instance.py +++ b/syncthing/datadog_checks/syncthing/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,44 +16,44 @@ class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) api_key: str - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - service: Optional[str] - tags: Optional[Sequence[str]] + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None url: str - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/syncthing/datadog_checks/syncthing/config_models/shared.py b/syncthing/datadog_checks/syncthing/config_models/shared.py index 16f6c25ddd..4017c43e2e 100644 --- a/syncthing/datadog_checks/syncthing/config_models/shared.py +++ b/syncthing/datadog_checks/syncthing/config_models/shared.py @@ -7,38 +7,35 @@ from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation -from . import defaults, validators +from . import validators class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - service: Optional[str] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + service: Optional[str] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/trino/datadog_checks/trino/config_models/defaults.py b/trino/datadog_checks/trino/config_models/defaults.py index dd72d075a3..528cd9ffb8 100644 --- a/trino/datadog_checks/trino/config_models/defaults.py +++ b/trino/datadog_checks/trino/config_models/defaults.py @@ -3,108 +3,38 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_collect_default_metrics(field, value): +def shared_collect_default_metrics(): return False -def shared_conf(field, value): - return get_default_field_value(field, value) - - -def shared_new_gc_metrics(field, value): +def shared_new_gc_metrics(): return False -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_service_check_prefix(field, value): - return get_default_field_value(field, value) - - -def instance_collect_default_jvm_metrics(field, value): +def instance_collect_default_jvm_metrics(): return True -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return False -def instance_is_jmx(field, value): +def instance_is_jmx(): return False -def instance_java_bin_path(field, value): - return get_default_field_value(field, value) - - -def instance_java_options(field, value): - return get_default_field_value(field, value) - - -def instance_jmx_url(field, value): - return get_default_field_value(field, value) - - -def instance_key_store_password(field, value): - return get_default_field_value(field, value) - - -def instance_key_store_path(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_name(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_process_name_regex(field, value): - return get_default_field_value(field, value) - - -def instance_rmi_client_timeout(field, value): +def instance_rmi_client_timeout(): return 15000 -def instance_rmi_connection_timeout(field, value): +def instance_rmi_connection_timeout(): return 20000 -def instance_rmi_registry_ssl(field, value): +def instance_rmi_registry_ssl(): return False - - -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_tools_jar_path(field, value): - return get_default_field_value(field, value) - - -def instance_trust_store_password(field, value): - return get_default_field_value(field, value) - - -def instance_trust_store_path(field, value): - return get_default_field_value(field, value) - - -def instance_user(field, value): - return get_default_field_value(field, value) diff --git a/trino/datadog_checks/trino/config_models/instance.py b/trino/datadog_checks/trino/config_models/instance.py index 1ebca81980..3823ae2058 100644 --- a/trino/datadog_checks/trino/config_models/instance.py +++ b/trino/datadog_checks/trino/config_models/instance.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,51 +16,50 @@ class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - collect_default_jvm_metrics: Optional[bool] - empty_default_hostname: Optional[bool] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + collect_default_jvm_metrics: Optional[bool] = None + empty_default_hostname: Optional[bool] = None host: str - is_jmx: Optional[bool] - java_bin_path: Optional[str] - java_options: Optional[str] - jmx_url: Optional[str] - key_store_password: Optional[str] - key_store_path: Optional[str] - min_collection_interval: Optional[float] - name: Optional[str] - password: Optional[str] + is_jmx: Optional[bool] = None + java_bin_path: Optional[str] = None + java_options: Optional[str] = None + jmx_url: Optional[str] = None + key_store_password: Optional[str] = None + key_store_path: Optional[str] = None + min_collection_interval: Optional[float] = None + name: Optional[str] = None + password: Optional[str] = None port: int - process_name_regex: Optional[str] - rmi_client_timeout: Optional[float] - rmi_connection_timeout: Optional[float] - rmi_registry_ssl: Optional[bool] - service: Optional[str] - tags: Optional[Sequence[str]] - tools_jar_path: Optional[str] - trust_store_password: Optional[str] - trust_store_path: Optional[str] - user: Optional[str] + process_name_regex: Optional[str] = None + rmi_client_timeout: Optional[float] = None + rmi_connection_timeout: Optional[float] = None + rmi_registry_ssl: Optional[bool] = None + service: Optional[str] = None + tags: Optional[tuple[str, ...]] = None + tools_jar_path: Optional[str] = None + trust_store_password: Optional[str] = None + trust_store_path: Optional[str] = None + user: Optional[str] = None - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/trino/datadog_checks/trino/config_models/shared.py b/trino/datadog_checks/trino/config_models/shared.py index 01b788cab8..4850ec5d7f 100644 --- a/trino/datadog_checks/trino/config_models/shared.py +++ b/trino/datadog_checks/trino/config_models/shared.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence +from types import MappingProxyType +from typing import Any, Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,34 +17,33 @@ class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - collect_default_metrics: Optional[bool] - conf: Optional[Sequence[Mapping[str, Any]]] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + collect_default_metrics: Optional[bool] = None + conf: Optional[tuple[MappingProxyType[str, Any], ...]] = None is_jmx: bool - new_gc_metrics: Optional[bool] - service: Optional[str] - service_check_prefix: Optional[str] + new_gc_metrics: Optional[bool] = None + service: Optional[str] = None + service_check_prefix: Optional[str] = None - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model)) diff --git a/unifi_console/datadog_checks/unifi_console/config_models/defaults.py b/unifi_console/datadog_checks/unifi_console/config_models/defaults.py index 26e52b2275..6b98b8daff 100644 --- a/unifi_console/datadog_checks/unifi_console/config_models/defaults.py +++ b/unifi_console/datadog_checks/unifi_console/config_models/defaults.py @@ -3,184 +3,82 @@ # ddev -x validate config -s # ddev -x validate models -s -from datadog_checks.base.utils.models.fields import get_default_field_value - -def shared_proxy(field, value): - return get_default_field_value(field, value) - - -def shared_service(field, value): - return get_default_field_value(field, value) - - -def shared_skip_proxy(field, value): +def shared_skip_proxy(): return False -def shared_timeout(field, value): +def shared_timeout(): return 10 -def instance_allow_redirects(field, value): +def instance_allow_redirects(): return True -def instance_auth_token(field, value): - return get_default_field_value(field, value) - - -def instance_auth_type(field, value): +def instance_auth_type(): return 'basic' -def instance_aws_host(field, value): - return get_default_field_value(field, value) - - -def instance_aws_region(field, value): - return get_default_field_value(field, value) - - -def instance_aws_service(field, value): - return get_default_field_value(field, value) - - -def instance_connect_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_disable_generic_tags(field, value): +def instance_disable_generic_tags(): return False -def instance_empty_default_hostname(field, value): +def instance_empty_default_hostname(): return True -def instance_extra_headers(field, value): - return get_default_field_value(field, value) - - -def instance_headers(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_auth(field, value): +def instance_kerberos_auth(): return 'disabled' -def instance_kerberos_cache(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_delegate(field, value): +def instance_kerberos_delegate(): return False -def instance_kerberos_force_initiate(field, value): +def instance_kerberos_force_initiate(): return False -def instance_kerberos_hostname(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_keytab(field, value): - return get_default_field_value(field, value) - - -def instance_kerberos_principal(field, value): - return get_default_field_value(field, value) - - -def instance_log_requests(field, value): +def instance_log_requests(): return False -def instance_metric_patterns(field, value): - return get_default_field_value(field, value) - - -def instance_min_collection_interval(field, value): +def instance_min_collection_interval(): return 15 -def instance_ntlm_domain(field, value): - return get_default_field_value(field, value) - - -def instance_password(field, value): - return get_default_field_value(field, value) - - -def instance_persist_connections(field, value): +def instance_persist_connections(): return True -def instance_proxy(field, value): - return get_default_field_value(field, value) - - -def instance_read_timeout(field, value): - return get_default_field_value(field, value) - - -def instance_request_size(field, value): +def instance_request_size(): return 16 -def instance_service(field, value): - return get_default_field_value(field, value) - - -def instance_site(field, value): +def instance_site(): return 'default' -def instance_skip_proxy(field, value): +def instance_skip_proxy(): return False -def instance_tags(field, value): - return get_default_field_value(field, value) - - -def instance_timeout(field, value): +def instance_timeout(): return 10 -def instance_tls_ca_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_cert(field, value): - return get_default_field_value(field, value) - - -def instance_tls_ignore_warning(field, value): +def instance_tls_ignore_warning(): return False -def instance_tls_private_key(field, value): - return get_default_field_value(field, value) - - -def instance_tls_protocols_allowed(field, value): - return get_default_field_value(field, value) - - -def instance_tls_use_host_header(field, value): +def instance_tls_use_host_header(): return False -def instance_tls_verify(field, value): +def instance_tls_verify(): return True -def instance_use_legacy_auth_encoding(field, value): +def instance_use_legacy_auth_encoding(): return True - - -def instance_username(field, value): - return get_default_field_value(field, value) diff --git a/unifi_console/datadog_checks/unifi_console/config_models/instance.py b/unifi_console/datadog_checks/unifi_console/config_models/instance.py index 31f2d99336..f7f3ab70a1 100644 --- a/unifi_console/datadog_checks/unifi_console/config_models/instance.py +++ b/unifi_console/datadog_checks/unifi_console/config_models/instance.py @@ -5,9 +5,10 @@ from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence +from types import MappingProxyType +from typing import Any, Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,98 +17,100 @@ class AuthToken(BaseModel): - class Config: - allow_mutation = False - - reader: Optional[Mapping[str, Any]] - writer: Optional[Mapping[str, Any]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + reader: Optional[MappingProxyType[str, Any]] = None + writer: Optional[MappingProxyType[str, Any]] = None class MetricPatterns(BaseModel): - class Config: - allow_mutation = False - - exclude: Optional[Sequence[str]] - include: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + exclude: Optional[tuple[str, ...]] = None + include: Optional[tuple[str, ...]] = None class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class InstanceConfig(BaseModel): - class Config: - allow_mutation = False - - allow_redirects: Optional[bool] - auth_token: Optional[AuthToken] - auth_type: Optional[str] - aws_host: Optional[str] - aws_region: Optional[str] - aws_service: Optional[str] - connect_timeout: Optional[float] - disable_generic_tags: Optional[bool] - empty_default_hostname: Optional[bool] - extra_headers: Optional[Mapping[str, Any]] - headers: Optional[Mapping[str, Any]] - kerberos_auth: Optional[str] - kerberos_cache: Optional[str] - kerberos_delegate: Optional[bool] - kerberos_force_initiate: Optional[bool] - kerberos_hostname: Optional[str] - kerberos_keytab: Optional[str] - kerberos_principal: Optional[str] - log_requests: Optional[bool] - metric_patterns: Optional[MetricPatterns] - min_collection_interval: Optional[float] - ntlm_domain: Optional[str] - password: Optional[str] - persist_connections: Optional[bool] - proxy: Optional[Proxy] + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + allow_redirects: Optional[bool] = None + auth_token: Optional[AuthToken] = None + auth_type: Optional[str] = None + aws_host: Optional[str] = None + aws_region: Optional[str] = None + aws_service: Optional[str] = None + connect_timeout: Optional[float] = None + disable_generic_tags: Optional[bool] = None + empty_default_hostname: Optional[bool] = None + extra_headers: Optional[MappingProxyType[str, Any]] = None + headers: Optional[MappingProxyType[str, Any]] = None + kerberos_auth: Optional[str] = None + kerberos_cache: Optional[str] = None + kerberos_delegate: Optional[bool] = None + kerberos_force_initiate: Optional[bool] = None + kerberos_hostname: Optional[str] = None + kerberos_keytab: Optional[str] = None + kerberos_principal: Optional[str] = None + log_requests: Optional[bool] = None + metric_patterns: Optional[MetricPatterns] = None + min_collection_interval: Optional[float] = None + ntlm_domain: Optional[str] = None + password: Optional[str] = None + persist_connections: Optional[bool] = None + proxy: Optional[Proxy] = None pwd: str - read_timeout: Optional[float] - request_size: Optional[float] - service: Optional[str] - site: Optional[str] - skip_proxy: Optional[bool] - tags: Optional[Sequence[str]] - timeout: Optional[float] - tls_ca_cert: Optional[str] - tls_cert: Optional[str] - tls_ignore_warning: Optional[bool] - tls_private_key: Optional[str] - tls_protocols_allowed: Optional[Sequence[str]] - tls_use_host_header: Optional[bool] - tls_verify: Optional[bool] + read_timeout: Optional[float] = None + request_size: Optional[float] = None + service: Optional[str] = None + site: Optional[str] = None + skip_proxy: Optional[bool] = None + tags: Optional[tuple[str, ...]] = None + timeout: Optional[float] = None + tls_ca_cert: Optional[str] = None + tls_cert: Optional[str] = None + tls_ignore_warning: Optional[bool] = None + tls_private_key: Optional[str] = None + tls_protocols_allowed: Optional[tuple[str, ...]] = None + tls_use_host_header: Optional[bool] = None + tls_verify: Optional[bool] = None url: str - use_legacy_auth_encoding: Optional[bool] + use_legacy_auth_encoding: Optional[bool] = None user: str - username: Optional[str] + username: Optional[str] = None version: str - @root_validator(pre=True) + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_instance', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'instance_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'instance_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'instance_{info.field_name}', lambda: value)() - return getattr(validators, f'instance_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_instance', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_instance', identity)(model)) diff --git a/unifi_console/datadog_checks/unifi_console/config_models/shared.py b/unifi_console/datadog_checks/unifi_console/config_models/shared.py index 610c4e57ca..da933d6d8a 100644 --- a/unifi_console/datadog_checks/unifi_console/config_models/shared.py +++ b/unifi_console/datadog_checks/unifi_console/config_models/shared.py @@ -5,9 +5,9 @@ from __future__ import annotations -from typing import Optional, Sequence +from typing import Optional -from pydantic import BaseModel, root_validator, validator +from pydantic import BaseModel, ConfigDict, field_validator, model_validator from datadog_checks.base.utils.functions import identity from datadog_checks.base.utils.models import validation @@ -16,41 +16,41 @@ class Proxy(BaseModel): - class Config: - allow_mutation = False - - http: Optional[str] - https: Optional[str] - no_proxy: Optional[Sequence[str]] + model_config = ConfigDict( + arbitrary_types_allowed=True, + frozen=True, + ) + http: Optional[str] = None + https: Optional[str] = None + no_proxy: Optional[tuple[str, ...]] = None class SharedConfig(BaseModel): - class Config: - allow_mutation = False - - proxy: Optional[Proxy] - service: Optional[str] - skip_proxy: Optional[bool] - timeout: Optional[float] - - @root_validator(pre=True) + model_config = ConfigDict( + validate_default=True, + arbitrary_types_allowed=True, + frozen=True, + ) + proxy: Optional[Proxy] = None + service: Optional[str] = None + skip_proxy: Optional[bool] = None + timeout: Optional[float] = None + + @model_validator(mode='before') def _initial_validation(cls, values): return validation.core.initialize_config(getattr(validators, 'initialize_shared', identity)(values)) - @validator('*', pre=True, always=True) - def _ensure_defaults(cls, v, field): - if v is not None or field.required: - return v - - return getattr(defaults, f'shared_{field.name}')(field, v) - - @validator('*') - def _run_validations(cls, v, field): - if not v: - return v + @field_validator('*', mode='before') + def _validate(cls, value, info): + field = cls.model_fields[info.field_name] + field_name = field.alias or info.field_name + if field_name in info.context['configured_fields']: + value = getattr(validators, f'shared_{info.field_name}', identity)(value, field=field) + else: + value = getattr(defaults, f'shared_{info.field_name}', lambda: value)() - return getattr(validators, f'shared_{field.name}', identity)(v, field=field) + return validation.utils.make_immutable(value) - @root_validator(pre=False) - def _final_validation(cls, values): - return validation.core.finalize_config(getattr(validators, 'finalize_shared', identity)(values)) + @model_validator(mode='after') + def _final_validation(cls, model): + return validation.core.check_model(getattr(validators, 'check_shared', identity)(model))